我编写了一个Java FX应用程序,它读取二进制STL文件,将数据加载到JavaFX网格中,然后将其显示为3D渲染。大多数代码都来自Oracle JavaFX教程中的分子查看器示例。我创建了一个名为STLMesh的TriangleMesh的新子类,它在STL方面进行扫描并相应地设置点和面数。
该代码适用于小例子:具有1000个三角形的STL文件立即出现。但是,一个只有不到14,000个三角形的文件首次出现需要50秒,而我还有其他较大的例子,这些例子在合理的时间内没有出现。一旦进入屏幕,我就可以非常顺利地旋转和平移显示屏。我的问题:如何避免初始渲染中的这种长时间延迟?
设置JavaFX场景图的代码如下 - 它基本上是来自moelcule viewer的顶级代码,但是使用我的STLMesh类的实例而不是分子。
执行stage.show()后,在JavaFX线程内发生延迟。其他JavaFX窗口在延迟期间无响应。根据磁盘灯判断,在延迟期间没有明显的交换活动:它似乎是计算限制的。
我在Toshiba 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 :(得分:3)
STLMesh.java中face-array的长度太长:
old:int faces [] = new int [facetCount * 18];
new:int faces [] = new int [facetCount * 6]; (每个三角形/面部3个坐标+ 3个texCoord指数)
似乎TriangelMesh的内部设置很疯狂'由于这么多三角形指的是所有三个角的相同顶点(索引=零)。
此外,应该选择较短的texCoords数组。即使没有应用纹理,TriangleMesh也需要texCoords。在这种情况下,单个就足够了:
new:float texCoords [] = {0f,0f};