Java 3D est de retour [Java 3D is back]

Java 3D with JOGL 2.0, first success
Français English
Sommaire :

Summary :


Introduction


Introduction

Si vous m’aviez dit l’an dernier que j’allais initier le portage de Java 3D vers JOGL 2.0, je ne vous aurais certainement pas cru. C’est pourtant ce qui s’est passé le 10 février 2012. Dès janvier 2008, Sun Microsystems se concentrait sur Prism, le scénographe de JavaFX, au détriment de Java 3D. Depuis, ce dernier n’a pas évolué, il n’a reçu que des mises à jour correctives relativement mineures. Ce portage (que j’ai fait bénévolement) ne m’a pris que quelques heures et c’est désormais maintenu par un salarié de la société Ausenco Sandwell. If you had told me last year that I would initiate the porting of Java 3D to JOGL 2.0, I wouldn’t certainly have believed you. This is what happened February, 10th, 2012. In January 2008, Sun Microsystems focused on Prism, JavaFX scenegraph, to the detriment of Java 3D. Since, it has not changed, it has only received relatively minor corrective updates. This port (that I did for free) only took me a few hours and is now maintained by an employee of the company Ausenco Sandwell.

Nouveautés


News

Harvey, le salarié en question, a réussi à rendre Java 3D plus stable bien avant mon intervention, il a également réparé le rendu offscreen, il a remis d’aplomb la procédure de compilation et de création des JARs, il a supprimé beaucoup de code mort et il a retiré quelques fonctionnalités peu utilisées et potentiellement boguées (notamment le support du langage Cg pour les shaders Nvidia). Java 3D disposait de trois systèmes de rendu basés sur des APIs différentes pour l’accélération graphique, deux d’entre eux s’appuyaient sur OpenGL et le dernier s’appuyait sur Direct3D. Le système de rendu utilisé par défaut dépendait de la plateforme et pouvait être sélectionné avec la propriété « j3d.rend ». Cela rendait l’installation assez compliquée (il fallait prévoir plusieurs cas de figures en configurant le classpath et le library path de telle sorte que les différents systèmes puissent fonctionner) et la maintenance assez lourde pour une plus-value très discutable. Seul le système de rendu basé sur JOGL 2.0 a été conservé. Ainsi, il n’y a plus aucun risque de conflit avec Direct3D (pensez quand même à désactiver le pipeline Java 2D basé sur Direct3D si nécessaire), il est possible de mélanger du code de rendu OpenGL (avec ou sans JOGL 2.0) à du code de rendu Java 3D. Harvey, the employee in question, succeeded in driving Java 3D more stable long before my intervention, he also repaired the offscreen rendering, he righted the procedure for compiling and creating JARs, it deleted a lot of dead code and removed some rarely used and potentially buggy features (including support of Nvidia Cg language for shaders). Java 3D had three rendering systems based on different APIs for graphics acceleration, two of them were based on OpenGL and the last was based on Direct3D. The rendering system used by default depended on the platform and could be selected with the property « j3d.rend ». This made the installation quite complicated (we had to plan several scenarios by setting the classpath and library path so that different systems can work) and the maintenance quite heavy for an highly questionable gain. Only the rendering system based on JOGL 2.0 has been retained. Thus, there is no risk of conflict with Direct3D (still think about disabling the Java 2D pipeline based on Direct3D if necessary), it is possible to mix OpenGL rendering code (with or without JOGL 2.0) to the Java 3D rendering code.

Installation


Installation


Java


Java

Vous avez besoin du kit de développement Java (JDK). Java 3D 1.6.0 est compatible avec OpenJDK (les instructions d’installation pour GNU Linux sont ici et les builds binaires non officiels sont ) et Oracle Java. Java3D 1.6.0 est incompatible avec Apple Java qui est déprécié depuis OS X 10.6. You need the Java development kit (JDK). Java 3D 1.6.0 is compatible with OpenJDK (the installation instructions for GNU Linux are here and the unofficial binary builds are here) and Oracle Java. Java 3D 1.6.0 is incompatible with Apple Java which is deprecated since OS X 10.6.

Téléchargement


Download

L’installation est très simple. Vous avez besoin des JARs suivants : The installation is very simple. You need the following JARs:
  • j3dcore.jar
  • j3dutils.jar
  • vecmath.jar
  • jogl-all.jar
  • jogl-all-natives-linux-amd64.jar
  • jogl-all-natives-linux-i586.jar
  • jogl-all-natives-macosx-universal.jar
  • jogl-all-natives-windows-amd64.jar
  • jogl-all-natives-windows-i586.jar
  • joal.jar
  • joal-natives-linux-amd64.jar
  • joal-natives-linux-i586.jar
  • joal-natives-macosx-universal.jar
  • joal-natives-windows-amd64.jar
  • joal-natives-windows-i586.jar
  • gluegen-rt.jar
  • gluegen-rt-natives-linux-amd64.jar
  • gluegen-rt-natives-linux-i586.jar
  • gluegen-rt-natives-macosx-universal.jar
  • gluegen-rt-natives-windows-amd64.jar
  • gluegen-rt-natives-windows-i586.jar
Les JARs de Java 3D sont ici : The JARs for Java 3D are here:
Les JARs de JOGL, JOAL et GlueGen sont ici. The JARs for JOGL, JOAL and GlueGen are here.
Je vous conseille de bien récupérer tous les JARs, y compris ceux qui ne sont pas nécessaires pour l’exécution de votre programme sur votre système d’exploitation car ils vous seront utiles pour le déployer sur Internet sous forme d’applet ou sous forme d’application Java Web Start. I advise you to get all JARs, including those that are not necessary for the execution of your program on your operating system because they will be useful to deploy it on Internet as an applet or as a Java Web Start application.
Il vous suffit de copier tous les JARs ci-dessus dans le même répertoire (de sorte que JogAmp sache où trouver les bibliothèques natives pendant l’extraction et le chargement automatiques) et de mettre ceux dont le nom ne contient pas le mot « natives » dans le classpath. Le répertoire choisi ne doit être ni dans la JVM (jre/lib/ext) ni dans les répertoires du mécanisme d’extension (/Library/Java/Extensions/, /System/Library/Java/Extensions/ et /System/Library/Frameworks sous Mac OS X) afin d’éviter tout conflit entre la version que vous utilisez et une version chargée en priorité installée dans un ou plusieurs de ces répertoires. You just have to copy all JARs above into the same directory (so that JogAmp knows where to find the native libraries during the automatic extraction and loading) and put those whose name does not contain the word « natives » into the classpath. The chosen directory must be neither in the JVM (jre/lib/ext) nor in one of the directories of the extension mechanism (/Library/Java/Extensions/, /System/Library/Java/Extensions/ and /System/Library/Frameworks under Mac OS X) in order to avoid any conflict between the version that you use and a version loaded in priority installed in one or several of these directories.

Compilation et exécution


Compilation and execution


Ligne de commande


Command line

Vous pouvez lancer votre programme ainsi en ligne de commande (remplacez « : » par « ; » sous Windows, remplacez [1] par le chemin relatif de votre JAR ou de vos fichiers .class et [2] par le nom complet de la classe principale lequel contient les paquetages et les sous-paquetages) : You can run your program as well in command line (replace « : » by « ; » under Windows, replace [1] by the relative path of your JAR or of your .class files and [2] by the full name of the main class which contains the packages and subpackages):
java -cp gluegen-rt.jar:j3dcore.jar:j3dutils.jar:joal.jar:jogl-all.jar:vecmath.jar:[1] [2]
Utilisez l’option « -classpath » ou « -cp » de la même manière pour compiler votre programme avec javac. Use the option « -classpath » ou « -cp » in the same way to compile your program with javac.

Eclipse


Eclipse

Faites un clic droit sur le projet puis allez dans Properties -> Java Build Path -> Libraries. Cliquez sur « Add JARs… » et sélectionnez les JARs ci-dessus (à l’exception de ceux dont le nom contient le mot « natives »). Right clic on the project and go to Properties -> Java Build Path -> Libraries. Click on « Add JARs… » and select all JARs above (except those whose name contains the word « natives »).

Netbeans


Netbeans

Dans l’onglet « Project », sélectionnez le noeud « Libraries » -> « Add JAR/Folder » et sélectionnez les JARs ci-dessus (à l’exception de ceux dont le nom contient le mot « natives »). In the « Project » tab, select the « Libraries » node -> « Add JAR/Folder » and select all JARs above (except those whose name contains the word « natives »).

Résolution des problèmes


Troubleshooting


Conflit avec une version obsolète de Java 3D sous Mac OS X


Conflict with an obsolete version of Java 3D under Mac OS X

Si vous obtenez un message d’erreur du genre « Exception in thread « main » java.lang.NoClassDefFoundError: apple/awt/CGraphicsDevice » (ou « Exception in thread « J3D-Renderer-1″ java.lang.NoClassDefFoundError: apple/awt/ComponentModel »), désinstallez les versions obsolètes de Java 3D (cela est assez courant sur certaines versions de Mac OS X) au moins le temps de faire vos développements (il se peut que de vieilles applications basées sur Java 3D en aient besoin). Cette erreur se produit avec toutes les versions de Java 3D qui reposent sur JOGL 1 y compris les anciennes pré-versions de Java 3D 1.6. Vous devez supprimer les fichiers JARs et les fichiers .jnilib de Java 3D, JOGL et GlueGen de tous les répertoires dans lesquels les vielles versions de Java 3D sont installées, ce sont les répertoires dans lesquels il est déconseillé d’installer Java 3D listés dans la rubrique précédente. If you get an error message of the type « Exception in thread « main » java.lang.NoClassDefFoundError: apple/awt/CGraphicsDevice » (or « Exception in thread « J3D-Renderer-1″ java.lang.NoClassDefFoundError: apple/awt/ComponentModel »), uninstall the obsolete versions of Java 3D (this is quite common on some versions of Mac OS X) at least the time to do your development (some old applications based on Java 3D may need it). This error occurs with all versions of Java 3D that rely on JOGL 1 including the old pre-versions of Java 3D 1.6. You must remove the JAR files and the .jnilib files of Java 3D, JOGL and GlueGen from all directories in which the old versions of Java 3D are installed, these are the directories in which it is discouraged to install Java 3D listed in the previous section.

