我正在使用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的,但我开到具体的建议有作为。)
,我发现有关优化[这里]一些提示(http://escience.anu.edu.au/lecture/cg/JavaOptimisation/java3Dcollateral.en。 HTML)。我也会建议剔除平截头体扑杀。 –