Java3D中的动态对象可见性

时间:2011-06-21 23:13:25

标签: performance memory java-3d astronomy

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

到目前为止,我有一个天真的版本工作,读取40,000个已知的星星,并将它们(用键盘+鼠标导航)显示为Sphere对象。但是,阻碍进一步发展存在一些问题。

我正在努力解决的一个问题是我需要根据它们的视星位来渲染星星,这是恒星的绝对亮度(对数标度)及其与观察者的当前距离的函数。具有非常低视角的恒星(例如从地球轨道看到的星座恒星)应该是不可见的,而即使在离地球相对较远的距离处也应该看到极亮的恒星(例如Deneb)。

所以我不能只根据固定的“实际”尺寸以及它们与当前观察位置的距离来显示星星。即使是非常暗淡的近星,也会产生巨大的斑点,而像Deneb这样的疯狂发光的恒星由于它们的距离而根本不显示。

问题是,如何基于其明显的幅度来表示星形图像,该幅度根据其与当前视点位置的距离而变化,而不动态分配和删除Java3d对象?或者,如果我必须在渲染开始后更改Java3D中的对象,那么如何在不破坏帧速率的情况下执行此操作呢?

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

一个特别幸运的特例是,我不需要显示任何明显大于7.00的恒星,因为人眼看不到它们。从理论上讲,我只需要根据我目前在太空中的位置为任何可以看到的东西生成一个3D对象。这不仅可以提高为数据库中每个星形创建Sphere对象的性能,还可以帮助我避免耗尽Java堆空间。 (我想要包含超过100,000个真正的明星,但是我在40,000之后用尽了堆空间,而且我尝试过没有Java设置给了我更多的堆空间。)

我知道这种星形亮度的动态显示是可能的。卓越的太空引擎模拟程序的创造者做到了(并设法获得每秒60帧)。我不能为我的生活找出他是如何的。

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

1 个答案:

答案 0 :(得分:0)

可以管理对象的

可见性,而无需在场景图中添加和删除它们,如下所示:

  • RenderingAttributes

将一个RenderingAttributes实例添加到Shape3D的Appearance中,并调用'RenderingAttributes.setVisible(boolean visible)'。可以通过将单个实例添加到多个外观来共享单个实例,以便同步其Shape3D的可见性。

  • SharedGroup和Link

将对象添加到SharedGroups,并通过Link节点将它们链接到场景图中的父节点。当调用'Link.setSharedGroup(mySharedGroup)'时,对象将是可见的,当调用'Link.setSharedGroup(null)'时,它们将是不可见的。

  • 开关

使用子索引模式CHILD_MASK收集一个或多个Switch分组节点中的对象。 BitSet用于指定呈现Switch的子项。

堆大小

在带有4 GB RAM的Win XP 32位上,我的堆大小设置为:-Xmx1536m。

<强>球

您的Sphere对象是如何构建的?你使用com.sun.j3d.utils.geometry.Sphere吗?

另请参阅:http://www.java.net/forum/topic/javadesktop/java-desktop-technologies/java-3d/why-large-number-hidden-shapes-slows-rende

八月,InteractiveMesh