Suche die richtige 3D-Java-Bibliothek für mein Projekt

Hallo, erstmalig hier im Forum,

in den letzten Monaten habe ich mich mit einem Python-Qt-Desktop-Projekt in Python eingearbeitet. Es gibt eine Qt-Oberfläche, Daten-Import-Export, SQLite-DB und eine Socket-Ankopplung an mein vorher in Java/Swing geschriebenes 2D-Grafikprogramm. Jetzt möchte ich gerne meine Visualisierungen zusätzlich in 3D (OpenGL >= 3 Core) programmieren.

Eigentlich wollte ich das in Python machen. Wegen des Wildwuchses und der Versions-Probleme (2 u.3) sehne ich mich aber wieder nach der etwas geordneteren Java-Umgebung. Vor einiger Zeit hatte ich noch eine Android-2D-Grafik-App programmiert, welche ich auch irgendwann auf 3D bringen möchte. Deshalb ist es wahrscheinlich das Sinnigste, meine 3D-Ambitionen direkt mit Java zu realisieren.

Jetzt würde ich mich gerne von Euch ein wenig beraten lassen, welche Java-Libraries für mein Vorhaben in Frage kämen. Es gibt da wohl einige Möglichkeiten, die ich wahrscheinlich nur zu einem Bruchteil bislang gefunden habe.

Was ich machen möchte:

3D-Grafikelemente (Texturen, Meshes, Materialeigenschaften, extrudierte Buchstaben und Zeichen, etc.) möchte ich in Blender entwickeln, in mein Java-Program importieren (am liebsten .blend-Files), und an gerechneten oder fixen Positionen in einer beleuchteten Szene darstellen.

Natürlich sollte die Grafik per Maus zu drehen und zu zoomen sein.

Wenn ich das mit JOGL (ich glaube, das ist ziemlich natives OpenGL ? Ein OpenGL-Core Tutorial in C arbeite ich gerade durch…) machen wollte, wäre das wohl ein ziemlicher Aufwand. Deshalb stelle ich mir eine etwas abstrahierendere Bibliothek vor.

Es ist mir wichtig, dass ich das Ganze irgendwann einmal ohne allzu grossen Aufwand nach Android bekomme (nicht unbedingt Voraussetzung).

Eine halbwegs verständliche Dokumentation wäre für mich existentiell.

Weiterhin wäre es mir wichtig, dass die Bibliothek aktuell und vorraussichtlich in Zukunft weiterentwickelt wird.

Ich würde das unter Linux (Manjaro-Arch) mit IntelliJ machen wollen.

Vielleicht könnt Ihr mich da ja ein wenig beraten ? Ich weiss noch gar nicht, ob ich für eine solche Frage hier richtig bin.

Es ist sehr schwierig, sich darüber im Internet ein vollständiges Bild zu machen.

Grüße
lf

… und dementsprechend ist es mindestens genauso schwer, die Frage „gut“ zu beantworten.

Eine Übersicht findet sich z.B. unter http://www.whoopsie.de/home/doku.php?id=topic01:item003 . Bis vor einiger Zeit hätte ich noch gesagt: „Eine sehr gute Übersicht…“, aber … ja, sie ist inzwischen schon 3 Jahre alt. Einige Sachen haben sich nicht grundlegend geändert, deswegen ist sie auf jeden Fall noch empfehlenswert, aber man muss noch ergänzende Informationen dazu suchen („Welche der dort vorgestellten Libs gibt’s überhaupt noch?“ :D).

