更新网格或从场景中删除和添加更具成本效益的是什么?

时间:2016-04-21 12:49:27

标签: javascript 3d three.js mesh

我有一个小型网络应用程序,我设计用于查看Three.js中海底的测深数据。基本上我使用装载机将我的挤压深度测量的JSON模型引入我的场景,并允许用户旋转模型或单击下一步以加载海底的新部分。

我的所有模型都具有相同的2D足迹,因此在两个维度上相同,只是高程和纹理从模型变为模型。

我的问题是:更新模型的最具成本效益的方法是什么?

  1. 使用scene.remove(mesh);然后再次调用我的加载程序加载新模型,然后使用scene.add(mesh);将其添加到场景中。

  2. 通过调用我的加载程序来引入材质和几何图形,然后调用mesh.geometry = geometry;mesh.material = material然后mesh.geometry.needsUpdate;来更新现有网格。

  3. 我从计算的角度来看,更新是非常密集的,但我所读到的所有文章都指出这两种方法几乎相同。这些信息是否正确?在这种情况下,有更好的方法来处理我的代码吗?

    我考虑的另一种选择是跳过我创建模型的步骤(在Blender中),而是使用置换贴图来更新顶点的y坐标。然后要更新我可以在替换材质之前在现有平面几何体上推动新顶点。这会是一个合理的方法吗?至少我认为置换贴图将是一个比.JSON文件更小的加载文件。我甚至可以通过加载GUI元素来优化显示,将网格分成更多或更少的分区,以实现高质量或低质量的渲染......

1 个答案:

答案 0 :(得分:1)

我不清楚头脑底下到底发生了什么,但从我记得的情况来看,我认为这两者完全相同。

您没有更新现有网格。一个网格从Object3D延伸,所以它只是坐在那里,连接一些几何和一些材料。

mesh.geometry = geometry没有“更新网格”,或者确实如此,但是使用了新的几何体(可能是你实际上称之为网格的东西)。

换句话说,你总是拥有容器,但是当你通过=geometry替换几何体时,你可以在下一个THREE.WebGLRenderer.render()调用中为各种GL调用设置它。

新几何体附着的地方,无论是现有网格还是新网格,根本不重要。几何体将触发像gl.bufferData()这样的低级webgl调用。

//upload two geometries to the gpu on first render()
var meshA = new THREE.Mesh( new THREE.BoxGeometry(1,1,1) );

var meshB = new THREE.Mesh( new THREE.BoxGeometry(1,1,1) ); 

//upload one geometry to the gpu on first render()
var bg = new THREE.BoxGeometry()

var meshA = new THREE.Mesh( bg );
var meshB = new THREE.Mesh( bg );

for ( var i = 0 ; i < someBigNumber ; i ++ ){
  var meshTemp = new THREE.Mesh( bg );
}
//doesnt matter that you have X meshes, you only have one geometry

//1 mesh two geometries / "computations"

var meshA = new THREE.Mesh( new THREE.BoxGeometry() ); //first computation - compute box geometry
scene.add(meshA);
renderer.render( scene , camera ); //upload box to the gpu

meshA.geometry = new THREE.SphereGeometry();
renderer.render( scene , camera); //upload sphere to the gpu

THREE.Mesh似乎是three.js中最令人困惑的概念。