Java 3D
大昔に作ったJava3Dのアプリケーションを復活させようと悪戦苦闘しているのですが、最近(といっても2012年)にJava3DはOpenGLベースに移行して、細々と開発が続いていることがわかりました。
https://gouessej.wordpress.com/2012/08/01/java-3d-est-de-retour-java-3d-is-back/
https://jogamp.org/wiki/index.php/Java3D_FAQ
(参考)
いまだに残っているoracleのページのJava 3Dのバージョンは1.5.1です。
筆者はWindows 10環境ではインストール試していません。
https://www.oracle.com/technetwork/java/javase/tech/index-jsp-138252.html
Java 3Dの開発環境の構築
https://jogamp.org/deployment/java3d/ のダウンロードページからjarなどを落としてもよかったのですが、mavenでプロジェクト管理しているので、多少古いバージョンの1.6.0.1をpom.xmlに追記して対応しました。https://mvnrepository.com/artifact/com.massisframework.j3d/java3d-core
https://mvnrepository.com/artifact/com.massisframework.j3d/vecmath
<!-- https://mvnrepository.com/artifact/com.massisframework.j3d/vecmath --> <dependency> <groupid>com.massisframework.j3d</groupid> <artifactid>vecmath</artifactid> <version>1.6.0.1</version> </dependency> <!-- https://mvnrepository.com/artifact/com.massisframework.j3d/java3d-core --> <dependency> <groupid>com.massisframework.j3d</groupid> <artifactid>java3d-core</artifactid> <version>1.6.0.1</version> </dependency>(もちろん、https://jogamp.org/deployment/java3d/から落としてきたjarを自分でローカルレポジトリに登録するのもあり。2020年3月時点の最新版は1.7.0-finalです。)
依存関係のあるjoglの下記のjarもダウンロードされます。
- jogl-all-2.3.2.jar
- jogl-all-main-2.3.2.jar
- gluegen-2.3.2.jar
- jogl-all-2.3.2-natives-xxx.jar (Android, Windows, Macなど各環境依存のjar)
これでプログラムを実行したところ、下記のExceptionが発生して実行失敗。
Warning: Caught Exception while retrieving executable temp base directory: java.io.IOException: Could not determine a temporary executable directory at com.jogamp.common.util.IOUtil.getTempDir(IOUtil.java:1287) at com.jogamp.common.util.cache.TempFileCache.<clinit>(TempFileCache.java:81) at com.jogamp.common.util.cache.TempJarCache.initSingleton(TempJarCache.java:88) at com.jogamp.common.os.Platform$1.run(Platform.java:309) at java.base/java.security.AccessController.doPrivileged(AccessController.java:310) at com.jogamp.common.os.Platform.<clinit>(Platform.java:287) at com.jogamp.opengl.GLProfile.<clinit>(GLProfile.java:147) at jogamp.opengl.ThreadingImpl$1.run(ThreadingImpl.java:83) at jogamp.opengl.ThreadingImpl$1.run(ThreadingImpl.java:66) at java.base/java.security.AccessController.doPrivileged(AccessController.java:310) at jogamp.opengl.ThreadingImpl.<clinit>(ThreadingImpl.java:66) at com.jogamp.opengl.Threading.disableSingleThreading(Threading.java:164) at javax.media.j3d.JoglPipeline.initialize(JoglPipeline.java:129) at javax.media.j3d.Pipeline.createPipeline(Pipeline.java:92) at javax.media.j3d.MasterControl.loadLibraries(MasterControl.java:858) at javax.media.j3d.VirtualUniverse.<clinit>(VirtualUniverse.java:267) at javax.media.j3d.Canvas3D.<clinit>(Canvas3D.java:3801) at com.dukesoftware.software.potential.RobotPotentialEditor.<init>(RobotPotentialEditor.java:33) at com.dukesoftware.software.potential.RobotPotentialEditor.main(RobotPotentialEditor.java:30) Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: C:\Users\dukes\git\repository\java_util\natives\windows-amd64\\gluegen-rt.dll at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2620) at java.base/java.lang.Runtime.load0(Runtime.java:765) at java.base/java.lang.System.load(System.java:1866) at com.jogamp.common.jvm.JNILibLoaderBase.loadLibraryInternal(JNILibLoaderBase.java:624) at com.jogamp.common.jvm.JNILibLoaderBase.access$000(JNILibLoaderBase.java:63) at com.jogamp.common.jvm.JNILibLoaderBase$DefaultAction.loadLibrary(JNILibLoaderBase.java:106) at com.jogamp.common.jvm.JNILibLoaderBase.loadLibrary(JNILibLoaderBase.java:487) at com.jogamp.common.os.DynamicLibraryBundle$GlueJNILibLoader.loadLibrary(DynamicLibraryBundle.java:421) at com.jogamp.common.os.Platform$1.run(Platform.java:317) at java.base/java.security.AccessController.doPrivileged(AccessController.java:310) at com.jogamp.common.os.Platform.<clinit>(Platform.java:287) at com.jogamp.opengl.GLProfile.<clinit>(GLProfile.java:147) at jogamp.opengl.ThreadingImpl$1.run(ThreadingImpl.java:83) at jogamp.opengl.ThreadingImpl$1.run(ThreadingImpl.java:66) at java.base/java.security.AccessController.doPrivileged(AccessController.java:310) at jogamp.opengl.ThreadingImpl.<clinit>(ThreadingImpl.java:66) at com.jogamp.opengl.Threading.disableSingleThreading(Threading.java:164) at javax.media.j3d.JoglPipeline.initialize(JoglPipeline.java:129) at javax.media.j3d.Pipeline.createPipeline(Pipeline.java:92) at javax.media.j3d.MasterControl.loadLibraries(MasterControl.java:858) at javax.media.j3d.VirtualUniverse.<clinit>(VirtualUniverse.java:267) at javax.media.j3d.Canvas3D.<clinit>(Canvas3D.java:3801) at com.dukesoftware.software.potential.RobotPotentialEditor.<init>(RobotPotentialEditor.java:33) at com.dukesoftware.software.potential.RobotPotentialEditor.main(RobotPotentialEditor.java:30)色々調べたところ、gluegen-rt-mainが必要なことがわかったので、pom.xmlに下記の記述を追加。
<!-- https://mvnrepository.com/artifact/org.jogamp.gluegen/gluegen-rt-main --> <dependency> <groupId>org.jogamp.gluegen</groupId> <artifactId>gluegen-rt-main</artifactId> <version>2.3.2</version> </dependency>これでプログラムを実行したところ無事Java 3Dのプログラムが起動しました。 Java 3D 1.5.1当時に書いたコードから特に変更を加えていませんが、コンパイルと実行 (あくまでちょっと起動させただけ)はすんなりと進みました。
コメント
Java3D、楽しいですよね。