# Hilfe: Ich sehe durch die ganze Api's nicht mehr durch!



## spyboot (5. Okt 2008)

Hi Leute!

Ich hab ein Problem:

Wenn ich jetzt zb. ein 3D Spiel programmieren will verwende ich java3D (was ich noch nicht verstanden hab).
Aber was genau ist Jogl und der ganze andere kram?
Ich weiß nicht einmal wie ich ein 3D Object exact positionieren kann!
Ist JOGL sowas wie ein Apklatsch von Java3D?
Und wenn ja: Was lohnt es sich eher anzueignen?
Ich finde Java3D ziehmlich kompliziert:

Zuerst dachte ich es wäre so als ob mann einen JFrame verwaltet:Mann übergibt ihm dass Objekt und kann es hinterher noch verändern.
Doch in Java3D geht dass nicht...

Und wenn ich jetzt ein Objekt hinzufügen oder entfernen will muss ich dann die ganze Szene neu aufbauen?
Muss ich wenn ich eine Animation erstellen will alles irgendwie bei diesem Timer einstellen oder kann ich dass auch wie bei Graphics2D alles einfach immer wieder mit den aktuellen koordinaten neuzeichnen lassen?

Es wäre sehr net wenn mir jemand auf diese ganzen Fragen eine Antwort geben könnte!


----------



## Marco13 (5. Okt 2008)

EINE Antwort wird da schwierig. Ohne dich desilliusionieren, demotivieren, diskreditieren oder deinen Enthusiasmus dämpfen zu wollen: Ein 3D-Spiel ist nicht gerade etwas, womit mal einfach so anfängt. (Sei es in bezug auf das Programmieren an sich, oder als Projekt...).

Vielleicht suchst du eher sowas, wie das, was man mit http://www.google.com/search?hl=de&q=3d+game+creator&btnG=Suche&lr= findet?

Aber ich versuch's...

_Wenn ich jetzt zb. ein 3D Spiel programmieren will verwende ich java3D (was ich noch nicht verstanden hab)._
Das ist eine Möglichkeit. Eine Alternative wäre z.B. JOGL

_Aber was genau ist Jogl und der ganze andere kram?_
JOGL ist eine Bibliothek, mit der man _direkt_ OpenGL-Befehle in Java ausführen kann. Man kann zwar interessantere Effekte erreichen als mit Java3D (Shader verwenden usw, und effizienter wäre es u.U. auch) aber der Aufwand wäre deutlich (!) höher. Der "ganze andere Kram" ist anderer Kram :roll: 

_Ich weiß nicht einmal wie ich ein 3D Object exact positionieren kann!_
Indem man es an einen TransformNode hängt, dem man die passende Transform3D gibt..... :roll: Siehe dazu ein Java3D-Tutorial...


_Ist JOGL sowas wie ein Apklatsch von Java3D?_
Siehe oben: Nein. Aber soweit ich weiß gibt es Bestrebungen, Java3D und JOGL zu mischen.

_Und wenn ja: Was lohnt es sich eher anzueignen?_
Die beiden Technologien sind recht "orthogonal" zueinander. Forensuche liefert Threads, die die beiden vergleichend gegenüberstellen.


_Ich finde Java3D ziehmlich kompliziert:_

Dann lass' die Finger von JOGL :wink:

_Zuerst dachte ich es wäre so als ob mann einen JFrame verwaltet:Mann übergibt ihm dass Objekt und kann es hinterher noch verändern.
Doch in Java3D geht dass nicht..._

Doch, das geht, und der Vergleich mit dem JFrame ist hier garnicht sooo unangebracht: Auch mit Components baut man eine _Hierarchie_ auf: Oben der JFrame, darin Panels, darin Buttons. Genau wie der Szenegraph in Java3D: Oben das Universe, darin ein Node, darin ein Shape3D.... 

_Und wenn ich jetzt ein Objekt hinzufügen oder entfernen will muss ich dann die ganze Szene neu aufbauen?_

