2014-10-07 72 views
1

我已經編寫了一個讀取二進制STL文件的Java FX應用程序,將數據加載到JavaFX網格中,然後將其顯示爲3D渲染。大部分代碼來自Oracle JavaFX教程中的分子查看器示例。我創建了一個名爲STLMesh的TriangleMesh的新子類,它在STL構面中掃描並相應地設置點和麪陣列。JavaFX 3D性能 - 初始渲染速度很慢

該代碼適用於小例子:一個包含1000個三角形的STL文件立即出現。然而,一個剛好不到14,000個三角形的文件首先需要50秒才能出現,而我還有其他更大的例子不會在合理的時間內出現。一旦在屏幕上,我可以非常順利地旋轉和平移顯示。我的問題:如何避免初始渲染中的這種長時間延遲?

設置JavaFX場景圖的代碼如下 - 它基本上是moelcule查看器的頂級代碼,但是使用我的STLMesh類的實例而不是分子。

執行stage.show()之後,JavaFX線程內發生延遲。其他JavaFX窗口在延遲期間不響應。通過光盤判斷,在延遲期間沒有顯着的交換活動:它似乎是計算限制的。

我在東芝Tecra筆記本電腦上運行 - 我對這些機器上的圖形硬件瞭解不多。

我試過了從http://www.interactivemesh.org/models/jfx3dimporter.html的Jim modelimporter,我相信這是用JavaFX實現的:它將所有的STL文件呈現在一秒鐘或兩秒鐘內。他們不提供信息來源,所以我不知道他們使用什麼聰明才能避免我遇到的問題。

STLviewer(File file) { 
    Stage stage = new Stage(); 
    buildScene(); 
    buildCamera(); 
    buildAxes(); 

    PhongMaterial material = new PhongMaterial(Color.YELLOW); 

    final Group sGroup = new Group(); 

    MeshView meshView = new MeshView(new STLMesh(file)); 
    meshView.setMaterial(material); 
    // meshView.setCullFace(CullFace.NONE); 
    meshView.setDrawMode(DrawMode.LINE); 
    sGroup.getChildren().add(meshView); 
    world.getChildren().addAll(sGroup); 

    Scene scene = new Scene(root, 900, 600, true); 
    scene.setFill(Color.GREY); 
    handleMouse(scene, world); 

    scene.setCamera(camera); 
    stage.setScene(scene); 
    stage.show(); 
} 
+0

你能否提供一個鏈接到一個模型(和模型加載代碼),這對你來說是一個問題,以便有人可以試圖複製這個問題?請參閱[mcve](http://stackoverflow.com/help/mcve)。 – jewelsea 2014-10-07 22:24:37

+1

我已經將STLviewer從應用程序中剝離出來,將代碼和幾個STL文件壓縮並放在這裏:https://dl.dropboxusercontent.com/u/30126557/simpleSTLViewer.zip。解壓縮內容,如果你願意(我已經把.class文件放在那裏)重新編譯,並以java SimpleSTLviewer **的方式運行。兩個STL文件被渲染:一個小的和一個牛奶流失的模型。在我的機器上,第二個渲染需要幾分鐘的時間。一旦渲染,性能非常好。 – 2014-10-08 07:32:34

回答

3

在STLMesh.java面部數組的長度過長:

老:整數面向[] =新INT [facetCount * 18];

new:int faces [] = new int [facetCount * 6]; (每個三角形/臉部3個座標+ 3 texCoord索引)

看起來TriangelMesh的內部設置「瘋了」,因爲這麼多的三角形引用了所有三個角的同一個頂點(索引=零)。

此外,texCoords的數組應選擇較短。即使沒有紋理應用,TriangleMesh也需要texCoords。在這種情況下,一個就足夠了:

new:float texCoords [] = {0f,0f};

+0

這已解決了我的問題。我非常感謝InteractiveMesh。 Stackoverflow是一個很好的資源。 – 2014-10-08 17:13:01