3D-Grafikprogrammierung in Java, Teil 1: Java 3D

Um eine echte Java-Plattform aufzubauen, erkannte Sun früh, dass das API-Bild über die eingeschränkte Funktionalität der Java 1.0-Kernplattform hinaus ausgefüllt werden musste. Sun hat den Kern mit den Versionen 1.1 und den bevorstehenden Versionen 1.2 stark erweitert, aber es fehlen noch einige Teile im Java-Puzzle.

Sun und seine Partner entwickelten die Java Media- und Kommunikations-APIs, um die fehlenden Multimedia-Programmierelemente bereitzustellen. Zwei der größten Teile, 2D- und 3D-Grafiken, werden mit den Java 2D- bzw. 3D-APIs ausgewählt. Java 2D ist eine Kernplattform-API, die mit Java 1.2 beginnt, während Java 3D kurz nach Verfügbarkeit der 1.2-Plattform als Erweiterungs-API veröffentlicht wird. Wir haben kürzlich eine Reihe von Spalten in Java 2D fertiggestellt. Jetzt wenden wir uns Java 3D zu.

Java 3D soll Java-Entwicklern die Möglichkeit geben, Applets und Anwendungen zu schreiben, die Benutzern dreidimensionale, interaktive Inhalte bereitstellen. Sun hat in diesem Bereich eine starke Konkurrenz durch andere 3D-Grafiktechnologien, und Java 3D steht vor einem harten Kampf, wenn es darum geht, den etablierten Grafikstandard OpenGL zu besiegen.

Eine Anfrage nach Leserkommentaren zu 3D-Grafik-APIs für Java zeigte ernsthaftes Interesse an Java 3D- und Java OpenGL-Bindungen. Daher habe ich beschlossen, mich in den kommenden Monaten auf diese Technologien zu konzentrieren.

Ein begrenzteres Interesse wurde an VRML geäußert. Infolgedessen werde ich mich mit VRML befassen, indem ich seine Verwendung in Java 3D mit VRML97-Inhaltsladern und dem Java 3D VRML97-Browser von Sun demonstriere. Direct3D erhielt sehr wenig Interesse, daher habe ich beschlossen, diesen Weg nicht weiter zu verfolgen, außer zu erwähnen, wo eine der anderen Technologien ihn unterstützen oder mit ihm zusammenarbeiten kann.

Vor- und Nachteile von Java 3D

Diesen Monat beginnen wir unsere Tour durch 3D-Grafik-APIs für Java mit der Erkundung von Java 3D. Wir werden zunächst einige der wichtigsten Stärken und Schwächen der API erörtern. 3D-Grafiken können manchmal eher stumpf erscheinen und daher schwer zu erklären sein. Wenn Sie nach wie vor Verwirrung über meine Beispiele oder Erklärungen haben, schreiben Sie mir bitte Ihre Fragen oder Kommentare, und ich werde mein Bestes tun, um sie zu beantworten.

