我正在使用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)。我也會建議剔除平截頭體撲殺。 –