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,但是我也愿意接受那里的具体建议。)
没有找到相关结果
已邀请:
1 个回复
呸溉