2011-06-21 120 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級的恆星可以由幾個覆蓋少量尺寸(幾何)和顏色(外觀)的低聚球體表示。此外,在某種行爲上設置調度界限可能會讓我改變星星如何根據其動態變化的視星等來渲染。實驗時間! 這兩個優化可能會提供我需要的視覺行爲和幀率/內存性能。如果不是,那麼我可能需要嘗試在場景圖生效後如何動態更改對象。 –