我有一个小型网络应用程序,我设计用于查看Three.js中海底的测深数据。基本上我使用装载机将我的挤压深度测量的JSON模型引入我的场景,并允许用户旋转模型或单击下一步以加载海底的新部分。
我的所有模型都具有相同的2D足迹,因此在两个维度上相同,只是高程和纹理从模型变为模型。
我的问题是:更新模型的最具成本效益的方法是什么?
使用scene.remove(mesh);
然后再次调用我的加载程序加载新模型,然后使用scene.add(mesh);
将其添加到场景中。
通过调用我的加载程序来引入材质和几何图形,然后调用mesh.geometry = geometry;
,mesh.material = material
然后mesh.geometry.needsUpdate;
来更新现有网格。
我从计算的角度来看,更新是非常密集的,但我所读到的所有文章都指出这两种方法几乎相同。这些信息是否正确?在这种情况下,有更好的方法来处理我的代码吗?
我考虑的另一种选择是跳过我创建模型的步骤(在Blender中),而是使用置换贴图来更新顶点的y坐标。然后要更新我可以在替换材质之前在现有平面几何体上推动新顶点。这会是一个合理的方法吗?至少我认为置换贴图将是一个比.JSON文件更小的加载文件。我甚至可以通过加载GUI元素来优化显示,将网格分成更多或更少的分区,以实现高质量或低质量的渲染......
答案 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中最令人困惑的概念。