Mauvaise version de Java sous Mac OS X


Bad version of Java under Mac OS X

Si vous obtenez un message d’erreur du genre « Exception in thread « main » java.lang.NoClassDefFoundError: sun/awt/CGraphicsDevice », installez OpenJDK ou Oracle Java. Java 3D 1.6 n’est pas compatible avec Apple Java. If you get an error message of the type « Exception in thread « main » java.lang.NoClassDefFoundError: sun/awt/CGraphicsDevice », install OpenJDK or Oracle Java. Java 3D 1.6 isn’t compatible with Apple Java.

Éviter le chargement de versions obsolètes de Java 3D installées comme extensions


Avoid the loading of obsolete versions of Java 3D installed as extensions

Renseigner java.ext.dirs à «  » permet de ne pas utiliser une version de Java 3D installée en tant qu’extension (ce qui peut s’avérer particulièrement utile sous Mac OS X). Cette solution de contournement fonctionne bien sauf avec les applets et les applications Java Web Start comme certaines versions de la JVM ne prennent en compte ce paramètre que s’il est renseigné très tôt, si le support de java-vm-args n’est pas cassé et si ce paramètre est jugé sûr. Vous pouvez empaqueter votre application avec OpenJDK pour résoudre ce problème une fois pour toute. Setting java.ext.dirs to «  » allows to stop using the obsolete version of Java 3D installed as an extension (which is particularly useful under Mac OS X). This workaround works very well except in the applets and in Java Web Start applications as some versions of the JVM take into account this parameter only if it is set very early, if the support of java-vm-args isn’t broken and if this parameter is considered to be safe. You can package your application with OpenJDK to solve this problem once for all.

Conclusion


Conclusion

Cette version 1.6.0 rend Java 3D plus stable et plus facile à utiliser. En s’appuyant sur JOGL 2.0, Java 3D se débarrasse d’une limitation et redevient une solution logicielle pérenne telle quelle. Néanmoins, il reste très dépendant d’AWT ce qui l’empêchera de fonctionner sous Android, ses problèmes de performances subsistent et son manque de fonctionnalités modernes le place loin derrière les scénographes existants, notamment JogAmp’s Ardor3D Continuation, JMonkeyEngine et 3DzzD. This version 1.6.0 drives Java 3D more stable and easier to use. Java 3D gets rid of a limitation thanks to JOGL 2.0 and becomes a durable software solution as is. Nevertheless, it is very dependent on AWT which will prevent from running under Android, its performance problems remain and its lack of modern features puts it behind the existing scenegraphs, including JogAmp’s Ardor3D Continuation, JMonkeyEngine and 3DzzD.
Il reste intéressant essentiellement pour les développeurs disposant de gros volumes de code source basé sur cette API. Il dispose toujours de nombreux tutoriels sur Internet et comme l’API publique n’a pas changé, le passage de Java 3D 1.5.2 à Java 3D 1.6.0 ne nécessite aucune modification du code, j’ai fait le test avec Arabian Flights de Mike Prosser. Xith3D est le scénographe le plus proche de Java 3D mais il semble au point mort depuis quelques années. Si Java 3D est suffisant pour vos projets, n’hésitez pas à vous en servir en toute connaissance de cause. La visualisation 3D en Java ne se résume pas à Java 3D. It is still interesting mainly for developers with large volumes of source code based on this API. It still has many tutorials on the Internet and as the public API hasn’t been modified, the transition from Java 3D 1.5.2 to Java 3D 1.6.0 doesn’t require any code changes, I checked that with Arabian Flights by Mike Prosser. Xith3D is the most similar scenegraph from Java 3D, but it seems at a standstill in recent years. If Java 3D is sufficient for your projects, don’t hesitate to use it knowingly. The 3D visualization in Java doesn’t come down to Java 3D.
P.S : Vous pouvez demander de l’aide sur le forum ou bien sur Github. P.S: You can ask for help on the forum or on Github.
Licence Creative Commons
La photo de cet article est mise à disposition selon les termes de la Licence Creative Commons Attribution – Pas d’Utilisation Commerciale – Pas de Modification 3.0 non transposé
Creative Commons License
The photo of this article is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License
Licence Creative Commons
Cet article est mis à disposition selon les termes de la Licence Creative Commons Attribution – Pas d'Utilisation Commerciale – Partage à l'Identique 3.0 non transposé
Creative Commons License
This article is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
Auteur : Julien Gouesse Author: Julien Gouesse

À propos de gouessej

Ingénieur en informatique, militant politique d'extrême-gauche, développeur de logiciels libres multi-plateformes. Engineer in computer science, far left-wing political activist, developer of free open source cross-platform softwares.
Ce contenu a été publié dans Jeux vidéo, avec comme mot(s)-clef(s) , , , . Vous pouvez le mettre en favoris avec ce permalien.