# Problem mit QuadArray.



## Creativ (23. Mrz 2008)

Hi,
bin gerade dabei Java3D zu lernen und wollte jetzt einfach mal ein kleines Rechteck anzeigen lassen.
Dazu wollte ich dann ein QuadArray benutzen.

Habe dazu dann folgende Methode geschrieben:

```
private Geometry lGeometry() {
		QuadArray qa;
		Point3f coords[] = new Point3f[4];
		Color3f colors[] = new Color3f[4];
		
		
		coords[0] = new Point3f(0.4f,0.4f,-0.2f);
		coords[1] = new Point3f(0.4f,0.4f,-0.2f);
		coords[2] = new Point3f(-0.4f,0.4f,-0.2f);
		coords[3] = new Point3f(-0.4f,0.4f,-0.2f);
		
		for(int i=0;i<4;i++) {
			colors[i] = new Color3f(1.0f,0.0f,0.0f);
		}
		
		qa = new QuadArray(4,QuadArray.COORDINATES | QuadArray.COLOR_3);
		
		qa.setCoordinates(0, coords);
		qa.setColors(0, colors);
		return qa;
	}
```


Diese Funktion wird in einer anderen Funktion folgendermaßen verwendet:

```
bg = new BranchGroup();
Appearance appear = new Appearance();
Shape3D figure = new Shape3D(lGeometry());
		figure.setAppearance(appear);
		bg.addChild(figure);
bg.compile();
```

Die Branchgroup wird dann zurückgegeben und dem SceneGraph hinzugefügt.
Mit anderen Figuren hatte das auch alles funktioniert (lerne Java3D nach dem Sun-Tutorial und hatte daher das Yoyo gemacht), nur mit dem Rechteck will das nicht.

Es ist einfach alles schwarz.
Kann mir irgendwer dabei helfen und sagen was ich falsch mache?

Gruß,
Dennis


----------



## Marco13 (23. Mrz 2008)

Wenn alles schwarz ist, dann KANN (!!!) das auch als Ursache haben, dass man ins Nirvana guckt (also z.B. entlang der Negativen z-Achse, obwohl das Objekt entlang der positiven z-Achse liegt). Aber es KANN(!!!) auch andere Gründe haben. Ich würde dir empfehlen, dir irgendwo ein Compilierbares, fertiges Beispiel zu suchen, wo man schon "etwas sieht", das dann als Ausgangspunkt zu verwenden, und dieses "etwas" dann durch deinen QuadArray zu ersetzen...


----------



## Illuvatar (23. Mrz 2008)

Ähm... sind deine Koordinaten 1 und 2 bzw. 3 und 4 absichtlich identisch?


----------



## Marco13 (23. Mrz 2008)

:lol: OK, ich geb zu , das KANN nicht nur ein Grund dafür sein, dass man nichts sieht, sondern IST definitiv einer


----------



## Creativ (23. Mrz 2008)

Hi,
Danke erstmal für eure Antworten  

Habs jetzt hingekriegt. Lag scheinbar an den Punkten. Habe die jetzt zu den folgenden Koordinaten geändert:

```
coords[0] = new Point3f(0.0f,0.0f,0.0f);
		coords[1] = new Point3f(0.4f,0.0f,0.0f);
		coords[2] = new Point3f(0.0f,0.4f,0.0f);
		coords[3] = new Point3f(0.4f,0.4f,0.0f);
```

Jetzt wirds auch angezeigt, aber man sieht nur ein Dreieck, wie man hier sieht:




Aber eigt. sollte ja ein Rechteck angezeigt werden. Wenn ich jetzt das Dreieck drehe sieht das so aus:




Also es wird einfach die andere Hälfte des Rechtecks angezeigt.
Wieso?

Das müsste doch irgendwie mit den Farben zusammenhängen, oder?
Ich gebe weiterhin jeden Punkt die Farbe Rot.

Gruß,
Dennis


----------



## Illuvatar (23. Mrz 2008)

Das hängt mit dem sog. Culling zusammen. Im Normalfall wird nämlich immer nur die Vorderseite von einem Polygon angezeigt (Vorderseite = in der Reihenfolge in der die Punkte angegeben wurden sind die Punkte von vorne gesehen gegen den Uhrzeigersinn angeordnet).
Da die Koordinaten von deinem Quadrat ziemlich durcheinander sind (mal dirs mal auf, wenn du die Punkte in der Reihenfolge verbinden willst musst du über die Diagonalen gehen) kommt eben dieses Ergebnis zustande.
Lösungen:
a) in den PolygonAttributes CULL_NONE einstellen
b) die Punkte "der Reihe nach", und in der richtigen Richtung angeben. D.h. 0/0 - 4/0 - 4/4 - 0/4


----------



## Creativ (23. Mrz 2008)

Ahh...ok, Danke!

Wieder was gelernt


----------



## Creativ (24. Mrz 2008)

Hab doch nochmal eine Frage  

Und zwar folgendes:

Ich habe mir jetzt aus Spaß mal ein L in 3D gebastelt. Funktioniert auch alles, aber das ist alles recht unübersichtlich und ich bin mir jetzt nicht ganz sicher wie ich am besten den Code verkürze.

Ich habe für jede Seite folgenden Code ausgeführt:


```
coords[0] = new Point3f(0.4f,0.2f,-0.1f);
		coords[1] = new Point3f(0.4f,0.2f,0.1f);
		coords[2] = new Point3f(0.4f,0.0f,0.1f);
		coords[3] = new Point3f(0.4f,0.0f,-0.1f);
		
		for(int i=0;i<4;i++) {
			colors[i] = new Color3f(1.0f,1.0f,.0f);
		}
		
		qa = new QuadArray(4,QuadArray.COORDINATES | QuadArray.COLOR_3);
		
		qa.setCoordinates(0, coords);
		qa.setColors(0, colors);
		
		shape.addGeometry(qa);
```

Die Koordinaten und die Farben natürlich jeweils angepasst.
Jetzt habe ich diesen teil 11x, also für jede Seite einmal.

Muss man das wirklich 11x machen, oder gibts da einen kürzeren Weg? Geht das z.B. irgendwie mit IndexedGeometryArray?

Vielen Dank schonmal!

Gruß,
Dennis

Edit: Man kann bestimmt auch einen Cube verwenden, aber ich würde es trotzdem gerne so zum üben lösen.


----------



## Marco13 (24. Mrz 2008)

Ja, so kommt ja jeder Punkt ca. 3 mal vor - ist schon aufwändig. Du kannst stattdessen einen IndexedGeometrArray (also IndexedQuadArray oder IndexedTriangleArray) verwenden. Ein Beispiel gibt's hier
http://www.java-tips.org/other-api-...e-the-subclasses-of-indexedgeometryarray.html

Damit kannst du 
1. alle Punkte, aus denen das "L" besteht, mit setCoordinates übergeben
2. die Flächen (drei- oder vierecke) mit jeweils 3 oder 4 aufeinanderfolgenden indizes definieren, die mit setCoordinateIndices übergeben werden


----------



## Creativ (24. Mrz 2008)

Hi,

Vielen Dank!
Habe das jetzt mit dem IndexedQuadArray gemacht und hat auch perfekt funktioniert  

Gruß,
Dennis


----------

