2011-06-21 38 views
0

我正在使用Java和Java3D来构建一个可以“飞行”的银河系星系的相对简单的模型。Java3D中的动态对象可见性

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

我正在努力解决的问题之一是我需要根据它们的视星等来渲染恒星,这是恒星的绝对亮度(对数尺度)和它与观察者的距离的函数。应该看不到明显星等(如从地球轨道看到的Proxima Centauri星),而即使距离地球相对较大的距离也应该可以看到非常明亮的恒星(如Deneb)。

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

问题是,如何根据表观大小(根据其与当前视点位置的距离而变化)来表示恒星的图像,而不动态分配和删除Java3d对象?或者,如果我必须在渲染开始后更改Java3D中的对象,那么如何在不杀死帧速率的情况下执行此操作?

我试过使用透明度;这只会让巨大的圈子更难以看清。我试过使用雾,但是完全雾化了遥远的恒星(和星座线)。我试过把球体转换成Shape3D对象,但是吃了两次堆空间。

一个快乐的特例是我不需要显示任何明显大于7.00的恒星,因为人眼看不到它们。从理论上讲,我只需要根据我目前在太空中的位置就可以看到任何物体的3D对象。这不仅可以提高与为数据库中的每个星形创建Sphere对象相比的性能,还可以帮助我避免用完Java堆空间。 (我有超过10万颗真正的明星,但我在堆满空间后耗尽了40,000个空间,而且我没有尝试过的Java设置给了我更多的堆空间。)

我知道这种排序动态显示星光亮度是可能的。这个出色的太空引擎模拟程序的创造者完成了它(并设法获得每秒60帧)。我只是不能为我的生活弄清楚他如何他这样做。

我完全期待我达到了我幼稚执行的极限,获得可接受的性能和功能的唯一方法是重新设计整个显示器概念。我很想看看如何使用Java3D做动态对象可见性的一些具体的答案,但在这一点上,我会解决专家的猜测。 (我宁愿不放弃Java3D的,但我开到具体的建议有作为。)

+0

,我发现有关优化[这里]一些提示(http://escience.anu.edu.au/lecture/cg/JavaOptimisation/java3Dcollat​​eral.en。 HTML)。我也会建议剔除平截头体扑杀。 –

回答

0

能见度对象可以管理,而不添加和场景图中删除它们如下:

  • RenderingAttributes

添加RenderingAttributes实例的一个Shape3D的外观,并呼吁 'RenderingAttributes.setVisible(布尔可见)'。一个实例可以通过将其添加到多个外观来共享,以便他们的Shape3D的可见性将被同步。

  • SharedGroup和链接

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

  • 开关

收集在与子索引模式CHILD_MASK一个或多个开关组节点的对象。 BitSet被用来指定一个Switch被渲染的子元素。

堆大小

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

如何在您的球体对象构建?你使用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

+0

感谢您的意见。 通过重复使用Sphere对象,亮度达到-10级的恒星可以由几个覆盖少量尺寸(几何)和颜色(外观)的低聚球体表示。此外,在某种行为上设置调度界限可能会让我改变星星如何根据其动态变化的视星等来渲染。实验时间! 这两个优化可能会提供我需要的视觉行为和帧率/内存性能。如果不是,那么我可能需要尝试在场景图生效后如何动态更改对象。 –