# 3D Object Viewer



## Shaguar (12. Jan 2012)

Hi zusammen,

ich sitze gerade daran einen 3D Object Viewer zu erstellen.
Es sollen einfache 3D Objekte geladen werden, zB Möbel, diese dann durch Rotation betrachtet werden und zusätzlich deren Textur geändert werden können.
Ich benutze vorerst dafür Java 3D, bin aber was das angeht noch nicht endgültig festgelegt.
Momentan habe ich das laden von *.obj, *.lwo etc Daten hinbekommen und das die Objekte mit der Maus gedreht werden können. Als nächstes möchte ich erreichen das einzelne Flächen der Möbel anklickbar sind und danach über eine Dropdownliste (oder ähnliches) eine neue Textur ausgewählt werden kann und diese anschließend auf dem 3D Objekt live übernommen wird.
Wenn ihr mir dazu irgendwelche Einsteiger Tipps hättet wäre das super, denn ich habe bisher noch keine Quellen gefunden wo so etwas ähnliches erklärt wird.
Also bei folgenden Sachen habe ich meine Probleme:
-Definierte Flächen des Models sollen einen Hover-Effekt bekommen, damit man merkt das sie anklickbar sind.
-Nach dem Anklicken soll sich irgendwo eine Texturauswahl öffnen
-Die Textur soll nach dem Auswählen übernommen werden.

Ich bräuchte irgendwelche Quellenangaben wo ich soetwas recherchieren könnte oder gerne auch direkte Hilfe wenn sich jemand mit diesem Thema auskennt.
In allen Büchern die ich bisher zu diesem Thema gefunden habe geht es eig immer eher um Grafikprogammierung wie Bewegungen, Partikeleffekte etc. Aber sowas brauche ich überhaupt nicht.

Danke schon mal im Vorraus.

Ps: Wenn jemand den Quelltext sehen will, von dem was ich bisher habe, dann einfach bescheid sagen.

Mfg


----------



## Shaguar (16. Jan 2012)

Kennt denn niemand irgendwelche guten Bücher oder Tutorials im Internet oder Videos auf Youtube etc  zu diesem Thema? 
Wie gesagt wenn es nicht Java 3D ist macht das auch nichts, ich wäre auch für Quellen zu JOGL oder LWJGL oder von mir aus auch Flash sehr dankbar.


----------



## Marco13 (16. Jan 2012)

Das Beschriebene ist einfach eine sehr spezielle Anwendung - die nichts mit dem zu tun hat, was die meisten Leute als erstes in 3D machen: Spiele  Rundsätzlich muss man wohl zusehen, wie man überhaupt "Flächen" definieren kann (in der OBJ-Datei steht ja erstmal nur Polygon-Matsch - da wird man noch Zusatzinfos brauchen). Dann muss man erkennen, dass man mit der Maus über so einer Fläche ist, irgendwie mit einem PickCanvas, und dann das aussehen ändern, d.h. dem Objekt (der Fläche!) eine andere Appearance geben. Ein Video-Tutorial: "Wie man das Möbel-Design-Ding programmiert, das Shaguar braucht" wird man wohl kaum finden


----------



## Shaguar (16. Jan 2012)

Da hast du vermutlich Recht.
Aber ein paar Sachen habe ich ja schon herausgefunden.
Die Objekte liegen ja bereits als 3D Modelle vor, obj oder als lwo Dateien.
Diese Objekte sind bereits in Flächen gegliedert, wie zB Sitzfläche, Armlehnen, Rückenlehne, Fahrgestell etc (bei einem Stuhl).
In Java 3D kann ich nun diese Objekte mittels

```
ObjectFile file = new ObjectFile(ObjectFile.RESIZE);
        Scene scene = file.load(new FileReader(location));
```
laden und kann mir dann mit

