问题标签 [java-3d]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
144 浏览

java - 如何绘制具有与其他对象不同的投影的特定对象?

所以我在任何地方都找不到任何东西:我正在使用 Java3D 为我的用户创建一个环境。我想将 X、Y 和 Z 轴的 3D 显示放在角落,随着他们旋转视图而旋转。不幸的是,它需要在角落而不是在中心。这意味着在正常的视图投影(PERSPECTIVE_PROJECTION)中,轴的排列不太正确,看起来非常非常尴尬。使用 PARALLEL_PROJECTION 来修复尴尬的轴显示,但是我无法正确查看世界,因为它不再让我缩放。有没有办法告诉渲染器使用 PARALLEL_PROJECTION 专门用于轴显示和所有其他对象的 PERSPECTIVE_PROJECTION?还是有另一种方法可以解决我看不到的这个问题?

0 投票
4 回答
1141 浏览

java - 使我的 Java 程序易于分发

我已经通过 exe 安装程序在 PC 上安装了 Java 3D API,它只是在 lib 子目录和bin 子目录中创建了一个带有j3dcore.jar,vecmath.jar的新目录。j3dutils.jarj3dcore-ogl.dll

Netbeans 没有问题,我的代码编译和执行都很顺利,但是一旦我构建了我的项目并尝试从命令提示符运行它,我得到了一个UnsatisfiedLinkError说法,即no j3dcore-ogl in java.library.path.

谷歌出手相救,给了我 3 个可行的解决方案:

  • 通过将 dll 文件复制到我的 JRE 的 bin 目录中
  • 通过将 dll 文件的路径添加到库路径 ( java -Djava.library.path=dllpath)
  • 在程序中加载dll System.load()(实际上我无法让这个工作)

我的问题是:我错过了这个问题的优雅解决方案吗?

对于每个想要使用这个程序的不同 PC,他必须复制 dll 或将其添加到库路径才能运行,这似乎很乏味。(附带问题:为什么 Netbeans 的 dll 没有问题?)

0 投票
1 回答
690 浏览

java - 使用 Java3D 同时显示多边形线和纹理

我有一个使用纹理 (POLYGON_FILL) 成功渲染的 3d 网格。我想做的也是以编程方式同时绘制不同颜色的线(POLYGON_LINE PolygonAttribute)以显示三角形的边缘。它看起来就像您在 3D 建模程序或某些此类应用程序中看到的一样 - 带有线轮廓的面部纹理说明了面部边缘。

这是通过 API 轻松完成的事情还是需要一些创造力?我想我可以改变纹理坐标,使纹理稍微低于多边形的边缘(但我认为如果面边缘上的间隙变化很大,它看起来会不一致),但是我正在使用 TexCoordGeneration 而我不是确定从哪里开始做类似的事情。

基本上,这将用于一种基本但高度定制的 3d 建模器应用程序,因此在用户操作 3d 几何图形方面有很多不太常见的操作。

0 投票
3 回答
8377 浏览

java - Java3d Mac OSX 新手安装说明

我正在尝试在我的 mac osx 上使用 java3d,但我在任何地方都找不到安装说明!如果有人知道如何做到这一点,或者如果有 java3d 的替代品(我知道 jmonkeyengine 就是其中之一),请告诉我!

谢谢

0 投票
1 回答
853 浏览

java - 访问器方法在 Windows、Linux 下可见,但在 OS X 下不可见