Nein. Um die Objekte zu verändern, muss man wissen, welche Veränderung man machen will, und wie man sie erreicht. Oft müssen passende Capability-Bits gesetzt werden. Siehe dazu ein Java3D-Tutorial...

_Muss ich wenn ich eine Animation erstellen will alles irgendwie bei diesem Timer einstellen oder kann ich dass auch wie bei Graphics2D alles einfach immer wieder mit den aktuellen koordinaten neuzeichnen lassen? _

Um's Neuzeichnen braucht man sich bei Java3D nicht zu kümmern. Animationen kann man mit Interpolatoren und einem passenden Alpha-Objekt erreichen. Siehe auch dazu: Tutorials, Tutorials, Tutorials....


Vielleicht wäre für den Einstieg sowas wie http://www.jmonkeyengine.com/ am ehesten geeignet. Man bekommt damit zwar vermutlich nicht so mit, was "unter der Oberfläche" eigentlich passiert, aber ... man hat vermutlich schneller Erfolgserlebnisse.........


----------



## spyboot (6. Okt 2008)

Ok!

ich habe mich jetzt in Java3D ein wenig eingearbeitet kann jetzt auch eine Rotation mit Transform3D um mehrer Achsen machen.

Jetzt habe ich noch eine Frage:

Wenn ich wie es bei einem JFrame bzw Frame möglich gewesen wäre die Rotation zb um die X achse nachträglich veränder passiert nichts und wenn ich sie veränder und sie nachträglich wieder der TransformGroup und danach der Banchgruop hinzufüge krieg ich einen Fehler!

Kann mir jetzt einer erklären wie ich sowas nachträglich machen kann?
Einfach mit einem Timer eine Animation einstellen geht nicht da es ja "sofort" passieren soll und weil es ja auch keine Animation werden soll.


----------



## Marco13 (6. Okt 2008)

Du musst wahrscheinlich in der TransformGroup das http://java.sun.com/javase/technolo...j3d/TransformGroup.html#ALLOW_TRANSFORM_WRITE capability bit setzen. Danach kannst du dieser TransformGroup eine neue Transform3D setzen. (Wenn du nur die Transform3D veränderst, kreigt die TransformGroup davon soweit ich weiß nichts mit - bin aber nicht 100% sicher - wenn's nicht klappt, poste mal das Codestück, wo du die Transform veränderst)


----------



## spyboot (7. Okt 2008)

Cool Danke!^^


----------



## spyboot (18. Okt 2008)

Äh wie kann ich jetzt ein Object um seine eigene Axe drehen?
Wenn ich es über transform drehe dreht es sich immer um die 0,0,0 koordinate!


----------



## spyboot (19. Okt 2008)

^^hatt sich erledigt hab einfach mehrere transform groups gemacht.

rotation>position>banchgroup


----------



## Landei (20. Okt 2008)

Eine gute Alternative zu Java3D ist

www.jmonkeyengine.com

insbesondere, weil diese mehr "spielorientiert" ist als Java3D mit seinem allgemeinerem Anwendungsbereich, insbesondere was Effekte (Schatten, Wasser, Nebel, Partikelsysteme) angeht. Dokumentation ist manchmal etwas rar, aber es gibt ein paar Demos und Tutorials, und die Communitiy ist auch hilfsbereit.


----------



## spyboot (21. Okt 2008)

Ich hab mir die JMonkeyEngiene jetzt schonmal angeschaut und grafisch macht sie ja einiges her aber: Sie ist im vergleich zu Java3D ungefär 3-mal so langsam (fpps) wenn man nur einen würfel dargestellt haben will.

Nun aber zu einer anderem Problem:

ich habe einen Texturloader aus dem internet:


```
private static Appearance textur(String filename) {
        Appearance appear = new Appearance();
		 
        System.out.println("TexturedPlane attempt to load file: "+filename);
        TextureLoader loader = new TextureLoader(filename,frame);
        ImageComponent2D image = loader.getImage();
 
        if(image == null) {
                System.out.println("Fehler: "+filename);
        }
 
        System.out.println("Image width  = " + image.getWidth());
        System.out.println("Image height = " + image.getHeight());
        
       
        Texture2D texture = new Texture2D(Texture.BASE_LEVEL, Texture.RGB,
                                          image.getWidth(), image.getHeight());
        texture.setImage(0, image);
        texture.setEnable(true);
        texture.setMagFilter(Texture.NICEST);
 
        appear.setTexture(texture);
 
        appear.setTransparencyAttributes(
           new TransparencyAttributes(TransparencyAttributes.FASTEST, 0.1f));
       
        return appear;
	}
```

soweist sogut dochwenn ich ihn jetzt zb mit textur("tex.jpg") starte dann ist mein Objekt lediglich einfarbig!
(es scheint immer die farbe des 1x1 Pixels meines Bildes zu haben).

Hatt einer eine Idee woran dass liegen könnte?
-----
Ich denke ich werde diesen Thread nach dieser Frage schließen.


----------



## Marco13 (21. Okt 2008)

Dass die JMonkeyEngine bei einem Würfel dreimal so langsam ist, wie J3D, kann gut sein. Aber wenn man mal nicht nur EINEN (ggf. sogar noch utexturierten) Würfel hat, sondern 10 Texturierte Würfel, ist J3D vielleicht nurnoch doppelt so schnell, und bei einer komplexen Szene vielleicht nurnoch 10% schneller. Man hat oft diesen Tradeoff: Entweder, man macht alles höchst-optimiert "per Hand", oder man macht sich das Leben leichter. Anders formuliert: Mit reinem JOGL wäre die FPS vielleicht noch dreimal so hoch wie die von J3D, aber der Code auch dreimal so lang :wink:

Zur letzten Frage: Hast du deinem Objekt vernünftige Texturkoordinaten gegeben?


----------



## spyboot (21. Okt 2008)

ich habe ihm garkeine gegeben...
Muss mann dass den tun?


----------



## Marco13 (21. Okt 2008)

Hm.  :? Soll er sie raten? :wink:


----------



## Landei (22. Okt 2008)

Nochmal zu JMonkeyEngine: Je nachdem, was du machen willst, gibt es viele Optimierungsmöglichkeiten: Rufst du den Würfel mit StandardGame auf oder dem langsameren SimpleGame usw.? Ich habe schon Szenen mit riesigen Terrains inklusive Bäumen in JME gesehen, und die FPS waren in Ordnung (manchen Modi sind auch ganze bewußt auf einen festen Wert wie 60fps oder so begrenzt - mehr bekommt unser Gehirn ja sowieso nicht mit). 
Ich will nicht behaupten das JME die beste Java-3D-Engine ist, aber das eingebaute Java3D ist mit Sicherheit die schlechteste (für Spiele, wohlgemerkt).


----------



## Marco13 (22. Okt 2008)

Java3D erhebt glaubich garnicht den Anspruch, eine "Engine" zu sein - es ist nur eine API ... auf basis derer man eine Engine basteln könnte ...  :? oder so


----------



## Landei (22. Okt 2008)

So kann man es auch sehen.

Ich finde es halt doof, dass sich so viele angehende Spiele-Programmierer mit Java3D rumquälen, wenn es bessere Alternativen gibt, bei denen viele spielspezifische Sachen schon vorgefertigt sind. Ich habe auch mal mit Java3D rumgespielt - ganz nett, aber eigentlich Zeitverschwendung (außer für Leute, die es lieben, beim Urschleim anzufangen). Was nützen dir die FPS, wenn dein Spiel dafür aussieht wie sterile hingeschmissene Bauklötze, weil dir Effekte, Physik usw. fehlen?


----------



## spyboot (22. Okt 2008)

das Spiel muss ja nicht nur aus Vierecken bestehen.
Ich hab mir blender geholt und verwnde den Obj loader von Sun das reicht allemal um zb. ein einfaches Space-Game zu machen.


----------

