Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[java3D] snijdende vlakken

Pagina: 1
Acties:

  • losealot
  • Registratie: November 2003
  • Laatst online: 09-05-2022
Ik probeer in java het volgende te verwezelijken: Het renderen van 3 snijdende vlakken met behulp van Java3D. De vlakken snijden elkaar middendoor. Maw: de snijlijn van 2 vlakken valt telkens samen met de "as" van het xyz assenstelsel. Het snijpunt van de 3 vlakken is het 0-punt.

Mijn vlak is een Shape3D object met als geometry een QuadArray waar ik dan het gewenste texture op plak. In dit geval voorlopig een groene, rode of zwarte BufferedImage.

Alles loopt goed, hij rendert iets op mijn scherm en ik kan het met mijn muis draaien. Het probleem is dat er "iets" fout loopt:
Afbeeldingslocatie: http://i136.photobucket.com/albums/q175/losealot/planes.png

Het lijkt dus alsof hij altijd het rode vlak volledig toont met daar achter het groene en daar achter het zwarte vlak ipv rekening te houden met hun posities en hun snijlijnen. Heeft er iemand een idee wat er fout loopt? Indien nodig kan ik wat code posten waarin de objecten aangemaakt worden.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15-11 11:40

Janoz

Moderator Devschuur®

!litemod

Een stukje code zou niet misstaan, maar over je probleem. Waarschijnlijk teken je eerst het zwarte vlak, daarna het groene en daarna het rode. ZOlang je niks aangeeft is dit precies het resultaat.

Je zult aan moeten geven wat er met de diepte moet gebeuren. Een handig startpunt mbt zoeken is Z-buffer.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Wat er waarschijnlijk gebeurt is dat je polygonen op Z-order gesorteerd worden (van veraf naar dichtbij) en in die volgorde getekend worden. Zoals je zelf ook kunt zien gaat dat fout wanneer een vlak deels achter een ander vlak ligt en deels ervoor.
Janoz schreef op maandag 13 oktober 2008 @ 19:58:
Je zult aan moeten geven wat er met de diepte moet gebeuren. Een handig startpunt mbt zoeken is Z-buffer.
Dat is 1 mogelijkheid, inderdaad. Bedenk wel dat de snijdende lijn mogelijk op een zaagtand kan gaan lijken i.v.m. de gevoeligheid van je Z-buffer.

De andere mogelijkheid is dat je elk vierkant over de snijdende lijnen opsplitst in 4 kleinere vierkanten, zodat elk vierkant geen anderen snijdt, maar alleen nog maar raakt. In dat geval gaat de Z-ordering wel goed (elk vierkant ligt dan immers of voor, of achter, of op hetzelfde vlak als een ander vierkant), met als gevolg dat je scene wel correct gerenderd wordt. :)

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Gewoon een z-bufer gebruiken; begin er maar niet aan om alle polygonen op te delen zodat ze niet overlappen en dan te sorteren op diepte etc. Dat is (imho) echt iets uit de jaren 80 :)

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Zoijar schreef op maandag 13 oktober 2008 @ 20:35:
Gewoon een z-bufer gebruiken; begin er maar niet aan om alle polygonen op te delen zodat ze niet overlappen en dan te sorteren op diepte etc. Dat is (imho) echt iets uit de jaren 80 :)
:D Ik ben misschien een beetje oldschool...

Maar bij mijn weten hebben de meeste meshes geen snijdende vlakken, behalve als ze botsen. En in zo'n geval wil je inderdaad niet on-the-fly gaan lopen knippen in je polygons, dan ben je sneller klaar met een z-buffer.

Maar in dit triviale geval, waar het snijden van vlakken juist het doel van je scene is kan ik me voorstellen dat je juist wel wil gaan knippen. Maar goed, dat moet TS maar voor zichzelf uitmaken. :)

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Ik denk dat je waarschijnlijk meer response krijgt door deze vraag te stellen in het Sun Java3D forum: http://forums.sun.com/forum.jspa?forumID=21

Na het doorbladeren van de Java3D tutorial, vraag ik me af of je niet voor ieder object (BranchGroup) een Universe hebt gemaakt die naar dezelfde Canvas3D schrijven, in plaats van je BranchGroups aan dezelfde Universe toe te voegen.

[ Voor 44% gewijzigd door Remus op 13-10-2008 21:14 . Reden: Tutorial doorbladeren ]


  • losealot
  • Registratie: November 2003
  • Laatst online: 09-05-2022
Bedankt voor de reply's. Ik ga even google raadplegen ivm die z-buffer.