Verkaufsargumente für Java 3D:

  • Es bietet eine objektorientierte Ansicht von 3D-Grafiken auf hoher Ebene. Java 3D erreicht dies teilweise mithilfe eines auf Szenendiagrammen basierenden 3D-Grafikmodells. (Wir werden dieses Konzept später in diesem Artikel ausführlicher diskutieren.) Dieser Ansatz soll Programmierern ohne viel Erfahrung in der Grafik- oder Multimedia-Programmierung helfen, 3D in ihren Anwendungen zu verwenden. Im Gegensatz zu untergeordneten prozeduralen 3D-APIs wie OpenGL, die darauf ausgelegt sind, die bestmögliche Geschwindigkeit zu optimieren und Programmierern die größtmögliche Kontrolle über den Renderprozess zu geben, soll Java 3D für jeden erfahrenen Java-Programmierer einfach genug sein lernen.

  • Wenn Sie keinen einfachen Zugriff auf Rendering-Vorgänge benötigen, ist Java 3D möglicherweise eine Option. Der Rendering-Zugriff ist auf Anforderungen über Attribute und Fähigkeitsbits beschränkt, die in Form und Funktion den Renderhinweisen von Java 2D ähneln. (Unter Ressourcen finden Sie Links zu meiner vorherigen Serie zu Java 2D, die Diskussionen und Beispiele für die Rendering-Hinweise von 2D enthielt.)

  • Java 3D ist nach Möglichkeit auf Geschwindigkeit optimiert. Die Laufzeit verwendet Rendering-Fähigkeitsbits, um das Szenendiagramm für das schnellstmögliche Rendern zu optimieren. Dieser Ansatz macht Java 3D für interaktive Grafikumgebungen (Spiele, Simulationen, Situationen mit geringer Latenz) besser geeignet als für hochwertige Offline-Grafikanwendungen (wie Renderfarmen).

  • Eine große und wachsende Anzahl von 3D-Loadern steht zum Importieren von Inhalten in die Java 3D-Laufzeit zur Verfügung. Sun hat einen Java 3D VRML97-Dateilader und einen Browser mit Code frei verfügbar gemacht. Suchen Sie in der Spalte Medienprogrammierung des nächsten Monats nach weiteren Informationen zu Java 3D-Ladern.

  • Java 3D erfordert Vektormathematikfunktionen, die an keiner anderen Stelle der Java-Plattform verfügbar sind. Diese mathematischen Operationen befinden sich derzeit im javax.vecmathPaket und können in Zukunft auf die Kernplattform verschoben werden.

  • Java 3D unterstützt eine Reihe exotischer Geräte (z. B. Zauberstäbe, Datenhandschuhe und Headsets). Das com.sun.j3d.utils.trackersin der Sun-Implementierung enthaltene Paket enthält Klassen für Fakespace-, Logitech- und Polhemus-Geräte. Diese Geräte sind jedoch nicht weit verbreitet, daher werde ich sie nicht im Detail diskutieren. Wenn Sie mehr über die Geräteunterstützung erfahren möchten, besuchen Sie die Java 3D-Websites von Sun und das Java 3D-Mailinglistenarchiv (beide verfügbar über die wichtigsten Sun Java 3D-URLs, die in den folgenden Ressourcen enthalten sind).

Java 3D hat viele Vorteile, aber was ist mit den Nachteilen? Sie beinhalten:

  • Java 3D ist eine Standarderweiterungs-API. Lizenznehmer von Java-Plattformen haben die Möglichkeit, die API zu implementieren, wenn sie möchten, müssen diese jedoch nicht implementieren. Die Positionierung von Java 3D als Standarderweiterung birgt das Risiko, die Portabilität von Java 3D-Code plattformübergreifend zu verringern. Die meisten Anbieter müssen sich nur schwer tun, um mit Änderungen und Ergänzungen der Kernplattform Schritt zu halten.

  • Java 3D unterliegt strengen Verfügbarkeitsbeschränkungen. Dies ist das Ergebnis des Status von Java 3D als Erweiterungs-API. Der einzige große Anbieter, der derzeit eine Java 3D-Implementierung bereitstellt, ist Sun mit seinen Implementierungen für Solaris und Win32. Im Vergleich zu OpenGL, das für alle Versionen von Unix, Windows und vielen anderen Betriebssystemen verfügbar ist, erscheint die plattformübergreifende Portabilität von Java 3D-Code fraglich.

  • Mit Softwareverfügbarkeitsproblemen gehen Dokumentationsdefizite einher. Sun unternimmt große Anstrengungen, um Entwicklertrainings und Support für Java 3D bereitzustellen, ist jedoch im Vergleich zu den übrigen Bemühungen der Branche zur Dokumentation von OpenGL und seiner Verwendung immer noch unzureichend. Die Website des OpenGL-Konsortiums ist viel tiefer und umfassender als alles, was Sun bisher für Java 3D zusammengestellt hat. Dies ist kein kleiner Punkt: Die relative Komplexität von 3D-Grafik-APIs macht eine gute Dokumentation erforderlich.

  • Java 3D verbirgt Rendering-Pipeline-Details vor dem Entwickler. Da Java 3D eine API auf hoher Ebene ist, werden Details der Rendering-Pipeline absichtlich vor dem Entwickler ausgeblendet, sodass sie für eine erhebliche Anzahl von Problemen ungeeignet ist, bei denen solche Details wichtig sind. (Wir werden später in dieser 3D-Serie das OpenGL-Modell auf niedrigerer Ebene und den Zugriff auf die Rendering-Pipeline erörtern.)

  • Java 3D-Komponenten sind schwergewichtig. Das heißt, sie haben einen nativen Peer (nicht Java), der das Rendering tatsächlich ausführt. Dies kann Ihre GUI-Entwicklung erschweren, wenn Sie Java Swing und seine All-Java- oder Lightweight-Komponenten verwenden. Es gibt einige spezielle Problemumgehungen, aber im Allgemeinen lassen sich leichte und schwere Komponenten nicht gut in denselben Containerobjekten und Fenstern mischen. Weitere Informationen zu Problemen mit leichten und schweren Komponenten finden Sie in den Ressourcen am Ende dieses Artikels.

