Javascript 更新网格或从场景中删除和添加网格更经济高效的方法是什么?

Javascript 更新网格或从场景中删除和添加网格更经济高效的方法是什么?,javascript,3d,three.js,mesh,Javascript,3d,Three.js,Mesh,我设计了一个小的web应用程序,用于在Three.js中查看海底的测深数据。基本上,我使用加载程序将拉伸测深的JSON模型引入到场景中,并允许用户旋转模型或单击“下一步”加载海底的新部分 我的所有模型都具有相同的二维示意图,因此在二维中都是相同的,只是不同模型的高程和纹理有所不同 我的问题是:更新我的模型最具成本效益的方法是什么 使用场景。移除(网格)然后再次调用我的加载程序加载新模型,然后使用scene.add(mesh)将其添加到场景中 通过调用my loader引入材质和几何体,然后调用m

我设计了一个小的web应用程序,用于在Three.js中查看海底的测深数据。基本上,我使用加载程序将拉伸测深的JSON模型引入到场景中,并允许用户旋转模型或单击“下一步”加载海底的新部分

我的所有模型都具有相同的二维示意图,因此在二维中都是相同的,只是不同模型的高程和纹理有所不同

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

  • 使用
    场景。移除(网格)
    然后再次调用我的加载程序加载新模型,然后使用
    scene.add(mesh)将其添加到场景中

  • 通过调用my loader引入材质和几何体,然后调用
    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