【发布时间】:2014-10-15 08:49:45
【问题描述】:
我是一名计算机科学专业的学生,我需要让 Java3D 在我的 Mac 上运行,这样我才能完成强制性作业。
我使用 IntelliJ 作为我的 IDE,它适用于 Java 和 Python。但我正在努力使其适用于 Java3D。
我尝试使用我的 google-fu,但无济于事。所以我来这里寻求一些指导。我尝试了多个教程/指南,以下是我尝试过的:
我试图运行的代码来自http://www.java3d.org/starting.html
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.geometry.ColorCube;
import javax.media.j3d.BranchGroup;
public class Hello3d {
public Hello3d(){
SimpleUniverse universe = new SimpleUniverse();
BranchGroup group = new BranchGroup();
group.addChild(new ColorCube(0.3));
universe.getViewingPlatform().setNominalViewingTransform();
universe.addBranchGraph(group);
}
public static void main( String[] args ) {
new Hello3d();
}
}
我尝试的第一件事是安装 Java3d Jar 并将它们添加到依赖项中:(我从:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-client-419417.html#java3d-1.5.1-oth-JPR
但我得到了错误:
Exception in thread "J3D-Renderer-1" java.lang.NoClassDefFoundError: apple/awt/ComponentModel
at com.sun.opengl.impl.JAWT_DrawingSurface.GetDrawingSurfaceInfo0(Native Method)
at com.sun.opengl.impl.JAWT_DrawingSurface.GetDrawingSurfaceInfo(JAWT_DrawingSurface.java:56)
at com.sun.opengl.impl.macosx.MacOSXOnscreenGLDrawable$1.run(MacOSXOnscreenGLDrawable.java:165)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.opengl.impl.macosx.MacOSXOnscreenGLDrawable.lockSurface(MacOSXOnscreenGLDrawable.java:163)
at com.sun.opengl.impl.macosx.MacOSXOnscreenGLContext.makeCurrentImpl(MacOSXOnscreenGLContext.java:57)
at com.sun.opengl.impl.GLContextImpl.makeCurrent(GLContextImpl.java:134)
at javax.media.j3d.JoglPipeline$QueryCanvas.doQuery(JoglPipeline.java:9049)
at javax.media.j3d.JoglPipeline.getBestConfiguration(JoglPipeline.java:8797)
at javax.media.j3d.Renderer.doWork(Renderer.java:514)
at javax.media.j3d.J3dThread.run(J3dThread.java:275)
Caused by: java.lang.ClassNotFoundException: apple.awt.ComponentModel
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 11 more
然后我得知 java3d 已经安装在 mac 上,我也做了同样的事情。我将罐子添加到我的依赖项中。但是我遇到了同样的错误。
我最后一次尝试是遵循本指南:http://gouessej.wordpress.com/2012/08/01/java-3d-est-de-retour-java-3d-is-back/
我下载了 jars,将它们全部放在同一个文件夹中,并将它们添加到我的依赖项中。但是,我又遇到了同样的错误。
现在,这可能都是我的错(我不确定是否必须将它们添加到我的依赖项中然后添加新的罐子,但是当我添加不同类型的 API 时它总是有效)或者它可能更复杂。希望你们中的一些人遇到了同样的问题,可以帮助我。
提前致谢。
编辑:在尝试了 gouessej 所说的之后,我得到了这个错误:
JavaVM WARNING: JAWT_GetAWT must be called after loading a JVM
AWT not found
Exception in thread "main" java.lang.NoClassDefFoundError: apple/awt/CGraphicsDevice
at javax.media.j3d.GraphicsConfigTemplate3D.<clinit>(GraphicsConfigTemplate3D.java:55)
at com.sun.j3d.utils.universe.SimpleUniverse.getPreferredConfiguration(SimpleUniverse.java:368)
at com.sun.j3d.utils.universe.Viewer.<init>(Viewer.java:348)
at com.sun.j3d.utils.universe.Viewer.<init>(Viewer.java:298)
at com.sun.j3d.utils.universe.SimpleUniverse.<init>(SimpleUniverse.java:215)
at com.sun.j3d.utils.universe.SimpleUniverse.<init>(SimpleUniverse.java:177)
at com.sun.j3d.utils.universe.SimpleUniverse.<init>(SimpleUniverse.java:88)
at MAIN.<init>(MAIN.java:22)
at MAIN.main(MAIN.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: java.lang.ClassNotFoundException: apple.awt.CGraphicsDevice
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 14 more
【问题讨论】:
-
你不能只使用支持 3D 的 JavaFX 吗?它是从 Java 8 开始的标准库的一部分。
-
@icza 我一直在努力理解它,但它看起来真的很复杂。但话又说回来,我只是匆匆瞥了一眼。我可能会再试一次。但如果我能让 java3d 工作,我会更喜欢它。我的老师使用它,我的朋友可能也会使用它。因此,如果我在某些事情上遇到困难,我可以从他们那里获得帮助,而不是在谷歌上搜索并希望有人和我有同样的问题(相关 XKCD - “古人的智慧”:P)
-
@icza 你的回答离题了。我受够了人们宣传他们的 API 而不是提供一些帮助。 JavaFX 3D API 有一些优点和一些缺点,它具有更高的最低要求,更高的内存占用,它的性能在不同平台之间并不一致,并且它的功能比大多数用 Java 编写的场景图 API 少得多。实际上,如果你真的想使用更强大的场景图形 API,不如使用 JogAmp 的 Ardor3D Continuation 或 JMonkeyEngine。
-
@gouessej 没必要生气。首先,我没有发布任何答案,我只是评论。评论可以是“任何东西”。其次,标准库不是我的 API。我与 Oracle 没有任何联系。我提出了一些可以解决提问者最初的问题的方法,即他无法启动一个 3D 库,如果他使用了 JavaFX,那么它一开始就不会存在,因为它是 JRE8 的一部分。由于其他信息(例如他想使用 3D 库的目的)没有发布,所以不清楚他为什么想要那个库,所以我建议了一个无故障的替代方案。
-
即使使用作为 J2SE 一部分的标准 Java API 最初比使用 3rd 方库更容易,但没有“无故障”替代方案,因为无需安装任何东西。恕我直言,提问者在安装 Java 3D 方面寻求帮助,他没有问要使用哪个 3D 库,这就是为什么我认为您的评论是题外话。 SO 上的人应避免建议使用其他库,除非该库没有解决方案。如果您的汽车出现问题,建议您从另一家汽车制造商处购买另一辆汽车而不是修理它,这将无济于事。
标签: java macos intellij-idea java-3d