Java 3D installieren

Nachdem wir die wichtigsten Funktionen und Einschränkungen von Java 3D verstanden haben, können Sie einen Beispielcode ausprobieren.

Java 3D ist in der Beta für Win32 und Solaris verfügbar. Die ausgereiftere Implementierung von Java 3D durch Sun basiert auf OpenGL. Eine Direct3D-Implementierung in Alpha-Qualität ist auch für Win32 verfügbar. Alle benötigen Java 1.2, wobei die neueste Java 3D-Beta Java 1.2 Beta 4 entspricht. Sun hat versprochen, die endgültige Java 3D-Implementierung kurz nach der Veröffentlichung von Java 1.2 zu veröffentlichen, die derzeit für Dezember 1998 geplant ist.

Ein wenig verwirrend: Sun hat Java 3D 1.0-Alpha-Implementierungen veröffentlicht, die der Java 3D 1.0-API entsprachen, für die 1.0-API jedoch nie etwas anderes als Alpha veröffentlicht. Sun änderte dann die API und gab die geänderte Version als Java 3D 1.1-API frei. Dieser Version folgten zwei Versionen der sogenannten 1.1-Beta-Implementierungen. Sun hat versprochen, kurz nach der endgültigen Veröffentlichung der Java 1.2-Plattform eine endgültige API und Implementierung zu veröffentlichen. Hoffentlich hat sich die API stabilisiert und wird nicht noch einmal überarbeitet, da die Welt immer noch auf die endgültige Veröffentlichung einer Implementierung wartet.

Da wir uns in einer zukünftigen Spalte mit Java OpenGL-Bindungen befassen werden, habe ich mich entschlossen, die OpenGL-Version von Java 3D auch in diesen Installationsanweisungen zu sparen und zu verwenden. Wenn Sie die OpenGL-Version für diese Java 3D-Beispiele installieren, verfügen Sie über die Rendering-Bibliotheken, die Sie für die späteren Java-OpenGL-Beispiele benötigen.

Die Softwarekomponenten, die Sie zur Verwendung von Java 3D benötigen, sind:

  • Java 3D-Laufzeit, erhältlich von Sun (kostenlose Anmeldung für Java Developer Connection erforderlich). Stellen Sie sicher, dass Sie die OpenGL-Version von Java 3D für Ihre Plattform auswählen (ich verwende Win32). Ab sofort ist das neueste Win32 Java 3D für OpenGL 1.1 Beta 2 in java3d11-beta2-win32-opengl.exe und wiegt ungefähr 1,7 MB.

  • OpenGL 1.1, gebündelt mit Windows NT 4.0 und Windows 95 OSR 2. Wenn Sie jedoch über die OSR 1-Version von Windows 95 verfügen, können Sie die OpenGL-Unterstützung herunterladen. Die neueste Windows 95-OpenGL 1.1-Implementierung ist von Microsoft als opengl95.exe erhältlich und hat eine Größe von ca. 0,5 MB.

  • Java 1.2, erhältlich von Sun. (Beachten Sie, dass Sun während des Schreibens einen neuen Java 1.2 - Release Candidate 1 veröffentlicht hat. Die Beispiele für die neueste Version werden so schnell wie möglich aktualisiert.) Java 3D ist an die 1.2-Plattform gekoppelt, und Sun hat dies auf der Website angegeben Java3d-Interest-Mailingliste, die kein Interesse daran hat, die API zu entkoppeln und sie mit früheren Plattformversionen verfügbar zu machen.

Optional können Sie auch die Java 3D-Dokumentation und den Beispielcode herunterladen. Beide sind über denselben Link wie die Java 3D-Laufzeit verfügbar.

Beachten Sie, dass Sie die CLASSPATH-Umgebungsvariablen nicht mehr festlegen müssen, damit Ihre ausführbaren Java- oder Appletviewer-Dateien Erweiterungsbibliotheken finden. Mit Java 1.2 hat Sun endlich ein Standarderweiterungsverzeichnis erstellt. Dieses Verzeichnis befindet sich unter / jre / lib / ext / in Ihrem JDK-Installationsverzeichnis. Auf meinem System ist beispielsweise Java 1.2 Beta 4 installiert unter:

C:\jdk1.2beta4\

und das Standarderweiterungsverzeichnis befindet sich unter:

C:\jdk1.2beta4\jre\lib\ext\

