QuadArray color setzen

Status
Nicht offen für weitere Antworten.

Arnold

Mitglied
Hallo,

ich möchte einige QuadArrays in Java3D zeichnen und diese farblich ausfüllen.

Abschnitt, in dem die Farbe gesetzt werden soll:

Code:
...
Color3f red = new Color3f(1.0f, 0.0f, 0.0f);

		n=0;
		int quads = (nx-1)*(ny-1);
		QuadArray qa = new QuadArray(quads * 4, QuadArray.COORDINATES);
		for (int i=0; i<quads; i++) {
			int cornerIdx = i + (i/(nx-1));
			qa.setCoordinate(n++, points[cornerIdx]);
			qa.setColor(n++, red);
			qa.setCoordinate(n++, points[cornerIdx+1]);
			qa.setCoordinate(n++, points[cornerIdx+nx+1]);
			qa.setCoordinate(n++, points[cornerIdx+nx]);
		}
		
		Shape3D shp = new Shape3D(qa);
		shp.setAppearance(appear);
		group.addChild(shp);
...

In den "points" sind die Point3d gespeichert. So wie es zurzeit ist, bekomme ich beim Ausführen die Fehlermeldung:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: GeometryArray: has no colors


Wie muss ich die Farbe nun korrekt anlegen? Kann ich eigentlich für jeden Vertex eine Farbe vorgeben, sodass zwischen den Vertex dann ein Farbverlauf entsteht, oder muss ich dem QuadArray einen festen Farbwert geben?


Gruß Arnold
 

Arnold

Mitglied
oh ja, tschuldigung. Dachte das war eher eine "blöde" Frage (kenne mich leider noch nicht so sehr mit Java3D aus).

Also: einfach eine Zeile wie folgt ändern:

Code:
QuadArray qa = new QuadArray(quads * 4, QuadArray.COORDINATES | QuadArray.COLOR_3);

Das wars dann auch schon. Dann noch die Farbe für jeden einzelnen Punkt setzen, und es gibt, bei unterschiedlichen Farben, automatisch einen Farbverlauf.

Sieht bei mir dann wie folgt aus:

Code:
n=0;
		int quads = (nx-1)*(ny-1);
		QuadArray qa = new QuadArray(quads * 4, QuadArray.COORDINATES | QuadArray.COLOR_3);
		for (int i=0; i<quads; i++) {
			int cornerIdx = i + (i/(nx-1));
			
			double color1 = points[cornerIdx].z/distance;
			qa.setCoordinate(n++, points[cornerIdx]);
			qa.setColor(n-1, new Color3f((float)color1, (float)color1, 1.0f));
			
			double color2 = points[cornerIdx+1].z/distance;
			qa.setCoordinate(n++, points[cornerIdx+1]);
			qa.setColor(n-1, new Color3f((float)color2, (float)color2, 1.0f));
			
			double color3 = points[cornerIdx+nx+1].z/distance;
			qa.setCoordinate(n++, points[cornerIdx+nx+1]);
			qa.setColor(n-1, new Color3f((float)color3, (float)color3, 1.0f));
			
			double color4 = points[cornerIdx+nx].z/distance;
			qa.setCoordinate(n++, points[cornerIdx+nx]);
			qa.setColor(n-1, new Color3f((float)color4, (float)color4, 1.0f));
		}
		
		Shape3D shp = new Shape3D(qa);
		shp.setAppearance(appear);
		group.addChild(shp);
 

Arnold

Mitglied
Eine Frage hab ich allerdings noch: durch "PolygonAttributes.POLYGON_FILL" oder "PolygonAttributes.POLYGON_LINE" kann ich ja entweder Linien oder das gesamte Polygon farbig zeichnen.

Geht denn auch beides? Bisher hab ich quasi zwei QuadArrays übereinander gelegt, eines mit Füllung, eines mit Linien, aber da werden die Linien etwas seltsam gestrichelt dargestellt...
 

merlin2

Top Contributor
Ich glaube nicht - teste mal POLYGON_FILL&&POLYGON_LINE. :)
Ich verstehe den Sinn aber ehrlich gesagt nicht.
 

Arnold

Mitglied
Nein, das geht leider nicht. Es kann nur ein Argument übergeben werden.

Sinn des ganzen: dargestellt wird ein digitales Geländemodell (die Oberfläche wird mit einer BSpline-Fläche approximiert), da ist es ganz nett, zusätzlich zur (farblichen) Höheninformation die Gitterweite darzustellen.
 

Arnold

Mitglied
Mit Texturen kenn ich mich leider gar nicht aus.
Aber heißt das nicht einfach nur, dass ich dem QuadArray, also dem Polygon, anstatt des Farbverlaufes eine andere Oberfläche gebe? Dann müsste ich ja zig verschiedene anlegen, da eigentlich kein Farbverlauf im QuadArray dem anderen gleicht. Oder sehe ich das falsch?

Kann ich denn die Linienstärke des Polygons verändern?
 

merlin2

Top Contributor
Die Linienstärke kannst du nicht verändern, aber evtl. ein zweites Polygon anlegen, das zwar POLYGON_FILL verwendet, aber explizit ein dickeres Raster hat.
 

Arnold

Mitglied
Du meinst, für jeden "Strich" ein Polygon anlegen, das quasi einen dicken Strich darstellt?

Hmm... ich glauch, das wär mir dann doch zu aufwändig. Sollte als "Gimmick" gedacht sein, ist also nicht so schlimm, wenn es nicht ganz klappt. Geht eher um den theoretischen Hintergund, als die perfekte Darstellung. Und die Linien werden ja dargestellt, nur eben etwas dünn und gestrichelt.

Falls ich doch noch etwas Zeit habe (ist alles für eine Hausarbeit), dann probier ich noch ein wenig rum. Kenne mich doch ... sage natürlich Bescheid, falls ich ne andere Lösung finde.

Trotzdem schon mal vielen Dank fürs Grübeln!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Quadarray anmalen Spiele- und Multimedia-Programmierung 2
C Problem mit QuadArray. Spiele- und Multimedia-Programmierung 9
F QuadArray, Farbe auf beiden Seiten? Spiele- und Multimedia-Programmierung 4
H Change color on button event Spiele- und Multimedia-Programmierung 2
C LWJGL Color Picking Textures deaktivieren Spiele- und Multimedia-Programmierung 0
G JOGL Color stimmt nicht Spiele- und Multimedia-Programmierung 3
S JOGL Selection By Color Spiele- und Multimedia-Programmierung 3
A Hilfe bei der Methode COLOR (Java) Spiele- und Multimedia-Programmierung 10
G Farbig zeichnen ohne java.awt.Color? Spiele- und Multimedia-Programmierung 5
I Java Andere Fenster in Borderless-Mode setzen Spiele- und Multimedia-Programmierung 16
S Mehrere Steine gleichzeitig setzen und bewegen Spiele- und Multimedia-Programmierung 4
0x7F800000 Stroke breite absolut in px setzen? Spiele- und Multimedia-Programmierung 19
B Position der ViewingPlatform und Visueller Objekte setzen Spiele- und Multimedia-Programmierung 3
G Pixel setzen mit TYPE_INT_ARGB Spiele- und Multimedia-Programmierung 10
T Wie kann ich ein OrbitBehavior auf einen festen Wert setzen? Spiele- und Multimedia-Programmierung 2
S Koordinaten bestimmen und setzen Spiele- und Multimedia-Programmierung 2
F Hintergrundfarbe setzen mit setBackground() Spiele- und Multimedia-Programmierung 7
D Focus richtig setzen? Aber wie ? Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben