3D-Grafik Java3D QuadArrays beleuchten

G

GlochFile

Gast
Hallo.Ich hab grad irgendwie ein Brett vor'm Kopf,
ich beschäftige mich seit einer Weile mit Java3D
und bin grad bei der Terraingenerierung mit QuadArrays.
Eine 2-Dimensionale Map m*n durch die ich lauf,und
3 Eckpunkte(pt0,pt1,pt3) von den QuadArrays daneben übernehm und den 4.Eckpunkt(pt2)
zufällig bestimme.Das klappt eig. ohne Probleme.

Ich speicher grad noch die höhenpositionen der Eckpunkte in einem anderen Array,
anstatt das mit Picking zu machen,weil ich mich mit Picking auch noch nicht so gut auskenn!:(

Ich kann auch gern noch mehr vom code posten,wenns hilft!!!

Allerdings hab ich gemerkt,wenn ich jetzt eine Appearance und Textur draufknall,
ist zwar die Textur auf jedem QuadArray zu sehen,aber Licht reflektieren sie überhaupt nicht...
Weiß jemand woran das vielleicht liegt?


Java:
  Random r = new Random();
  QuadArray[][] polygon = new QuadArray[5][5];	//Eine quadratische 2-Dimensionale Map
							                //Die aus QuadArrays besteht
  float[][][] pos = new float[5][5][4];
  float pt0,pt1,pt2,pt3;

  float heightQuad=2.0f;
  float widthQuad=2.0f;
  float xposTerrain=-((polygon[0].length*widthQuad)/2);
  float yposTerrain=-((polygon.length*heightQuad)/2);


...

  //In der Methode createSceneGraph() die vom Konstruktor aufgerufen wird:
*** Appearance ***

    Color3f ambientColour = new Color3f(0.3f,0.3f,0.0f);	
    Color3f emissiveColour = new Color3f(0.5f,0.5f,0.0f); 
    Color3f diffuseColour = new Color3f(0.7f,0.7f,0.0f);  
    Color3f specularColour = new Color3f(0.9f,0.9f,0.0f); 

    Appearance app = new Appearance();

    app.setMaterial(new Material(ambientColour,emissiveColour,
                           diffuseColour,specularColour,20.0f));

    app.setTexture((new TextureLoader("leaves.jpg",null)).getTexture());

    app.setTexCoordGeneration(new TexCoordGeneration
    (TexCoordGeneration.OBJECT_LINEAR,TexCoordGeneration.TEXTURE_COORDINATE_3));
										
    app.setTextureAttributes(new TextureAttributes
    (TextureAttributes.MODULATE,new Transform3D(),new Color4f(),TextureAttributes.NICEST));

    app.setPolygonAttributes(new PolygonAttributes
    (PolygonAttributes.POLYGON_FILL,PolygonAttributes.CULL_BACK,0));

    ColoringAttributes ca = new ColoringAttributes();
    ca.setShadeModel(ca.SHADE_FLAT);
    app.setColoringAttributes(ca);

*** Objekte ***

	for(int m=0;m<polygon[0].length;m++){
	  for(int n=0;n<polygon.length;n++){

	   try{
	    pt0=pos[n][m-1][1];
	    pt1=pos[n-1][m][2];
	    pt2=r.nextFloat()*1.3f;
	    pt3=pos[n][m-1][2];
	  }catch(Exception e){}


	    pos[n][m][0] = pt0;				//Speicher die Positionen des aktuellen Quads im Array
	    pos[n][m][1] = pt1;
	    pos[n][m][2] = pt2;
	    pos[n][m][3] = pt3;

	    polygon[n][m] = new QuadArray (4, QuadArray.COORDINATES | QuadArray.NORMALS);
	    polygon[n][m].setCoordinate(0, new Point3f (xposTerrain+(m*widthQuad),           yposTerrain+(n*heightQuad),    pos[n][m][0]));	//Die Stellen wo sie anliegen,sollen sie
	    polygon[n][m].setCoordinate(1, new Point3f (xposTerrain+(m*widthQuad)+widthQuad, yposTerrain+(n*heightQuad),    pos[n][m][1]));		//von den anderen übernehmen!
	    polygon[n][m].setCoordinate(2, new Point3f (xposTerrain+(m*widthQuad)+widthQuad,yposTerrain+(n*heightQuad)+heightQuad, pos[n][m][2]));
	    polygon[n][m].setCoordinate(3, new Point3f (xposTerrain+(m*widthQuad),           yposTerrain+(n*heightQuad)+heightQuad, pos[n][m][3]));

	      theScene.addChild(new Shape3D(polygon[n][m],app));


...


  //Die Methode wird auch im Konstruktor aufgerufen um Licht zu erzeugen
  public void addLight(SimpleUniverse su)
  {

    BranchGroup bgLight = new BranchGroup();
    BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 1000.0);

    PointLight light1=new PointLight(new Color3f(0f,8f,0f),new Point3f
    (-1.0f,0.3f,3.6f),new Point3f(0.0f,0.0f,0.0f));			
    light1.setInfluencingBounds(bounds);

    bgLight.addChild(light1);
    su.addBranchGraph(bgLight);
  }
 
G

GlochFile

Gast
Hm,ja.
ok,das klingt logisch. :)
mir fehlen also die Normals...
Es funktioniert aber irgendwie immer noch nicht.

Ich hab mir das Beispiel angeschaut, aber
Man muss ja noch der GeometryInfo die Stripcounts,
contourcounts und coordinates setzen.
Aber ich komm irgendwie net weiter,
weil ich nicht genau weiß wie ich das
machen soll.
Tschuldigung aber ich versteh das nicht ganz,
und ob das so richtig ist,wie ich es mache:


Java:
             int[] stripCounts;
             int[] contourCounts;
             Point3f[] pts;

...

             //In der createSceneGraph-Methode
    for(int m=0;m<polygon[0].length;m++){
      for(int n=0;n<polygon.length;n++){
 
       try{
        pt0=pos[n][m-1][1];
        pt1=pos[n-1][m][2];
        pt2=r.nextFloat()*1.3f;
        pt3=pos[n][m-1][2];
      }catch(Exception e){}
 
        pos[n][m][0] = pt0;             //Speicher die Positionen des aktuellen Quads im Array
        pos[n][m][1] = pt1;
        pos[n][m][2] = pt2;
        pos[n][m][3] = pt3;
 
        polygon[n][m] = new QuadArray (4, QuadArray.COORDINATES | QuadArray.NORMALS);
        polygon[n][m].setCoordinate(0, new Point3f (xposTerrain+(m*widthQuad),           yposTerrain+(n*heightQuad),    pos[n][m][0])); //Die Stellen wo sie anliegen,sollen sie
        polygon[n][m].setCoordinate(1, new Point3f (xposTerrain+(m*widthQuad)+widthQuad, yposTerrain+(n*heightQuad),    pos[n][m][1]));     //von den anderen übernehmen!
        polygon[n][m].setCoordinate(2, new Point3f (xposTerrain+(m*widthQuad)+widthQuad,yposTerrain+(n*heightQuad)+heightQuad, pos[n][m][2]));
        polygon[n][m].setCoordinate(3, new Point3f (xposTerrain+(m*widthQuad),           yposTerrain+(n*heightQuad)+heightQuad, pos[n][m][3]));



//********
             //Der neue Teil in dem ich die Normals für jedes neue
             //QuadArray generiere:
             stripCounts=new int[1];	
             contourCounts=new int[1];
             pts=new Point3f[4];	

             stripCounts[0]=4;	//Für jedes neue QuadArray stripcounts 4 da 4 Ecken
             contourCounts[0]=1;	//und contourcounts 1 da eine Umrandung.

             for (int i=0;i<pts.length;i++)
             {
               pts[i]=new Point3f(xposTerrain+(m*widthQuad),yposTerrain+(n*heightQuad),pos[n][m][i]);
             }

             GeometryInfo gi = new GeometryInfo(GeometryInfo.POLYGON_ARRAY);

             gi.setCoordinates(pts);
             gi.setStripCounts(stripCounts);
             gi.setContourCounts(contourCounts);

             NormalGenerator ng = new NormalGenerator();
             ng.generateNormals(gi);
             // stripify
             Stripifier st = new Stripifier();
             st.stripify(gi);
             GeometryArray result = gi.getGeometryArray();

            new Shape3D(polygon[n][m],app).setGeometry(gi.getGeometryArray());
	    theScene.addChild(new Shape3D(polygon[n][m],app));
 
G

GlochFile

Gast
Ha,ok!
Problem hat sich gelöst.^^
Erledigt.
Danke für den Tipp!!!
Wie konnt ich des bloß überseh'n...

Ich hätt nur noch'n Array aus Vectoren3f gebraucht
und später in der m*n Schleife generateNormals();

Danke!

Java:
  Vector3f[] myNormals = {
    new Vector3f(0.0f,1.0f,0.0f),
    new Vector3f(0.0f,1.0f,0.0f),
    new Vector3f(0.0f,1.0f,0.0f),
    new Vector3f(0.0f,1.0f,0.0f),
  };

...


	    polygon[n][m].setNormals( 0, myNormals );
 

Marco13

Top Contributor
Irgendwie bezweifle ich, dass das das ist, was du eigentlich wolltest, aber wenn's zufriedenstellend funktioniert, ist ja alles OK.
 

Ähnliche Java Themen

Neue Themen


Oben