尝试使用 1.5.2 jar 文件(例如在 Java.net http://java3d.java.net/binary-builds.html上找到)针对 javax.vecmath 进行构建。

尝试拨打电话,比如说 Point3d;

在 64 位 Windows 和 Linux(我只尝试过 Ubuntu 10.04,64 位)中,它可以编译并运行。

在 OS X (10.6.7) 中它不会编译:

这是使用完全相同的物理 vecmath.jar

如果我直接使用源代码,它会在 OS X 上编译,但不会运行

如果我自己在 OS X 上将源代码编译为 jar 文件,然后使用上面示例中的 jar,再次无法编译。

现在,正在访问的字段位于 javax.vecmath.Tuple3d 中,这是一个抽象类,具有 x、y 和 z 的公共字段。所以在 OS X 上这将起作用(实际上,它似乎在任何地方都有效)。

问题是,我正在开发一个依赖于 vecmath.jar 的代码库,其中维护人员在 Windows 上并希望继续使用访问器方法,但我在 OS X 上。

我正在寻找两者:

(1) 了解发生了什么 (2) 在依赖 vecmath.jar 文件的同时弄清楚如何使这些源可移植。

0 投票
1 回答
1439 浏览

java - 具有已加载 Maya 场景的 Java 3D 应用程序产生一个空白的黑屏

我使用 Maya 2011 制作了一个 3D 模型,并使用加载器访问 Java 3D 应用程序。我已将文件导出为 OBJ 文件,并在我的班级中使用了 OBJ 文件加载器。但是,当我运行该应用程序时,我得到的只是一个空白的黑屏。

这是我的代码:

我将不胜感激任何帮助。

0 投票
1 回答
1788 浏览

java-3d - Java3D 和行为:KeyNavigatorBehaviour 工作正常,但不是 MouseRotate

我没有设法通过使用 MouseRotate 为 ColorCube 提供用户鼠标交互。但是,当我使用 KeyNavigatorBehaviour 时,我可以根据需要使用键盘控制立方体。

这是我用来测试 MouseRotate 的代码:

如果我取消注释创建 KeyNavigatorBehaviour 的行并注释创建 MouseRotate 的行,那么这次用户交互是可能的。

那么,为什么立方体不能对鼠标做出反应(当我使用 MouseRotate 行为实例时)?

任何帮助将不胜感激。

系统:Xubuntu 11.04 Java3D 版本:1.5.2

0 投票
1 回答
707 浏览

swing - 重定向 Swing 鼠标事件

我正在尝试在 Java3D 画布上显示 Java Swing 组件并与之交互。我通过将透明 JPanel 绘制到缓冲图像来显示组件,然后使用 J3DGraphics2D 在画布上绘制该缓冲区。

我想不通的是如何将鼠标事件转发到 JPanel 中的摆动组件。我希望将 Canvas3D 上的所有键盘和鼠标事件发送到 JPanel,然后如果它们没有被任何摆动组件捕获(例如,鼠标不在其中任何一个组件上),则返回到 Canvas3D。

我尝试调用 Container.dispatchEvent(AWTEvent),但它没有成功地将事件分派到适当的组件,即使例如鼠标光标正好位于容器中的按钮上。

有谁知道这样做的方法?这应该是可能的。

0 投票
1 回答
510 浏览

java - Swing 工具提示的 Java3D 口吃问题

我正在处理的一个 Java 项目在 Java3d 和 Swing 工具提示之间存在奇怪的冲突。

我们的程序在中心设置了一个 Java3D Canvas3D,周围是 Swing JComponents(按钮、滑块、文本框等)。键盘和鼠标用于在 3d 世界中移动,按钮允许进行其他操作。

问题是,每当来自 Swing 组件的工具提示延伸到我们的窗口(JFrame)之外时,Java3D 中的移动就会减慢到爬行,并且会出现严重的卡顿问题。由于我们读到的关于挥杆中重量级/轻量级混合的所有问题,我们认为这可能是问题所在。

我们最初的解决方案是覆盖每个组件的 getToolTipLocation() 方法,以确保工具提示留在我们的窗口内。这似乎主要工作,但它在奇怪的位置留下了工具提示。此外,我们偶尔会在程序启动时以及在生成任何工具提示之前(每 20-30 次启动)遇到卡顿/减速问题。

然后昨天我发现了一种更奇怪的修复方法。只要工具提示的宽度为 151 像素或更大,它们就不会导致超出窗口的减速问题。任何宽度为 150 像素或更小的工具提示在离开窗口时都会导致我们的减速/卡顿问题。通过在我们使用的每种类型的组件中重写 createToolTip (),我们可以调用 setPreferedSize() 并确保所有工具提示都是 151 像素宽。当然,这种解决方法的问题是所有工具提示要么有很多空白,要么被截断。

有谁知道可能导致这种奇怪行为的原因以及我可以尝试解决的问题?

0 投票
1 回答
1731 浏览

performance - Java3D 中的动态对象可见性

我正在使用 Java 和 Java3D 构建一个可以“飞行”通过的相对简单的银河系模型。

到目前为止,我有一个简单的版本,可以读取 40,000 个已知恒星并将它们(通过键盘+鼠标导航)显示为 Sphere 对象。然而,有几个问题阻碍了进一步的进展。

我正在努力解决的一个问题是我需要根据它们的视星等来渲染恒星,这是恒星绝对亮度(对数标度)和它与观察者的当前距离的函数。视星等非常低的恒星(例如从地球轨道上看到的比邻星)应该是不可见的,而极亮的恒星(例如天津四)即使在距地球相对较大的距离处也应该是可见的。

所以我不能仅仅根据它们固定的“实际”大小和它们与当前观测位置的距离来显示星星。这会导致即使是非常暗淡的近距离恒星也会出现巨大的斑点,而像天津四这样异常明亮的恒星由于距离太远而根本不会显示。

问题是,如何在不动态分配和删除 Java3d 对象的情况下根据其视星等表示恒星的图像,视星等根据其与当前视点位置的距离而变化?或者,如果我必须在渲染开始后更改 Java3D 中的对象,我怎样才能在不降低帧速率的情况下做到这一点?

我试过使用透明度;这只会让巨大的圆圈更难看到。我试过使用雾,但它完全模糊了遥远的星星(和星座线)。我尝试将 Spheres 转换为 Shape3D 对象,但这会占用两倍的堆空间。

一个快乐的特例是我不需要显示任何视星等大于 7.00 的恒星,因为人眼看不到它们。理论上,我应该只需要根据我在空间中的当前位置为我能看到的任何东西生成一个 3D 对象。与为数据库中的每个星形创建一个 Sphere 对象相比,这不仅可以提高性能,还可以帮助我避免用完 Java 堆空间。(我有超过 100,000 颗真正的星星想要包括在内,但是在 40,000 颗之后我的堆空间已经用完了,而且我尝试过的任何 Java 设置都没有给我更多的堆空间。)

我知道这种星光亮度的动态显示是可能的。卓越的 Space Engine 模拟程序的创建者做到了(并且设法获得每秒 60 帧)。我一辈子都想不通他是怎么做到的。

我完全希望我已经达到了我幼稚实现的极限,并且获得可接受的性能和功能的唯一方法是重新设计整个显示概念。我很想看到一些关于如何使用 Java3D 进行动态对象可见性的具体答案,但在这一点上,我将满足于专家的推测。(我不想放弃 Java3D,但我也愿意接受那里的具体建议。)