```
Map<String, Shape3D> nameMap = scene.getNamedObjects();
nameMap.get("Sitzflaechen_Bezeichnung");
```
die einzelne Komponenten herausholen und manipulieren.
Desweiteren habe ich ein bisschen mit dem PickMouseBehavior herumexperimentiert, und man kann auch mehr oder weniger schon einzelne Teile anklicken und dies wird auch registriert. Aber noch relativ ungenau, habe mir sagen lassen das das was mit den Ray Casting Einstellungen zu tun hat. Und wie man ein MouseOver Element realisiert habe ich auch noch nicht herausgefunden, bzw wie man dann die Beleuchtung für eine einzelne Fläche verändern kann (oder wie man auch sonst einen Hover-Effekt hinbekommt).
Die Texturauswahl müsste auch nicht zwingend in das Canvas3D Objekt gezeichnet werden sondern könnte zur Not auch getrennt in einem extra Panel im Frame angezeigt werden, hätte dann somit nichts mehr mit dem Java 3D zu tun.
Zum Texturenproblen habe ich noch nichts getestet bisher, aber ich denke da ich die Flächen einzeln ansprechen kann dürfte das Ändern der Texturen kein allzu großes Hinderniss sein, da es generell für Texturen in Java3D genügend Hilfsmaterial im Internet gibt.
Wie man erkennt, sieht mein Problem also gar nicht mehr so schlimm und spezifisch aus.
Es fehlt nur noch ein bisschen was an Fachwissen.


----------



## Shaguar (18. Jan 2012)

Also ich habe mir überlegt das ganze doch ein wenig anders zu machen.
Mal angenommen ich verzichte auf das drehen von Objekten (auch wenn das nicht schwer zu implementieren ist) und auch auf das ändern von Texturen, zumindest die Live-Vorschau. Stattdessen verwende ich einfach normale 2D Ansichten der Objekte, meinetwegen eine von vorne und eine vorn hinten und dann gehen von den veränderbaren Flächen (also die Teile des Objektes von denen ich die Texture ändern möchte) Pfeile weg und am Ende stehen ComboBoxen mit der Texturauswahl. 
In den ComboBoxen sind von mir aus noch kleine Vorschaubilder der Texturen.
Der Vorteil wäre auch das man sehen würde welche Flächen der Objekte veränderbar sind.
Meine Frage wäre wie man sowas realisieren könnte.
Die Probleme wären zum einen das automatische erkennen von veränderbaren Flächen (mal angenommen die Informationen liegen vor) und dann das zeichnen der Linien zu den ComboBoxen.
Ich hab gesehen das du (@Marco13) mal eine Bibliothek geschrieben hast zum zeichnen von Swing Objekten in JOGL Umgebungen. Sowas in der Art würde ich dann wohl auch benötigen, es sei denn ich mache links und rechts vom JOGL Panel ein normales Swing Panel das die ComboBoxen beinhaltet.
Was dann aber auch erforderlich wäre das das Tool je nach geladenem Objekt (welche unterschiedlich viele veränderbare Flächen haben können) die Linien und ComboBox dynamisch zeichnet und anpasst.
Es sei denn jemand hat hier vielleicht noch eine andere Idee wie ich so etwas umsetzen könnte.

Hab nochmal ne kleine Zeichnung gemacht wie ich mir das in etwa vorstelle:


----------



## Evil-Devil (18. Jan 2012)

Wenn du nur die bereits definierten Texturflächen anklickbar machen willst, dann würde ich empfehlen die UVs zu nutzen. In selbigen sind Vertice/Faces definiert zu denen die jeweilige Textur gehört.

Sprich sobald ein Klick auf dein Model erfolgt schaust du nach zu welchem UV-Set das Face gehört und kannst dann entsprechend alles davon ersetzen


----------



## Shaguar (18. Jan 2012)

UVs?


----------



## Marco13 (18. Jan 2012)