Alle Erweiterungsbibliotheken sollten ihre JAR-Archive zur Installationszeit in diesem Erweiterungsverzeichnis ablegen, und alle Standard-JDK-Tools können hier nach den erforderlichen Klassendateien suchen.

Für Suns Java 3D umfassen diese Archive sowohl öffentliche (in der Java 3D-API-Spezifikation dokumentiert) als auch private (Sun-implementierungsspezifisch) Klassen. Öffentliche Klassenarchive umfassen:

  • j3dcore.jar- Enthält Klassendateien für das öffentliche Java 3D-Paket javax.media.j3d.

  • vecmath.jar- Enthält Klassen für javax.vecmath.

Private Archive umfassen:

  • j3daudio.jar- Archiviert die com.sun.j3d.audioKlassen, die Unterstützung für räumliches Audio auf einer benutzerdefinierten Kopie des Java-Teils der Java Sound-Headspace-basierten Audio-Engine aufbauen, die in Java 1.2 debütiert.

  • j3dutils.jar- Verkapselt eine Vielzahl von Sun-Dienstprogrammklassen in insgesamt 16 Paketen und Unterpaketen darunter com.sun.j3d. Ich werde mich in der Fortsetzung unserer Java 3D-Diskussion im nächsten Monat eingehender mit diesen Paketen befassen.

  • j3dutilscontrib.jar- Archiviert nützliche Dienstprogramme, die von anderen zu Suns Bemühungen beigetragen haben. Unter der com.sun.j3dHierarchie befinden sich sieben Pakete , einschließlich des com.sun.j3d.utils.trackersoben genannten Codes. In der Spalte des nächsten Monats finden Sie weitere Informationen zu den Paketen in diesem Glas.

Bitte beachten Sie, dass in der Theorie können Sie instanziiert und Call - Methoden , die auf einen der in Nicht - Standard - Paketen bereitgestellt Klassen wie com.sun, aber caveat emptor : Es gibt keine Garantie , dass sie auf der Plattform , auf dem Code ausführt verfügbar sein werden. In der aktuellen Praxis ist Java 3D nur von Sun verfügbar, daher verwenden viele Entwickler tatsächlich Klassen in den privaten Archiven von Sun. Sie sollten sich des möglichen Kompromisses bei der Portabilität bewusst sein, der mit dieser Entscheidung verbunden ist.

Es ist auch keine Magie, wie die öffentlichen und privaten Java 3D-Klassen mit Systemressourcen zusammenarbeiten. Sun installiert native Bibliotheken in J3D.dllund j3daudio.dllunter dem /jre/bin/Verzeichnis. Die Java 3D-Klassen verwenden native Methoden, um diese DLLs aufzurufen und eine Schnittstelle zur Win32-Plattform und zur OpenGL-Rendering-Bibliothek herzustellen. (Ähnliche Bibliotheken existieren für Solaris-Implementierungen.)

Ein letzter Hinweis zur Installation: Die OpenGL-Rendering-Pipeline nutzt die OpenGL-Beschleunigungshardware, um Ihre Grafikanwendungen zu beschleunigen. Für die Zwecke dieser Spalte sollten Sie jedoch in der Lage sein, mit den Beispielen ohne spezielle Hardware zu experimentieren. (Tatsächlich entwickle ich alle Beispiele auf einem Pentium 150-MHz-MMX-Laptop ohne OpenGL-Beschleunigungshardware.) Wenn Sie an Beschleunigungskarten interessiert sind, sollten Sie die OpenGL-Website oder die Java 3D-Mailingliste besuchen ( Weitere Informationen finden Sie unter Ressourcen. Ich habe vor, in der Java 3D-Spalte des nächsten Monats auch ein wenig mehr Informationen zur Beschleunigungshardware aufzunehmen.

Konstruieren des Ansichtszweigs der Szene

Wie bereits erwähnt, besteht eine der größten Stärken des Szenengrafik- Grafikmodells darin, dass unerfahrene Grafikprogrammierer ihren Anwendungen 3D hinzufügen können. Traditionell mussten 3D-Programmierer angeben, wo und wie einzelne Linien oder andere Grafikprimitive gezeichnet werden sollen. Mithilfe eines Szenendiagramms erstellt der Programmierer jedoch einfach eine baumartige Struktur, die Knoten enthält, die zu rendernde Objekte darstellen, sowie Anweisungen zum Rendern (z. B. wo sich der auf dem Monitor angezeigte Ansichtspunkt befindet, physische Geometrie der 3D-Welt des Programmierers schafft und relative Abstände zwischen Dingen).