@ remus: nee ik heb maar 1 universe. Dit is de code waar ik men BG aanmaak:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
      BranchGroup scene = new BranchGroup();//algemene scene
      
      Transform3D transform = new Transform3D();
      
      //basis element waar we de planes aan gaan toevoegen en die we kunnen roteren
      transform.setTranslation(new Vector3f(0.0f, 0.0f, -1.0f));
      TransformGroup TG0 = new TransformGroup(transform);
      //nodig voor het roteerbaar maken
      TG0.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
      TG0.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
      scene.addChild(TG0);

      //eerste vlak
      transform.setTranslation(new Vector3f(0.0f, 0.0f, 0.0f));
      TG1 = new TransformGroup(transform);

      //tweede vlak
      transform.rotX(-Math.PI/2);
      TG2 = new TransformGroup(transform);

      //derde vlak
      TG3 = new TransformGroup(transform);
      transform.rotX(Math.PI/2);
      transform.rotY(-Math.PI/2);
      TG4 = new TransformGroup(transform);

      //eerste vlak toevoegen + texturedPlane aan vlak toevoegen
      TG0.addChild(TG1);
      TexturedPlane tp1 = new TexturedPlane(v.getSx());
      TG1.addChild(tp1);

      //zelfde voor tweede vlak
      TG0.addChild(TG2);
      TexturedPlane tp2 = new TexturedPlane(v.getSy());
      TG2.addChild(tp2);

      //en het derde
      TG0.addChild(TG3);
      TG3.addChild(TG4);
      TexturedPlane tp3 = new TexturedPlane(v.getSz());
      TG4.addChild(tp3);

      //achtergrond instellen
      Background background = new Background();
      background.setColor(1.0f, 1.0f, 1.0f);
      background.setApplicationBounds(new BoundingSphere());
      scene.addChild(background);
      
      //roteerbaar met de muis maken
      MouseRotate myMouseRotate = new MouseRotate();
      myMouseRotate.setTransformGroup(TG0);
      myMouseRotate.setSchedulingBounds(new BoundingSphere());
      scene.addChild(myMouseRotate);


TexturedPlane is een zelfgeschreven klasse die Shape3D extend en de juiste texture op de figuur plakt