Die bekannteste Engine dürfte JMonkeyEngine sein. Auch wenn ich zugeben muss, sie selbst noch nicht wirklich „aktiv“ verwendet zu haben, ist sie sehr mächtig, hat eine große Community, viel Doku und Beispiele, und inzwischen so lange überlebt, dass man davon ausgehen kann, dass es sie morgen immernoch gibt :wink: Sowas wie Blender-Support und Android-Support gibt es wohl auch ( http://hub.jmonkeyengine.org/wiki/doku.php/sdk:blender, http://hub.jmonkeyengine.org/wiki/doku.php/jme3:android ), aber nochmal: Selbst verwendet habe ich das noch nicht.

Der „Senkrechtstarter“ im Bereich „Spieleengines“ scheint mir LibGDX zu sein: http://libgdx.badlogicgames.com/ - auch da habe ich noch nicht wirklich Erfahrung damit, aber man findet viel dazu.

[QUOTE=Marco13]… und dementsprechend ist es mindestens genauso schwer, die Frage „gut“ zu beantworten.[/QUOTE] Das denke ich mir. :wink:

[QUOTE=Marco13;93017]Eine Übersicht findet sich z.B. unter http://www.whoopsie.de/home/doku.php?id=topic01:item003 . Bis vor einiger Zeit hätte ich noch gesagt: „Eine sehr gute Übersicht…“, aber … ja, sie ist inzwischen schon 3 Jahre alt.[/QUOTE]Boevor ich mich hier gemeldet habe, hatte ich genau das studiert. Im OpenSource-Bereich ist das A und O, auf welchen Paketen „noch Strom“ oder „viel Strom“ drauf ist. Auf whoopsie fand ich sehr viele „ohne Strom“ oder ganz „ohne Strom“. :rolleyes:

[QUOTE=Marco13;93017]Die bekannteste Engine dürfte JMonkeyEngine sein.[/QUOTE] Komisch, genau das habe gerade eben installiert und ein wenig ausprobiert. Ich bin total platt, dass es sowas gibt. Und direkt mit ner (NetBeans?-) IDE ! Scheint auch echt gut dokumentiert zu sein, aber echt scheinbar sehr komplex (3D-Spiele sind ja auch wirklich komplex…). Aber das coden von nativem OpenGl ist eher noch wesentlich komplexer :eek:

[QUOTE=Marco13;93017]…hat eine große Community, viel Doku und Beispiele, und inzwischen so lange überlebt, dass man davon ausgehen kann, dass es sie morgen immernoch gibt[/QUOTE] Eigentlich habe ich genau sowas gesucht. Wie ich gelesen habe, hält aber wohl MS? dagegen mit Unity3D. Wenn es sich trotzdem hält, muss es wohl wirklich gut sein. :slight_smile:

[QUOTE=Marco13;93017]Sowas wie Blender-Support und Android-Support gibt es wohl auch ( http://hub.jmonkeyengine.org/wiki/doku.php/sdk:blender, http://hub.jmonkeyengine.org/wiki/doku.php/jme3:android ). [/QUOTE]Ja, genau, die gibt es. Man kann wohl Desktop, Android, IOS und Browser, eigentlich traumhaft ! Wäre aber gut, wenn da ein Praktiker mal was zu sagen würde… :idea:

[QUOTE=Marco13;93017]Der „Senkrechtstarter“ im Bereich „Spieleengines“ scheint mir LibGDX zu sein: http://libgdx.badlogicgames.com/[/QUOTE]Ansatzweise ist es mir auch schon über den Weg gelaufen. Damit habe ich aber irgendwie Stress mit meiner KDE-Oberfläche (sehe im Installer die Pfade nicht). Und es scheint auch nicht ganz so gut dokumentiert zu sein, wie JMonkeyEngine, ist aber wohl auch noch nicht so alt ! Wäre auch sehr interessant, darüber vielleicht noch etwas mehr zu erfahren und was vielleicht eher zu empfehlen wäre, bzw welche Vor- und Nachteile es bei JMonkey und LibGDX gibt.

Aber ein wenig war ich da wohl schon auf die wesentliche, aktuelle Quintessenz gestossen.

Danke, für das nette und aufschlussreiche Feedback !

Also, ich habe heute den ganzenTag einige Tests gemacht mit der JMonkeys-Engine und LibGDX. Naja, ist zwar gigantisch, was man da alles machen kann, aber auch sehr komplex ! Ein ganzes Spiel wollte ich eigentlich nicht programmieren…

Deshalb würde mich interessieren, ob man nicht erst mal mit der LWJGL-Lib anfangen könnte (wenn ich das richtig verstanden habe, baut JME ja darauf auf) und die JME nur für den Import der Blender-Dateien benutzen ?

Nun. Da steckt ja die eigentliche Komplexität drin. Ohne zu viel Ahnung von JME und mit noch weniger Ahnung von Blender: Was auch immer in der Blender-Datei steht, muss ja irgendwie graphisch repräsentiert werden. Der „BlenderModelLoader“ ist ja schon stark mit der Infrastruktur von JME verwurstet, die ganze Asset-Verwaltung usw, und er liefert ja alle Daten in den JME-spezifischen Strukturen… Alles in LWJGL nachzubauen, was notwendig ist, um das alles anzuzeigen, wäre wohl … ähnlich aufwändig, wie eine neue JME zu scheiben :smiley: Wenn du selbst etwas in LWJGL anzeigen willst, was in erster Linie aus Meshes+Texturen besteht (das ist schon kompliziert genug ;-)) könntest du überlegen, das ganze aus Blender heraus als OBJ-Dateien zu speichern. Dafür einen Parser zu schreiben ist nicht so aufwändig. Aber sowas wie Animationen, Kameras, Lichter oder speziell irgendwelche fancy Materialeigenschaften werden damit natürlich erstmal nicht abgebildet. räusper. Apropos. @Fancy :smiley:
Vielleicht kann noch jemand was dazu sagen, der mehr (praktische) Erfahrung mit JME/Blender/Rendering hat…

Mit Obj-Dateien habe ich das schon gemacht (in Python und OpenGL old Style). Das sieht einfach nicht so toll aus. Dass JME seine eigenen Datenstrukturen hat, das hatte ich schon befürchtet. Naja, da wird es wohl das Beste sein, erst mal die vielen genialen Video-Tuts durchzuarbeiten und die JME zu lernen. Entweder richtig oder gar nicht !

Ich hoffe, dass die JME nicht zu kompliziert ist. Gegen komplex habe ich nichts. Würde mich natürlich auch interessieren, was ein JME-Praktiker dazu meint, wie schwer es war, das zu lernen. Ein paar Leute im Internet meinten, die JME wäre kompliziert. Und was ist mit libGDX, ist es vielleicht einfacher ?

Moin,

zu jME und libGDX kann ich nichts sagen.

Im Allgemeinen wären die Blender-Files aber nicht meine erste Wahl, wenn es um das Input-Format eines Viewers geht. Zum einem ist das, was da drin steht, relativ weit entfernt von dem, was eine Grafikkarte braucht und zum anderen ändert sich das Format zwischen den Blender Versionen schon mal gerne. jME weist ja auch auf einige Punkte hin, die man beachten sollte.

OBJ-Files sind praktisch das Gegenteil davon, die sind einfach zu parsen und der Inhalt kann (bei Dreiecken) fast 1:1 zur Grafikkarte übertragen werden. Es fehlen aber auch Informationen wie etwa Kamerastandpunkt oder Licht. Wenn man im Viewer geeignete Annahmen trifft, wüste ich aber keinen Grund, warum dieselbe Geometrie als OBJ schlechter aussehen sollte, als aus einem Blender-File.

Nichtsdestotrotz, wenn man etwas fertiges wie etwa jME oder libGDX verwendet, sollte das schon einfacher sein.

Viele Grüße
Fancy

Ich nehme mal an, dass man mit diesen „fertigen“ Lösungen wie jME oder libGDX auch obj-Files lesen kann. Nun gut, ich befinde mich noch ganz am Anfang und bin momentan erschlagen von der „Kompliziertheit“ von OpenGL selbst - ich arbeite (wie gesagt ?) gerade ein C-OpenGL-Tutorial durch, um eine Vorstellung zu bekommen, wie OpenGL tickt. Deshalb habe ich auch hier nach solchen „fertigen“ Lösungen gefragt, weil ich es mir doch ein wenig einfacher machen möchte. Solche Sachen wie Beleuchtung und Kamerastandpunkt möchte ich doch gerne im Programm händeln und die Objekte in Blender basteln. Was gegen obj-Files spricht ist für mich die Tatsache, dass ich mir den Weg nicht verbauen will, später auch Bewegung in meine Szene zu programmieren. Auch hierbei stelle ich mir vor, dass ich das in Blender vielleicht „vorbereiten“ könnte um es dann in meinem Programm zu bearbeiten. Vielleicht sollte ich mich mal mit den File-Formaten auseinandersetzen und was sie beinhalten können. Alles noch sehr unausgegoren, ich weiss ! Aber ich bin programmiertechnisch schon mehr als einmal in Sackgassen gerannt un habe mir damit viel Arbeit gemacht :eek:. Deshalb möchte ich es dieses Mal vorher besser vorbereiten. :wink:

Ich hab jetzt nich alles gelesen, aber ich wollte mal JavaFX in den Raum werfen.
Seit Java 8 ist das in der Standard-Bibliothek uns soll Swing etc. in Zukunft ersetzten. Interessanterweise kann JavaFX auch 3D, wobei ich nicht weiß, wies es mit den Shaders und Materials aussieht.

Das folgende Viedeo fand ich eigentlich vielversprechend (ein Jahr alt allerdings):

//youtu.be/EBKHdV-_rIc

Das nenn ich ja mal ne Alternative: Ich liebe eigentlich die Reinkultur ! JavaFX habe ich bislang, das muss ich zugeben, immer irgendwie ignoriert, weil ich mit Swing gearbeitet (und mich geärgert…) hatte. Und in den IT-News, die ich jeden Tag lese, sind mir die neuerlichen Fähigkeiten von JavaFX auch noch nicht über den Weg gelaufen. Die JDK8 habe ich erst gestern bei mir wieder gegen die 7er Version getauscht, weil ich Java8 in Verdacht hatte, dass es die Ursache von ein paar seltsamen Effekten bei einigen Java-Programmen war (war es aber nicht…). Irgendwie hat man fast nichts von der neuen Java-Version in der Fachpresse verlauten lassen.
Danke für den Tip ! Werde ich mir mal genauer anschauen !

Echt nicht? Soweit ich weiß bringt Java 8 quasi die größten Änderungen seit langem (seit Generics?). Aber ich hab auch danach gesucht…
Du solltest dir auf jeden Fall die Lambda Expressions anschauen, wenn du sowieso schon Java8 benutzt, die sehen sehr vielversprechend aus.

Doch schon ! Aber nicht viel mehr, als dass es die gibt und dass sie FX standardmäßig dabei hat. Aber nicht, wie sehr sich FX gemausert hat. Hab ich mir heute dann mal genauer angesehen. Da geht ja jetzt wirklich was … Und Lambda Expressions ? Das habe ich schon mal bei Python gehört, dass es die gibt. Bin aber nicht schlau daraus geworden, was die für Vorteile haben. Muss ich mir wohl auch mal anschauen ! Bei dem Hype, den die Leute wegen der lambdas machen, muss es wohl doch was Wichtiges sein.

Achso. Ja dass FX jetzt 3D kann, darauf bin ich auch eher zufällig gestoßen^^
Was ich daran besonders schön finde ist die Verbindung von 2D und 3D. Man kann ja quasi wenn ich das damals richtig verstanden habe beliebige 2D-FX-GUI-Teile auf eine 3D-Fläche mappen, damit kann man sicher lustige Dinge anstellen : D

Naja, man kann jetzt halt „künstliche“ Methoden als Parameter übergeben (künstlich deshalb, weil diese „Methoden“ im Prinzip immer noch Objekte sind, welche dann diese Methode anbieten, weshalb die Sache auch auf der aufrufenden Seite ziemlich hässlich aussieht im Vergleich zu Sprachen mit „echten“ Funktionstypen).

Was ich auch interessant finde ist, dass man wohl Swing-Oberflächen nach FX bringen kann. Damit könnte ich eine meine Desktop-Apps vielleicht ein wenig modernisieren, weil Swing immer sehr viel Arbeit ist und nicht so toll aussieht (Swing ? :rolleyes: ). Schaun wir mal…

Was 3D angeht, habe ich damit jetzt schon ein bisschen probiert (das H20-Molekül-Beispiel zu von Oracle zu einem Eisen-Kohlenstoff-Kristall erweitert). Sieht sehr gut aus und war recht schnell umsetzbar. Ich habe aber noch keine Vorstellung, inwieweit mir die neuen FX-Facilities bei meinen neuerlichen Ambitionen weiterhelfen, obwohl man ja obj-Files (und andere) damit händeln kann. Wenn mein neuer Rechner da ist, werde ich es erst mal JME und libGDE intensiver antesten und schauen, wie ich damit klar komme.

Falls du hier mehr ueber opengl lesen willst… bzw 3d systeme allgemein… schau einfach mal meine gestellten fragen durch… da ist sooo viel zu 3d und opengl dabei :smiley:

OT: ich erinnere an den software renderer an dem ich mich damals versucht hatte ^^