Box-ähnliches Gebilde erzeugen

Status
Nicht offen für weitere Antworten.

AMiGA

Bekanntes Mitglied
Hallo zusammen,

mein Ziel ist es, ein boxartiges Gebilde zu erzeugen, die Form ist relativ ähnlich. Allerdings ist die obere Fläche nicht eben, wie bei einer Box, sondern enthält zig unterschiedliche Höheninformationen. Es ist konkret die Darstellung eines gescannten Behälters, also können einige Sprünge in den Daten sein.

Bislang mache ich das ganze so: Zunächst erzeuge ich die obere Fläche: Ich habe für jeden einzelnen Rasterpunkt eine Höheninformation. Mit Hilfe eines QuadArrays erzeuge ich nun zwischen vier Rasterpunkten ein Quadrat in der entsprechenden Höhe. Danach erstelle ich die 4 Seiten des Behälters in ähnlicher Weise: Für jede x- bzw. y-Koordinate erzeuge ich einen Balken vom Boden bis zur entsprechenden Höhe. Bei 120x120 Rasterpunkten komme ich dann auf:

- obere Fläche: 120x120 = 14400 Objekte
- 4 Seiten: 4x120 = 480 Objekte
- Boden: 120 Objekte

Meine Frage ist nun, ob es nicht eine einfachere bzw. schönere Lösung gibt, als das ganze über QuadArrays zu lösen, die dann an eine Shape3D übergeben werden.

Gruß,
AMiGA
 

Illuvatar

Top Contributor
Also erstmal: normalerweise würde man das afaik über Bumpmaps lösen... aber die gibt es in J3D nicht ;)

Dennoch, die Menge deiner Objekte kannst du noch weit reduzieren. (Außerdem verstehe ich grade nicht, wieso der Boden 120 Objekte benötigt?) Sieh dir mal die IndexedGeometryArrays und die GeometryStripArrays an. Bei einem IndexedGeometryArray kannst du angeben, dass über einen Index für die Ecken der unterschiedlichen Quadrate die gleichen Tuple3Ds verwendet werden; bei einem GeometryStripArray werden für jedes Quadrat außer dem ersten nur 2 Punkte benötigt, und aus diesen beiden und den beiden Punkten davor das Quadrat gebildet.
 

AMiGA

Bekanntes Mitglied
Bei den GeometryStripArrays gibt es leider kein QuadArray, was ich nutzen könnte. Die IndexedGeometryArrays haben laut dem Java3D Tutorial von Sun wohl negative Auswirkungen auf die Performance. Mein Ziel war aber ja eigentlich, diese zu verbessern. Daher werde ich wohl die QuadArrays weiter nutzen.

Ich habe noch ein weiteres Problem: Wenn ich den Behälter als simple Box darstelle, wirken die Licht- und Appearance-Einstellungen, die ich vorgegeben habe. Wenn ich den Behälter wie oben beschrieben aus QuadArrays zeichne, sieht es aus, als würden die Lichteinstellungen gar nicht genutzt werden. Hat jemand eine Idee, wodran das liegt?

Gruß,
AMiGA
 

Illuvatar

Top Contributor
AMiGA hat gesagt.:
Die IndexedGeometryArrays haben laut dem Java3D Tutorial von Sun wohl negative Auswirkungen auf die Performance. Mein Ziel war aber ja eigentlich, diese zu verbessern. Daher werde ich wohl die QuadArrays weiter nutzen.

Huh? Wusst ich noch nicht...

Ich habe noch ein weiteres Problem: Wenn ich den Behälter als simple Box darstelle, wirken die Licht- und Appearance-Einstellungen, die ich vorgegeben habe. Wenn ich den Behälter wie oben beschrieben aus QuadArrays zeichne, sieht es aus, als würden die Lichteinstellungen gar nicht genutzt werden. Hat jemand eine Idee, wodran das liegt?

Gruß,
AMiGA

Du musst die Normalen generieren lassen.

Code:
NormalGenerator generator = new NormalGenerator();
GeometryInfo gInfo = new GeometryInfo(deinQuadArray);
generator.generateNormals(gInfo);
 

AMiGA

Bekanntes Mitglied
Huh? Wusst ich noch nicht...
Ich auch nicht. Ich zitiere mal aus dem Tutorial:

It is worth mentioning that there is a price to pay for the reuse of vertices provided by indexed geometry
– you pay for it in performance. The indexing of geometry at render time adds more work to the
rendering process. If performance is an issue, use strips whenever possible and avoid indexed geometry.
Indexed geometry is useful when speed is not critical and there is some memory to be gained through
indexing, or when indexing provides programming convenience.

Du musst die Normalen generieren lassen.
Ah, das wars. Dankeschön!

Gruß,
AMiGA
 

AMiGA

Bekanntes Mitglied
Ich habe leider direkt noch ein Problem: Ich würde gerne eine Textur auf das Gebilde legen. Die Textur lade ich über TextureLoader(...).getTexture() und füge sie mit appearance.setTexture() ein.

Sie erscheint aber leider nicht. Reicht es nicht, die Textur mit setTexture anzugeben?

Gruß,
AMiGA
 

AMiGA

Bekanntes Mitglied
Die Probleme hören leider nicht auf :(

Ich habe mittlerweile folgendes Problem: Wenn ich die 3D-Szene schließe (kommt in einem normalen 2D-GUI vor), bleiben noch jede Menge Objekte im Speicher, so dass beim zweiten Öffnen "java.lang.OutOfMemoryError: Java heap space" auftritt.

Beim Schließen der 3D-Szene rufe ich auf:

Code:
if(universe != null)
{
    universe.removeAllLocales();
    universe.cleanup();
    universe = null;
}

System.runFinalization();
System.gc();

Leider hat das keinen Einfluss auf die Größe des Heaps. Via JConsole kann man schön sehen, dass sie mehr oder weniger unverändert groß bleibt. Die J3D-Threads werden korrekt beendet. Lediglich der J3D-Renderer-1-Thread bleibt auch nach dem Schließen bestehen.

Hat jemand eine Idee, wie man den Speicher sauber aufräumt?

Edit:
Auch BranchGroup#removeAllChildren und #detach waren leider nicht von Erfolg gekrönt.

Hier kurz die Vorgehensweise, wie ich meine 3D-Szene aufbaue, vielleicht mache ich ja auch dort schon grundlegend etwas falsch:

Ich stelle mehrere (bis zu 50) der oben genannten Boxen dar, jede Box hat ihre eigenen Daten. Ich lese die Daten für jede Box über einen BufferedReader aus einer Datei ein und speichere sie für jede Box in einem Point3D[120][120] ab. Das ist der größte Datenanteil (die obere Seite der Box). Für jeden Punkt in diesem Array wird ein Point3D mit den Koordinaten erzeugt. Aus dem Point3D-Array wird ein QuadArray und später eine Shape3D erstellt.

Gruß,
AMiGA
 

AMiGA

Bekanntes Mitglied
Hat niemand eine Idee, wieso Java3D bei mir nicht sauber beendet wird und noch Müll im Speicher hinterlässt?

Gruß,
AMiGA
 

AMiGA

Bekanntes Mitglied
Ich schiebe das Thema nochmal hoch. Das Problem besteht leider immer noch.

Nachdem die Maske mit der 3D-Szene geschlossen wurde, wird der genutzte Speicher nicht wieder freigegeben.

Gruß,
AMiGA
 

AMiGA

Bekanntes Mitglied
Hallo zusammen,

mittlerweile sitze ich wieder an diesem Projekt und habe folgendes Problem. Schaut Euch bitte mal folgendes Bild an:

http://img234.imageshack.us/my.php?image=problemsz3.jpg

Das ist die Oberseite. Ein großes QuadArray. Nur leider entstehen beim Drehen häßliche Grafikfehler, nämlich die schwarzen Dreiecke.

Kann mir vielleicht jemand sagen, wie man das vermeiden kann?

Edit: Nochmal als Anmerkung: Ich stelle die Kontur eines 3D-Scanners da. Bislang mache ich das, indem ich die Höheninformationen (festes Raster x mal x Bildpunkte) in ein QuadArray schaufele und dieses darstelle. Gibt es vielleicht eine bessere Möglichkeit?

Gruß,
AMiGA
 

AMiGA

Bekanntes Mitglied
Hat niemand eine Idee, wieso ich so eklige Grafikfehler erhalte?

Ich habe gestern testweise die Datenstruktur von einem QuadArray auf ein IndexedTriangleArray verändert. Auch dort treten leider dieselben Grafikfehler auf. Ich habe das ganze auch auf unterschiedlichen Rechnern mit unterschiedlichen Grafikkarten getestet, leider kein Unterschied.

Gruß,
AMiGA
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben