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 concentra 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 il a été maintenu pendant plusieurs années 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 was maintained for years by an employee of the company Ausenco Sandwell.
L’exemple ci-dessus affichant une pyramide jaune vient du site web java3d.org de Greg Hopkins. The example above displaying a yellow pyramid comes from Greg Hopkins’s website java3d.org.

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 du système d’exploitation 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 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) à 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 of the operating system so that different systems can work) and the maintenance quite heavy for an highly questionable gain. Only the rendering system based on JOGL 2 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) to the Java 3D rendering code.

Documentation Java de l’API

Java API documentation

La documentation Java de l’API de Java 3D 1.6 se trouve ici :

The Java API documentation of Java 3D 1.6 is located here:

La documentation Java de l’API de Java 3D 1.7.0-pre1 se trouve ici :

The Java API documentation of Java 3D 1.7.0-pre1 is located here:

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 d’Oracle sont ici, celles d’AdoptOpenJDK sont ici et ses builds binaires sont ) et Oracle Java. Java 3D 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 of Oracle are here, those of AdoptOpenJDK are here and its 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.
Java 3D 1.6.0 nécessite Java 1.6 et Java 3D 1.7 nécessite Java 1.8. Java 3D 1.6.0 requires Java 1.6 and Java 3D 1.7 requires Java 1.8.

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
  • jogamp-fat.jar
Les JARs de Java 3D 1.6 sont ici. Les JARs de Java 3D 1.7 sont ici. The JARs for Java 3D 1.6 are here. The JARs for Java 3D 1.7 are here.
Le fat JAR de JogAmp (JOGL, JOAL, JOCL et GlueGen) est ici. The JogAmp (JOGL, JOAL, JOCL and GlueGen) fat JAR is 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 et de les mettre dans le classpath de votre programme Java. 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) ni dans un répertoire mentionné dans la variable d’environnement CLASSPATH du système d’exploitation 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. Ne confondez pas le classpath de votre programme Java avec celui de votre système d’exploitation! Installer une bibliothèque tierce dans le JRE ou le JDK n’est pas plus sûr et est source d’erreurs. You just have to copy all JARs above into the same directory and put them into the classpath of your Java program. 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) nor in a directory mentioned in the CLASSPATH environment variable of the operating system 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. Don’t make a confusion between the classpath of your Java program and the one of your operating system! Installing a third party library in the JRE or the JDK isn’t safer and is error prone.

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 j3dcore.jar:j3dutils.jar:vecmath.jar:jogamp-fat.jar:[1] [2]
Utilisez l’option « –class-path » ou « -cp » de la même manière pour compiler votre programme avec javac. Use the option « –class-path » ou « -cp » in the same way to compile your program with javac.
java --add-opens java.desktop/sun.awt=ALL-UNNAMED -cp j3dcore.jar:j3dutils.jar:vecmath.jar:jogamp-fat.jar:[1] [2]
Utilisez plutôt la ligne de commande ci-dessus si vous utilisez Java >= 9, remplacez ALL-UNNAMED par le nom de votre module s’il existe. Use the commande line above if you use Java >= 9, replace ALL-UNNAMED by the name of your module if it exists.

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. Right clic on the project and go to Properties -> Java Build Path -> Libraries. Click on « Add JARs… » and select the JARs above.
Ajoutez « ‐‐add-opens=java.desktop/sun.awt=ALL-UNNAMED » dans « Run As » → « Run Configurations… » → « Arguments » → « VM arguments » si vous utilisez Java >= 9, remplacez ALL-UNNAMED par le nom de votre module s’il existe. Add « ‐‐add-opens=java.desktop/sun.awt=ALL-UNNAMED » into « Run As » → « Run Configurations… » → « Arguments » → « VM arguments » if you use Java >= 9, replace ALL-UNNAMED by the name of your module if it exists.

Netbeans

Netbeans

Dans l’onglet « Project », sélectionnez le noeud « Libraries » -> « Add JAR/Folder » et sélectionnez les JARs ci-dessus. In the « Project » tab, select the « Libraries » node -> « Add JAR/Folder » and select the JARs above.
Ajoutez « -D‐‐add-opens=java.desktop/sun.awt=ALL-UNNAMED » dans « Project Properties » → « Run » → « VM Options » si vous utilisez Java >= 9, remplacez ALL-UNNAMED par le nom de votre module s’il existe. Add « -D‐‐add-opens=java.desktop/sun.awt=ALL-UNNAMED » into « Project Properties » → « Run » → « VM Options » if you use Java >= 9, replace ALL-UNNAMED by the name of your module if it exists.

Maven

Maven

Maven est un outil d’automatisation de production de logiciels Java. Java3D est disponible sur le dépôt Maven de JogAmp. Maven is a Java software build automation tool. Java3D is available on the JogAmp Maven repository.
N.B : Java3D n’est pas sur Maven Central mais d’anciennes versions et des fourches de ce projet y sont. Vous devez utiliser les versions de Java3D du dépôt Maven de JogAmp pour bénéficier de nos corrections et de nos évolutions. N.B : Java3D isn’t on Maven Central but some old versions and some forks of this project are in it. You must use the versions of Java3D of the JogAmp Maven repository to benefit of our fixes and of our evolutions.
Depuis mai 2023, il existe un moyen simple de démarrer un projet avec Maven et Java3D, il vous suffit d’insérer l’exemple ci-dessous dans le fichier nommé pom.xml. As of May 2023, there is an easy way to start a project with Maven and Java3D, just insert the example below into the file named pom.xml.
<repositories>
    <repository>
        <id>jogamp-remote</id>
        <name>jogamp test mirror</name>
        <url>https://www.jogamp.org/deployment/maven/</url>
        <layout>default</layout>
    </repository>
    <repository>
        <id>jogamp-java3d-remote</id>
        <name>jogamp java3d test mirror</name>
        <url>https://www.jogamp.org/deployment/maven-java3d/</url>
        <layout>default</layout>
     </repository>
</repositories>
<dependencyManagement>
    <dependencies>
        <dependency>        
            <groupId>org.jogamp.gluegen</groupId>
            <artifactId>gluegen-rt-main</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>        
            <groupId>org.jogamp.jogl</groupId>
            <artifactId>jogl-all-main</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.jogamp.joal</groupId>
            <artifactId>joal-main</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.jogamp.java3d</groupId>
            <artifactId>java3d-core</artifactId>
            <version>1.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.jogamp.java3d</groupId>
            <artifactId>java3d-utils</artifactId>
            <version>1.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.jogamp.java3d</groupId>
            <artifactId>vecmath</artifactId>
            <version>1.7.1</version>
        </dependency>
    </dependencies> 
</dependencyManagement>

Gradle

Gradle

Depuis mai 2023, il existe un moyen simple de démarrer un projet avec Gradle et Java3D, il vous suffit d’ajouter l’exemple ci-dessous dans le fichier nommé build.gradle. As of May 2023, there is an easy way to start a project with Gradle and Java3D, just add the example below into the file named build.gradle.
repositories {
    mavenCentral()
    maven { url "https://jogamp.org/deployment/maven" }
    maven { url "https://jogamp.org/deployment/maven-java3d" }
    maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
}

dependencies {
  implementation 'org.jogamp.gluegen:gluegen-rt-main:2.4.0'
  implementation 'org.jogamp.joal:joal-main:2.4.0'
  implementation 'org.jogamp.jogl:jogl-all-main:2.4.0'
  implementation 'org.jogamp.java3d:java3d-core:1.7.1'
  implementation 'org.jogamp.java3d:java3d-utils:1.7.1'
  implementation 'org.jogamp.java3d:vecmath:1.7.1' 
}

Compilation de la bibliothèque

How to build the library

Il est possible de « construire » cette bibliothèque à partir de son code source en tapant les lignes de commande suivantes (Ant, wget et Git sont requis) : It’s possible to build this library from its source code by entering the following command lines (Ant, wget and Git are required):
Il est possible de « construire » Java 3D 1.7 à partir de son code source en utilisant Maven. It’s possible to build Java 3D 1.7 from its source code by using Maven.

Résolution des problèmes

Troubleshooting

Multi-plateforme

Cross-platform

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

