Java3D中的动态对象可见性

| 我正在使用Java和Java3D构建相对简单的银河星系模型,该模型可以“通过”。 到目前为止,我有一个幼稚的版本可以读取40,000个已知恒星,并将它们显示(通过键盘和鼠标导航)为Sphere对象。但是,有几个问题阻碍了进一步的发展。 我正在努力解决的问题之一是,我需要根据恒星的视在大小来渲染恒星,视在大小是恒星的绝对亮度绝对值(对数标度)及其与观察者当前距离的函数。视星等极低的恒星(例如从地球轨道上看到的半人马座Proxima Centauri)应该是不可见的,而距地球相对较大的距离,也应该能看到极亮的恒星(例如Deneb)。 因此,我不能仅根据恒星的“实际”大小和距当前观测位置的距离来显示恒星。这导致即使非常暗的近星也产生巨大的斑点,而像Deneb这样的疯狂发光的恒星由于距离太远而根本不显示。 问题是,如何在不动态分配和删除Java3d对象的情况下,如何根据恒星的视在大小表示恒星的图像,而视在大小却根据距当前视点位置的距离而变化?或者,如果在渲染开始后必须在Java3D中更改对象,如何在不牺牲帧速率的情况下做到这一点? 我尝试使用透明性;这只会使大圆圈变得很难看。我曾尝试使用雾,但那会完全雾掉远处的恒星(和星座线)。我曾尝试将Spheres转换为Shape3D对象,但这会消耗两倍的堆空间。 一种令人高兴的特殊情况是,由于人眼看不到它们,所以我不需要显示任何明显大于7.00的恒星。从理论上讲,我只需要根据我当前在太空中的位置为任何可见的事物生成一个3D对象。通过为数据库中的每个星星创建一个Sphere对象,不仅可以提高性能,而且还可以帮助我避免用完Java堆空间。 (我想包含超过100,000个真实的星星,但是在40,000个之后,我的堆空间用完了,而且我尝试过的Java设置都没有给我更多的堆空间。) 我知道这种动态显示恒星亮度的方法是可行的。卓越的太空引擎仿真程序的创建者做到了这一点(AND设法每秒获得60帧)。我只是一辈子都无法弄清楚他是怎么做到的。 我完全希望自己已经达到了天真的实现的极限,并且获得可接受的性能和功能的唯一方法是重新设计整个显示概念。我希望看到一些有关如何使用Java3D进行动态对象可见性的具体答案,但在这一点上,我将接受专家的猜测。 (我不想放弃Java3D,但是我也愿意接受那里的具体建议。)     
已邀请:
        可以管理对象的可见性,而无需按如下所示在场景图中添加和删除它们: 渲染属性 将一个RenderingAttributes实例添加到Shape3D的外观中,然后调用\'RenderingAttributes.setVisible(boolean visible)\'。可以通过将一个实例添加到多个外观来共享单个实例,以便同步其Shape3D的可见性。 SharedGroup和链接 将对象添加到SharedGroups,然后通过“链接”节点将它们链接到场景图中的父对象。调用\'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     

要回复问题请先登录注册