2017-06-20 37 views
1

我一直在使用JavaFX創建3D模型。我已經關注了this guide,除了當我開始添加自己的數據時,所有內容都很有用。作爲最小的工作例子,考慮從上述指南提供的示例應用程序(注:您可能必須添加下面的類變量,它是從導向丟失:double modifierFactor = 0.1;),並更換buildMolecule()函數體:JavaFX 3D適用於> 1百萬盒子對象

Random rand = new Random(System.currentTimeMillis()); 
int dim = 10; 
int dimhalf = dim>>1; 
for (int i = 0; i < dim; i++) { 
    for (int j = 0; j < dim; j++) { 
     for (int k = 0; k < dim; k++) { 
      Box b = new Box(10, 10, 10); 
      b.setTranslateX((i-dimhalf)*10); 
      b.setTranslateY((j-dimhalf)*10); 
      b.setTranslateZ((k-dimhalf)*10); 
      b.setMaterial(new PhongMaterial(new Color(rand.nextFloat(), rand.nextFloat(), rand.nextFloat(), 1.0))); 
      root.getChildren().add(b); 
     } 
    } 
} 

運行該應用程序(我使用附加標誌-Xmx6g -Xms6g)並使用dim的值來查看效果。如果您遇到閃爍(我做過,由於Scene實例上的depthBuffering = true),請嘗試設置CAMERA_NEAR_CLIP = 100。對於更大的dim值,您可能還想將CAMERA_INITIAL_DISTANCE設置爲-1500

這工作正常(我的機器上)在弱光環境< 20.暗淡= 30,初步呈現仍然很快,但標準操作(與LMB旋轉,人民幣放大,並與MMB翻譯)是波濤洶涌。這種情況越來越嚴重,因爲增加暗淡度直到70時,初始渲染需要幾秒鐘,但與場景交互基本上是不可能的。

我面臨的情況是,我需要渲染一百萬到一千萬個Box個實例(dim> = 100)。這可能嗎?我可以使用哪些技巧來加速性能?

對於那些有興趣的人,基礎模型是一個八叉樹。

+0

我可以用來加速性能的技巧嗎?是。無論如何,刪除所有被其他「盒子」覆蓋的「盒子」。這應該允許你使用dim = 50渲染場景,並且暗淡度= 20(3 *50²<20³)的場景表現 – fabian

+0

@fabian謝謝,但是對於我的應用程序,不幸的是,形狀不是完美的長方體,只計算可見迷你長方體不是一件容易的事。然而,它可能仍然有幫助...另一方面,我仍然無法達到昏暗的100 :( – Warkst

回答

0

目前的方法存在的問題是,您要添加一百萬個獨立的3D場景圖節點,這些節點都必須進行管理,檢測到事件,渲染/遮擋等。不管您的渲染系統如何,都不會發生。 對於像這樣的超密度3D場景圖,您需要將數據轉換爲單個連續的三角形網格,其三角形已經以相機僅顯示數據點的方式纏繞。絕對不是因爲心靈的暗淡,這就是爲什麼我們在http://www.fxyz3d.org/回購庫中創建了一個ScatterMesh class以使其更容易。

有這個類沒有樣品還沒有,但這裏是我如何使用它作爲2:05 of this video證明:

DirectedScatterMesh periapsisMap3D =新DirectedScatterMesh(數據,真實,point3dSize,0); periapsisMap3D.setDrawMode(DrawMode.FILL); //使迷你三角形固體 periapsisMap3D.setTextureModeVertices3D(1530,colorByAngleOut); // colorByAngleOut是一個將x,y數字映射爲顏色的函數。

setTextureModeVertices3D允許指定色彩映射使你在該功能指定顏色被映射到正確的面,然後將其轉換成紋理,然後PhongMaterial和精確地纏繞在3D結構。

下面是我colorByAngleOut功能,所以你至少有一個想法,它是如何工作:

功能colorByAngleOut = P-> Math.abs(Math.atan2(PY,Math.sqrt(PX PX + pz p。Z))); // JavaFX中 3D Y - > z和反之亦然

其中P是一個三維點,我基本上從黃道平面算出航天器的角度進行。

要添加此整個3D結構,這是一個美化的TriangleMesh當它歸結到它,作爲其添加到3D場景像任何其他對象作爲簡單:

sceneRoot.getChildren()。添加(periapsisMap3D);

請注意,該視頻實際上顯示了ScatterMesh的修改版本,它允許定向四面體,允許渲染其他數據維數。目前的FXyz版本不支持這個功能,這是我開發的一個非開源的定製。

+0

我做了一次類似的事情在HTML + JavaScript一次,我不得不在2D上繪製大約100k對象在那裏我能夠在屏幕外的畫布上完成一個完整的渲染循環,然後將結果導出到一個圖像(全部在內存中),然後鼠標操作基本上將視口移到圖像上。有沒有辦法從充滿3D對象的場景圖中派生出散射網格?恐怕我渲染的物體的物理形狀非常不規則(每次運行時都會有所不同),因此製作網格將是真正的難。 – Warkst