Avoid the loading of obsolete versions 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 versions of Java 3D installed as an extension (which can prove to be 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.
Attention : Cette « astuce » peut casser des fonctionnalités de base de Java implémentées sous forme d’extensions, notamment le support des archives JAR et ZIP dans NIO 2 : java.nio.file.FileSystemNotFoundException: Provider « jar » not installed Warning: This « trick » can break some core features of Java implemented as extensions, especially the support of JAR and ZIP archives in NIO 2: java.nio.file.FileSystemNotFoundException: Provider « jar » not installed
Il existe une solution plus fiable mais plus pénible à mettre en œuvre : modifier les noms des paquetages dans javax.media pour JOGL et Java 3D puis les recompiler. Ce problème est réglé pour JOGL depuis sa version 2.3.1 d’après ce rapport de bogue et dans Java 3D 1.7.0. There is a more reliable but more difficult to implement solution: modify the names of the packages in javax.media for JOGL and Java 3D and then recompile them. The problem has been resolved for JOGL in its version 2.3.1 according to this bug report and in Java 3D 1.7.0.

Éviter les erreurs du type « package javax.media does not exist »

Avoid the errors of the type « package javax.media does not exist »

Assurez-vous que les JARs de Java 3D sont bien dans votre classpath. Si tel est le cas, remplacez les JARs de Java 3D 1.7 par les JARs de Java 3D 1.6 (qui utilise l’espace de nommage des paquetages « javax.media ») ou bien modifiez votre code source pour utiliser l’espace de nommage des paquetages « org.jogamp » avec les JARs de Java 3D 1.7. Make sure that the JARs of Java 3D are really in your classpath. If that’s the case, replace the JARs of Java 3D 1.7 by the JARs of Java 3D 1.6 (that uses the package namespace « javax.media ») or modify your source code to use the package namespace « org.jogamp » with the JARs of Java 3D 1.7.

GNU Linux

GNU Linux

Conflit avec une version obsolète

Conflict with an obsolete version

Si vous obtenez une java.lang.NoClassDefFoundError ou java.lang.NoSuchMethodError même en suivant scrupuleusement mes instructions, désinstallez les versions obsolètes de Java 3D, JOGL ou GlueGen au moins le temps de faire vos développements (il se peut que des applications basées sur ces bibliothèques en aient besoin) soit en désinstallant les paquetages correspondants soit en supprimant leurs JARs des répertoires dans lesquels il est déconseillé d’installer Java 3D listés dans la rubrique précédente. If you get a java.lang.NoClassDefFoundError or a java.lang.NoSuchMethodError even by scrupulously following my instructions, uninstall all obsolete versions of Java 3D, JOGL or GlueGen at least the time to do your development (some applications based on these libraries may need them) either by uninstalling the corresponding packages or by removing their JARs from the directories in which it is discouraged to install Java 3D listed in the previous section.

Mac OS X

Mac OS X

Conflit avec une version obsolète

Conflict with an obsolete version

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

Bad version of Java

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, assurez-vous que ce n’est pas cette version qui est utilisée. 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, make sure that it’s not this version that is used.

Windows

Windows

Conflit avec une version obsolète

Conflict with an obsolete version

Si vous obtenez une java.lang.NoClassDefFoundError ou java.lang.NoSuchMethodError même en suivant scrupuleusement mes instructions, désinstallez les versions obsolètes de Java 3D, JOGL ou GlueGen au moins le temps de faire vos développements (il se peut que des applications basées sur ces bibliothèques en aient besoin) en supprimant leurs JARs des répertoires dans lesquels il est déconseillé d’installer Java 3D listés dans la rubrique précédente. If you get a java.lang.NoClassDefFoundError or a java.lang.NoSuchMethodError even by scrupulously following my instructions, uninstall all obsolete versions of Java 3D, JOGL or GlueGen at least the time to do your development (some applications based on these libraries may need them) by removing their JARs from the directories in which it is discouraged to install Java 3D listed in the previous section.

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 still very dependent on AWT which will prevent it from running under Android, its performance problems remain and its lack of modern features puts it far 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 :

P.S:

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

A propos 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 cross-platform free softwares.
Cet article, publié dans Jeux vidéo, est tagué , , , . Ajoutez ce permalien à vos favoris.