Javascript 更新网格或从场景中删除和添加网格更经济高效的方法是什么?
我设计了一个小的web应用程序,用于在Three.js中查看海底的测深数据。基本上,我使用加载程序将拉伸测深的JSON模型引入到场景中,并允许用户旋转模型或单击“下一步”加载海底的新部分 我的所有模型都具有相同的二维示意图,因此在二维中都是相同的,只是不同模型的高程和纹理有所不同 我的问题是:更新我的模型最具成本效益的方法是什么Javascript 更新网格或从场景中删除和添加网格更经济高效的方法是什么?,javascript,3d,three.js,mesh,Javascript,3d,Three.js,Mesh,我设计了一个小的web应用程序,用于在Three.js中查看海底的测深数据。基本上,我使用加载程序将拉伸测深的JSON模型引入到场景中,并允许用户旋转模型或单击“下一步”加载海底的新部分 我的所有模型都具有相同的二维示意图,因此在二维中都是相同的,只是不同模型的高程和纹理有所不同 我的问题是:更新我的模型最具成本效益的方法是什么 使用场景。移除(网格)然后再次调用我的加载程序加载新模型,然后使用scene.add(mesh)将其添加到场景中 通过调用my loader引入材质和几何体,然后调用m
场景。移除(网格)
然后再次调用我的加载程序加载新模型,然后使用scene.add(mesh)将其添加到场景中代码>
mesh.geometry=geometry,更新现有网格代码>,mesh.material=material
,然后mesh.geometry.needsUpdate代码>
我考虑过的另一种方法是跳过创建模型的步骤(在Blender中),而是使用置换贴图来更新顶点的y坐标。然后,为了更新,我可以在替换材质之前在现有平面几何体上推送新顶点。这是一个合理的方法吗?至少我认为置换映射加载的文件比.JSON文件小。我甚至可以通过加载GUI元素来优化显示,将网格划分为更多或更少的分区,以获得高质量或低质量的渲染…我不知道引擎盖下到底发生了什么,但根据我的记忆,我认为这两件事是完全相同的 您没有更新现有网格。网格从Object3D延伸而来,因此它只是位于那里,连接一些几何体和一些材质
mesh.geometry=geometry
没有“更新网格”,或者更新了网格,但是使用了新的几何体(这可能是您实际指的网格)
换句话说,您始终拥有容器,但当您通过执行=geometry
替换几何体时,您将在接下来的三个.WebGLRenderer.render()调用中为各种GL调用设置它
新几何体附着到的位置,无论是现有网格还是新网格,都不应该有任何影响。几何体将触发低级webgl调用,如gl.bufferData()
//在第一次渲染时将两个几何体上载到gpu()
var meshA=新的三点网格(新的三点盒几何体(1,1,1));
var meshB=新的三点网格(新的三点长方体几何体(1,1,1));
//在第一次渲染时将一个几何体上载到gpu()
var bg=new THREE.BoxGeometry()
var meshA=新的三点网格(bg);
var meshB=新的三点网格(bg);
对于(var i=0;i
THREE.Mesh
似乎是THREE.js中最令人困惑的概念 我想这可能是离题了,因为答案可能完全是基于观点的。我明白你的意思,我在最后有点顿悟。使用置换贴图比在新模型中加载要有效得多。不过,我的问题仍然存在。使用新的纹理和几何体更新现有网格,或者简单地从场景中删除并添加网格,哪种方法更好?你最好在3D建模论坛上问这个问题?我想这里的大多数JS用户都是web开发人员。。。
//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