JavaFX 3D用于> 100万个Box对象

时间:2017-06-20 14:31:09

标签: java javafx 3d

我一直在使用JavaFX来创建3D模型。我跟着this guide,除了当我开始添加自己的数据时,一切都在工作。作为一个最小的工作示例,请考虑上述指南中的示例应用程序(注意:您可能必须添加指南中缺少的以下类变量: double modifierFactor = 0.1;)并替换{{ 1}}函数体:

buildMolecule()

运行应用程序(我使用其他标志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); } } } )并使用dim的值来查看效果。如果您遇到闪烁(我的确是-Xmx6g -Xms6g实例上的depthBuffering = true),请尝试设置Scene。您可能还希望将CAMERA_NEAR_CLIP = 100设置为类似CAMERA_INITIAL_DISTANCE的内容,以获得更大的暗淡值。

这适用于(在我的机器上)昏暗&lt; 20.对于dim = 30,初始渲染仍然很快但标准操作(使用LMB旋转,使用人民币缩放并使用MMB进行翻译)不稳定。对于增加昏暗直到70,这种情况越来越糟,此时初始渲染需要几秒钟,但与场景的交互基本上是不可能的。

我面临着需要渲染100万到1000万-1500个实例(dim&gt; = 100)的情况。这可能吗?我可以使用什么技巧来提高性能吗?

对于那些感兴趣的人,底层模型是八叉树。

1 个答案:

答案 0 :(得分:0)

您当前的方法存在的问题是,您需要添加一百万个独立的3D场景图节点,这些节点都必须进行管理,事件检测,渲染/遮挡等等。无论您的渲染系统如何,都不会发生。 对于像这样的超密集3D场景图,您需要将数据转换为单个连续的三角形网格,其三角形的缠绕方式使得相机仅显示数据点。绝对不适合胆小的人,这就是我们在ScatterMesh class仓库中创建http://www.fxyz3d.org/以使其更容易的原因。

此课程尚无示例,但我在2:05 of this video演示了如何使用它:

  

DirectedScatterMesh periapsisMap3D = new DirectedScatterMesh(data,true,point3dSize,0);       periapsisMap3D.setDrawMode(DrawMode.FILL); //使迷你三角形变得坚固       periapsisMap3D.setTextureModeVertices3D(1530,colorByAngleOut); // colorByAngleOut是一个将x,y数字映射到颜色的函数。

setTextureModeVertices3D允许您指定一个颜色贴图,然后将其转换为纹理然后转换为PhongMaterial并精确包裹在3D结构周围,以便您在函数中指定的颜色映射到正确的面。

下面是我的colorByAngleOut函数,所以你至少知道它是如何工作的:

  

功能colorByAngleOut = p-&gt;   Math.abs(Math.atan2(p.y,Math.sqrt(p.x p.x + p.z p.z))); //在javafx中   3D y - &gt; z反之亦然

其中p是一个point3D,我基本上计算了从黄道面出来的航天器的角度。

要添加整个3D结构,这是一个美化的TriangleMesh,就像将它添加到3D场景一样简单:

  

sceneRoot.getChildren()添加(periapsisMap3D);

请注意,视频实际上显示了ScatterMesh的修改版本,它允许定向四面体,允许渲染其他数据尺寸。当前的FXyz构建不支持这种情况,这是我做的一个非开源定制。