[ Voor 2% gewijzigd door losealot op 14-10-2008 12:43 . Reden: java toegevoegd aan de code tag ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14-11 23:57

.oisyn

Moderator Devschuur®

Demotivational Speaker

Staat de visibility policy van de View instance wel op VISIBILITY_DRAW_VISIBLE?

En niet om 't een of ander, maar een plane, oftewel "vlak" in het Nederlands, heeft per definitie geen randen. Jij bedoelt waarschijnlijk een square (4 rechte hoeken, 4 gelijke zijden), rectangle (4 rechte hoeken), quadrilateral (4 hoeken) of polygon (n hoeken), afhankelijk van hoe generiek je "TexturedPlane" is :)

[ Voor 10% gewijzigd door .oisyn op 14-10-2008 00:00 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • losealot
  • Registratie: November 2003
  • Laatst online: 09-05-2022
Net even gecheckt en de policy staat goed.

Ik heb een pdf gevonden (http://www.mat.uniroma2.i...D/Java_3D_Programming.pdf) waar ze het op pagina 18 over hetzelfde probleem hebben (piercing) maar ik zie niet direct een oplossing staan.

Ik vrees dat er niets anders zal opzitten dan inderdaad de vierkanten op te splitsen

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15-11 11:40

Janoz

Moderator Devschuur®

!litemod

Misschien moet je toch ietsje beter lezen (in het boek, en in het topic en zeker de combinatie!) aangezien het paragraafje na het door jou aangehaalde stuk over de Z-buffer gaat.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
losealot schreef op dinsdag 14 oktober 2008 @ 10:16:
Net even gecheckt en de policy staat goed.

Ik heb een pdf gevonden (http://www.mat.uniroma2.i...D/Java_3D_Programming.pdf) waar ze het op pagina 18 over hetzelfde probleem hebben (piercing) maar ik zie niet direct een oplossing staan.

Ik vrees dat er niets anders zal opzitten dan inderdaad de vierkanten op te splitsen
Het gaat inderdaad over dit probleem, maar het is opgenomen in een hoofdstuk waar wordt beschreven hoe je 3D dingen doet zonder Java3D.

Ik heb nog nooit iets gedaan met Java 3D, maar ik kan me voorstellen dat je probleem ook voor kan komen uit bounding issues of de locatie van de viewer.

Ik ga vanavond nog even stoeien hiermee, want het sluit aan bij een vakje waar ik nu mee bezig ben :)

  • losealot
  • Registratie: November 2003
  • Laatst online: 09-05-2022
Janoz schreef op dinsdag 14 oktober 2008 @ 10:32:
Misschien moet je toch ietsje beter lezen (in het boek, en in het topic en zeker de combinatie!) aangezien het paragraafje na het door jou aangehaalde stuk over de Z-buffer gaat.
Uit wat ik begrepen heb staan alle opties met betrekking tot het gebruik van de z-buffer standaard aan. Ik heb ook niet direct een idee hoe ik met de hand de Z-buffer kan aanpassen in Java 3D. Ik heb net een hint gekregen om eens naar de Raster klasse te kijken.

Het zijn inderdaad geen echte planes maar Shape3D objecten met een QuadArray in.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14-11 23:57

.oisyn

Moderator Devschuur®

Demotivational Speaker

Gebruik je toevallig alpha-blended polygonen? Zo ja, niet doen (de alpha is namelijk 1 gezien je plaatje, dus het overcompliceert de boel alleen maar). Als je toch wel alphablended polygonen voor iets anders wilt gebruiken is het vast wel mogelijk om op een of andere manier in te stellen dat ze ook naar de depth buffer moeten schrijven, wat by default geloof ik niet gebeurt.

.edit: kun je sowieso eens de source van je TexturedPlane posten, en ook het stukje waar je de hele VirtualWorld en View etc. opzet.

[ Voor 15% gewijzigd door .oisyn op 14-10-2008 12:03 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • losealot
  • Registratie: November 2003
  • Laatst online: 09-05-2022
TexturedPlane:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/**
 * TexturedPlane creates a single plane with texture mapping.
 */
  public class TexturedPlane extends Shape3D{
    private SlicePanel p;
    TexturedPlane(SlicePanel p) {
        this.p=p;
        if (NewTextureLoader.getImageObserver() == null)
            System.out.println("call NewTextureLoader.setImageObserver()");
        this.setGeometry(createGeometry());
        this.setAppearance(createAppearance());
        setCapability(Shape3D.ALLOW_APPEARANCE_READ);
    }    

    private Geometry createGeometry(){

        QuadArray plane = new QuadArray(4, GeometryArray.COORDINATES
                                           | GeometryArray.TEXTURE_COORDINATE_2
                            );

        Point3f p = new Point3f(-1.0f,  1.0f,  0.0f);
        plane.setCoordinate(0, p);
        p.set(-1.0f, -1.0f,  0.0f);
        plane.setCoordinate(1, p);
        p.set(1.0f, -1.0f,  0.0f);
        plane.setCoordinate(2, p);
        p.set(1.0f,  1.0f,  0.0f);
        plane.setCoordinate(3, p);

        TexCoord2f q = new TexCoord2f( 0.0f,  1.0f);
        plane.setTextureCoordinate( 0, 0, q);
        q.set(0.0f, 0.0f);
        plane.setTextureCoordinate( 0, 1, q);
        q.set(1.0f, 0.0f);
        plane.setTextureCoordinate( 0, 2, q);
        q.set(1.0f, 1.0f);
        plane.setTextureCoordinate( 0, 3, q);

        return plane;
    }

    Appearance createAppearance() {

        Appearance appear = new Appearance();
        appear.setTexture(generateTexture(p.getImage()));

        appear.setTransparencyAttributes(
           new TransparencyAttributes(TransparencyAttributes.FASTEST, 0.1f));
        
        appear.setCapability(Appearance.ALLOW_TEXTURE_WRITE);
        
        return appear;
    }
    
    private Texture2D generateTexture(BufferedImage img){
        TextureLoader loader = new NewTextureLoader(img);
        ImageComponent2D image = loader.getImage();
        
        // can't use parameterless constuctor
        Texture2D texture = new Texture2D(Texture.BASE_LEVEL, Texture.RGBA,
                                          image.getWidth(), image.getHeight());
        texture.setImage(0, image);
        texture.setEnable(true);
        texture.setMagFilter(Texture.NICEST);
        return texture;
    }

  } // end of TexturedPlane class


code voor het opzetten van het universe. De code van de createScene methode staat in een vorige post.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
setLayout(new BorderLayout());
    GraphicsConfiguration config =
       SimpleUniverse.getPreferredConfiguration();

    Canvas3D canvas3D = new Canvas3D(config);
    add("Center", canvas3D);
    canvas3D.setStereoEnable(false);
    NewTextureLoader.setImageObserver(canvas3D);

    SimpleUniverse u = new SimpleUniverse(canvas3D);

    // This will move the ViewPlatform back a bit so the
    // objects in the scene can be viewed.
    u.getViewingPlatform().setNominalViewingTransform();

    u.addBranchGraph(createScene());

[ Voor 0% gewijzigd door losealot op 14-10-2008 12:42 . Reden: java toegevoegd aan de code tag ]


  • losealot
  • Registratie: November 2003
  • Laatst online: 09-05-2022
Probleem opgelost door
Java:
1
appear.setTransparencyAttributes(new TransparencyAttributes(TransparencyAttributes.FASTEST, 0.1f));

in
Java:
1
appear.setTransparencyAttributes(new TransparencyAttributes(TransparencyAttributes.NONE, 0.0f));

te veranderen. Bedankt voor de tip .oisyn!
Pagina: 1