Auch diese Fragen und Beschreibungen sind wieder sehr speziell - aber gleichzeitig noch zu schwammig. Ein wichtiger Punkt ist wohl, wie die "veränderbaren Flächen" spezifiziert sind. Wenn das ohnehin schon Geometry-Groups (bzw. mtl-Groups) in den OBJs sind, sollte man da relativ leicht rankommen. Dann muss man sich aber noch um's Picming kümmern. Das in JOGL selbst zu machen, kann ein bißchen aufwändiger sein, aber WIE genau es in Java3D geht weiß ich auch nicht - also in diesem Fall mit OBJs und Groups usw. alles was über Stichworte wie PickCanvas, und ein paar Snippets die ich dazu mal ausprobiert hatte, hinausgeht. 

Diese ComboBoxes, ob in 2D oder 3D, sind erstmal etwas, was orthogonal ist zu der Funktionalität, die OBJ-Groups zu lesen und die Möglichkeit zum Ändern der Texturen zu bieten. 

Zu Swogl (dem 3D-Components-Ding) sollte ich erwähnen, dass es da NOCH kein Java3D-Backend gibt. Das liegt schon als "Kleines Gelbes Haftettikett" in meiner TODO-Liste, aber wann ich dazu komme, weiß ich nicht... (Zeit, Zeit, Zeit...)

Für den Fall dass man die ComboBoxes in 2D macht, muss man sich überlegen, wie man die Linien zeichnet - das kann ein bißchen fummelig werden, aber geht natürlich. Für den 3D-Fall würde sich sofort die Frage nach der Position der ComboBoxes im 3D-Raum stellen (wäre allgemein noch ein bißchen anspruchsvoller). 

Man könnte sich auch (für den Anfang) eventuell (!) relativ einfach Mischformen vorstellen, z.B. das wenn eine ComboBox den Focus hat, das entsprechende Teil gehighlighted wird oder so...

Möglichkeiten über Möglichkeiten...


----------



## Shaguar (19. Jan 2012)

Also ich hab zwar auch schon mal erwähnt aber ich ich sags nochmal, ich bin alles andere als festgelegt auf Java3D. Das Ganze kann auch genausogut in JOGL realisiert werden. Ich hab halt nur meine ersten Gehversuche in der 3D Welt mit Java3D gemacht.


----------



## Shaguar (19. Jan 2012)

So ich habe jetzt noch eine weitere Info. Die Objekte die ich laden will (ob nun mit JOGL oder Java3D) werden mit ziemlicher Sicherheit VRML (also .wrl) Dateien sein.
Gibt es dafür einen Loader für Java3D?
Ich hab nach googlen gesehen das einer im Paket com.sun.j3d.loaders.vrml97.VrmlLoader ist, aber das Paket ist in meiner Java Installation nicht enthalten.
Gibt es da mittlerweile einen anderen, neueren Loader oder muss ich mir den extra runterladen? (wenn ja wo?)

Gruß
Shaguar


----------



## Marco13 (19. Jan 2012)

Kann's sein dass der einfach nur als eigenes Projekt abgespalten wurde ( J3d-vrml97 &mdash; Java.net ) ? Hab's aber noch nicht ausprobiert. VRML ist so... 1980


----------



## Shaguar (20. Jan 2012)

Ja kann ich denn mit einem entsprechenden Tool die wrl Datei auch in ein besseres Format umwandeln?
Ich habe den Loader mal getestet und es kommen sowieso jede Menge Exception, deswegen würde sich das vielleicht eh anbieten. Außerdem würde ich das Model auch gerne noch kleiner bekommen, momentan sind die Dateien so 40-50Mb groß, gibts da vielleicht ein anderes Format das die Daten etwas effizienter speichert?


----------



## Marco13 (20. Jan 2012)

Sicher, aber dann stellt sich sofort wieder die Frage nach dem loader. "Einfach" und universell ist eben OBJ, aber die sind auch erstmal ziemlich groß. Ein gezipptes OBJ könnte eine Alternative sein, aber... wer weiß, was das am Ende werden soll...


----------



## Shaguar (23. Jan 2012)

Welche Tools kennst du denn zum umwandeln von *.wrl Dateien? Ich habe bisher Blender getestet aber das will meine wrl Datei nicht importieren.
Wenn möglich Freeware oder kostenlose Demo.

Danke


----------

