我知道编辑这个网站吗?

Java 3D

Java 3D is a technology used for 3D visualization in Java. It is used by ImageJ’s 3D Viewer plugin, and hence transitively by other plugins which rely on the 3D Viewer for their visualization, such as TrakEM2 and Simple Neurite Tracer.

Java 3D 的现状

Java 3D 项目最初由 Sun(现在的 Oracle)开发,已放弃数年,取而代之的是 JavaFX 3D。然而,它已被JogAmp社区采用,并且现在仍然保留在那里——尽管不再积极开发。

从新特性的角度来看,Java 3D本质上是一种死技术。ImageJ中3D可视化的未来是sciview插件。但要使sciview与3D Viewer相媲美最终并和3D Viewer,还需要做大量工作因此,ImageJ和Fiji团队正在探索进行此项工作的最佳方法。

Java 3D 的版本

Java 3D 1.5

Sun/Oracle 支持的最后一个 Java 3D 版本是 1.5.2。它被准备为 Java 的扩展,这意味着它需要安装到 Java 运行时环境中,而不是作为普通的 Java 库提供。

它适用于Java 6,但是:

  • 它有限制性许可。
  • 它不适用于 macOS 上的 Java 7 或 8。
  • 它不适用于某些 Windows 系统上的 Java 8(或 7?)。

ImageJ 的 Java 6 版本可与 Java 3D 1.5.2 配合使用,通过启动 3D 查看器并允许其自动安装 Java 3D;有关详细信息,请参阅this page

Java 3D 1.6

Java 3D 1.6 及更高版本是由 JogAmp 维护的社区版本。 Java 3D 1.6 被重写以在 Java 3D 之上工作,并且需要 Java 7 或更高版本。

ImageJ 的 Fiji 发行版本包括 Java 3D 1.6;有关详细信息,请参阅this page

Java 3D故障排除

当Java 3D工作时,护理任务是使用HelpJava3D Properties…。如果显示一个旋转的立方体,但3D Viewer无效,请单击3D Viewer菜单中的PluginsUtilitiesDebuggingTest Java3D

命令行调试

如果这些信息无法解决问题,或者Test Java3D无效,那么您需要call ImageJ from the command line来了解更多信息。

###显示Java3D调试消息

在命令行中,您可以使用选项来显示更多或更少的有关Java3D的信息。

./fiji -Dj3d.debug=true

Windows 特定的东西

在 Windows 上,您可以通过分别传递 -Dj3d.rend=ogl-Dj3d.rend=d3d 在 OpenGL 和 Direct3D 之间进行选择。

另外,某些设置需要保留足够的 RAM,因此您可能需要设置类似 --mem=1200m 的选项(不过,在启动 ImageJ 之前请确保您有足够的可用 RAM!)。如果事实证明存在内存问题,您可以通过单击 ImageJ 的 EditOptionsMemory & Threads… 菜单项进行永久化。

更多 Java 3D 属性

您可以通过设置Java属性来控制Java 3D中的很多内容。请记住,您可以使用命令行设置属性,如下所示:

./fiji -D<property-name>=<property-value>

您可以适当地替换 <property-name><property-values>。您可以有多个这样的选项。

此 Java 3D 属性列表是从现已不存在的 j3d.org 网站中抢救出来的:

物业 价值观 Java 3D 版本 说明  
j3d.rend ogld3d 1.3.2 仅限 Win32。指定应使用哪个底层渲染 API(从而允许在单个计算机上安装 Direct3D 和 OpenGL 本机 DLL。(默认值ogl  
j3d.deviceSampleTime 以毫秒为单位的时间 1.1 非阻塞输入设备的采样时间(默认值为 5ms)。  
j3d.disablecompile 不适用 1.2 1.2如果设置,则会关闭内部 .compile() 场景图的能力。  
j3d.docompaction 是真是假 1.3 1.3默认为真。控制对象在一段时间内不可见时是否从渲染缓存中删除。如果禁用,它们从第一次可见时起一直保留在渲染缓存中,直到从场景图中删除。  
j3d.forceReleaseView 是真是假 1.3.2 默认为 false。如果此标志设置为 true,则在从视图中删除 Canvas3D 后释放视图。如果您在处置 Canvas3D 后出现内存泄漏,则可以使用。注意:将此标志设置为 true 会禁用 View deactivate() 中的错误修复 4267395
j3d.implicitAntialiasing 是真是假 1.3 1.3默认为 false。默认情况下,如果选择多重采样像素格式(或视觉),则禁用全场景抗锯齿。要遵循显示驱动程序多重采样抗锯齿设置(例如强制场景抗锯齿),请将隐式抗锯齿属性设置为 true。这会导致 Java3D 忽略其自己的场景抗锯齿设置,让驱动程序隐式实现该功能  
j3d.optimizeForSpace 是真是假 1.3 1.3默认 true Java3d 仅为复制几何体构建显示列表。设置为 false 将导致 Java3d 使用更多空间为 by-ref 几何图形和不经常更改的几何图形构建显示列表,但速度更快。  
j3d.renderLock 是真是假 1.3 1.3 JDK 需要获取 JAWT_DrawingSurfaceInfo 并在 Java3D 在画布上渲染之前锁定表面。 (请参阅 SDK 中 jdk/include/jawt.h 的注释)默认 false 会导致 Java3D 在渲染之前锁定表面,然后在渲染器线程中进行屏幕渲染时解锁表面。对于离屏渲染和前/后缓冲区交换,不会获取锁。将该值设置为 true 将强制 Java3D 在 swap() 之前使用 AWT 机制锁定表面并进行离屏渲染。这对于某些驱动程序/操作系统解决问题可能很有用。但一般来说,默认值应该可以工作。  
j3d.threadLimit 一个整数 1.2 1.2控制可以并行运行的线程数,无论系统有多少个 cpu。将其设置为“1”将使系统像传统的 OpenGL 渲染循环一样运行。默认值是您计算机中的 CPU 数量 + 1。  
j3d.transparentOffScreen 是真是假 1.3.2 默认为 false。如果此标志设置为 true,则屏幕外画布的背景将设置为透明。  
j3d.usePbuffer 是真是假 1.3.2 默认为真。如果此标志设置为 false,pbuffer 将不会用于离屏渲染。  
j3d.viewFrustumCulling 是真是假 1.3.2 默认为真。如果此标志设置为 false,则渲染器视图视锥体剔除将关闭。 Java 3D 使用 2 遍视图剔除。第一遍是空间树的松散视图剔除,第二遍是在将几何体发送到低级图形 API 之前在渲染器中进行严格的视锥体剔除。该属性用于控制渲染器视图视锥体剔除,并且不会影响第一遍视图剔除。  
javax.media.j3d.compileStats 不适用 ?? 输出场景图编译统计数据  
javax.media.j3d.compileVerbose 不适用 ?? 编译场景图时输出详细消息  

仅 OpenGL

物业 价值观 Java 3D 版本 说明
j3d.backgroundtexture 是真是假 1.3 1.3在 Java3D 1.3 OGL 版本之前,Java3D 使用glDrawPixels() 来渲染背景,众所周知,在 Windows 下这非常慢,因为大多数窗口驱动程序都没有加速该功能。为了解决此性能问题,当前版本默认在 Windows 下使用纹理作为背景(glDrawPixels() 在 Solaris 下默认使用)。将此标志设置为 false 将强制 Java3D 在绘制背景纹理时使用 glDrawPixels() 而不是纹理,以防它在某些驱动程序下提供更好的性能。
j3d.disableSeparateSpecular 是真是假 1.2 1.2默认 true 允许在使用 OpenGL 1.2 时在纹理中使用镜面高光。
j3d.disableXinerama 是真是假 1.3 1.3仅限 Solaris 版本。在启用 X11 Xinerama 扩展的情况下使用双屏环境时,可大幅提升性能。要禁用此功能,您需要 JDK1.4。发行说明中的​​详细信息。
j3d.displaylist 是真是假 1.2 1.2默认 true 使用显示列表(OpenGL 性能增强功能)。如果为 False,则禁用调试。
j3d.g2ddrawpixel 是真是假 1.1 如果为 false,则将使用纹理映射而不是 glDrawPixel 将 Graphics2D 刷新到屏幕。 glDrawPixel 在某些较旧的显卡(Windows)上未加速。
j3d.sharedctx 是真是假 1.2 1.2对于 Solaris,默认为 true;对于 Windows,默认为 false。共享上下文在 OpenGL 中用于显示列表和纹理对象以提高性能。然而,某些驱动程序存在错误,导致奇怪的渲染伪影。这可以用来禁用它们的使用,看看这是否是问题所在。
j3d.sharedstereozbuffer 是真是假 1.2 1.2有些帧缓冲区只有一个 Z 缓冲区,并在左眼和右眼之间共享。这可能是他们没有四缓冲区但仍然可以通过将此标志设置为 true 来支持立体声的原因。
j3d.usecombiners 是真是假 1.3 1.3默认 false,使用标准 OpenGL 所有环境选项。当设置为 true 时,它​​将利用 OpenGL 的 Nvidia 寄存器组合器扩展来实现纹理组合模式,例如 COMBINE_INTERPOLATECOMBINE_DOT3。 (即 GL_NV_register_combiners 而不是标准 OpenGL 调用 glTexEnvi(GL_TEXTURE_ENV, ...))。当驱动程序不支持 OpenGL 扩展 GL_ARB_texture_env_dot3/GL_EXT_texture_env_dot3 但支持 GL_NV_register_combiners 扩展时,可以在 Dot3 纹理等情况下使用它。

仅 Direct3D

物业 价值观 Java 3D 版本 说明
j3d.d3ddevice emulationhardwaretnlhardwarereference 1.2 1.2强制软件使用特定模式进行底层图形加速。仅当您安装了 Direct3D SDK 时,参考选项才可用(可能性很小)。
j3d.d3ddriver idx 1.2 1.2对于 Voodoo 等仅运行全屏 3D 的卡。 idx 是 DirectX 使用 DirectDrawEnumerateEx() 枚举其驱动程序的顺序。该数字从 1 开始。这将强制 Java3D 使用用户指定的驱动程序(如果驱动程序与显示不兼容,则可能会失败)。可以使用 j3d.debug 属性找到驱动程序编号和详细信息。对于在单显示器系统中将纯 3D 卡连接到显卡的典型设置,请使用 idx=2。如果 3D 卡仅支持 3D,这将自动切换到全屏硬件加速模式。
j3d.debug 是真是假 1.1 打印启动和运行信息。对于查找有关底层硬件设置的信息很有用。
j3d.fullscreen PREFERREDREQUIREDUNNECESSARY 1.2 1.2强制 Java3D 以全屏模式运行显卡的选项,这些显卡在使用全屏(非窗口)模式时仅使用硬件加速,就像旧的 Voodoo 系列一样。
j3d.vertexbuffer 是真是假 1.2 1.2 false 关闭顶点缓冲区的使用(相当于 OpenGL 显示列表的 D3D 性能增强功能)。有些驱动程序存在实现问题,因此如果发生崩溃,可能值得将其关闭。实用程序类
j3d.audiodevice 包含类名的引号字符串 1.3.2 SimpleUniverse 实用程序类。采用 com.sun.j3d.audioengines.AudioEngine3DL2 的具体子类的名称,该子类将由 Viewer.createAudioDevice() 构造。默认值为 null,这意味着调用 Viewer.createAudioDevice() 的应用程序默认禁用音频。 j3d.configURL 未知 1.3.1 在ConfiguredUniverse 类中找到。目前功能未知。
j3d.io.ImageCompression NoneGZIPJPEG 1.3.1 在场景图 I/O 包中找到。目前功能未知。
j3d.stereo PREFERRED 或 §§§20§§§ 1.1 仅由 SimpleUniverse 使用。如果您推出自己的 VirtualUniverse,则不会使用此属性。控制您是否希望 Java3D 明确创建支持立体模式的画布
sun.java2d.d3d 是真是假 ?? 默认为真。在 Java 2D 中启用 Direct3D(实际上不是 Java 3D)。
sun.java2d.ddoffscreen 是真是假 ?? 默认为真。通过 Java 2D 为离屏图像启用 DirectDraw 和 Direct3D,例如 Swing 后台缓冲区(实际上不是 Java 3D)。
sun.java2d.noddraw 真是假 ?? 默认为 false。通过 Java 2D(实际上不是 Java 3D)完全禁用 DirectDraw 和 Direct3D。这可以避免与使用这些 API 及其各自驱动程序相关的任何问题。