2015-07-01 51 views
3

将新顶点添加到three.js网格中,然后去掉mesh.geometry.vertices.push(new THREE.Vector3(x,y,z)),但是如何去除它们?ThreeJS:如何删除顶点?

“几何”是一个数组,所以我想,我可以删除顶点具有:

mesh.geometry.vertices.splice(vertexIndex, 1)

mesh.geometry.verticesNeedUpdate = true;

但是,当我做到这一点,那整个事情中断与说three.js所内部错误消息:“未捕获TypeError:无法在three.min.js中读取'undefined'属性'x'。

我搜索了他们的维基,他们的github问题。无法找到答案。网格是一个简单的BoxGeometry,所以甚至不是自定义网格。

+0

probaly这个问题可能会有所帮助http://stackoverflow.com/questions/15384078/updating-a-geometry-inside-a-mesh-does-nothing我猜它的好老'verticesNeedUpdate'标志? – philipp

+0

@菲利普:我忘了提及我已经使用这个标志。问题被编辑。删除顶点后,场景立即中断。 – nora

+0

anwser解决你的问题吗? – Atrahasis

回答

3

在三个j中,每个面由3个顶点组成。这是一个例子,使其更清晰。这里是你如何创造R71几何:

geometry=new THREE.Geometry(); 

geometry.vertices.push(// few vertices with random coordinates 
    new THREE.Vector3(12,15,5),//index:0 -- the numbers are (x,y,z) coordinates 
    new THREE.Vector3(10,15,5),//index:1 
    new THREE.Vector3(12,10,2),//index:2 
    new THREE.Vector3(10,10,2)//index:3 
); 

geometry.faces.push(
    new THREE.Face3(0,1,2),//those numbers are indices of vertices in the previous array 
    new THREE.Face3(0,3,2) 
); 

geometry.computeFaceNormals();// we won't care about this here 

(我不关心的值,所以我不知道哪个形状它能给)

你能看到的是,两个数组是建立:顶点。现在每帧发生的事情是,每个面都与其顶点的位置“绘制”在一起。

您可以通过删除geometry.vertices数组中的顶点来问问什么是错误的:让我们想象上面的第二个顶点被删除。数组现在看起来是这样的:

geometry.vertices=[ 
    THREE.Vector3(12,15,5),//index:0 
    THREE.Vector3(12,10,2),//new index:1 
    THREE.Vector3(10,10,2)//new index:2 
]; 

有一个在指数3.因此,当GPU将绘制下一帧,如果脸部指向它(这里的第二面),它会尝试访问没有更多的顶点其坐标(在y和z之前的第一个x)。这就是控制台返回的原因,它不能读取未定义的x

这是对错误的长时间解释。你可以看到顶点删除也移动了数组,所以面没有正确的形状,并且它们的法线不再对应。最糟糕的是,缓冲区将不得不改变,这是完全不允许的,例如规定有:

Dynamically Adding Vertices to a Line in Three.js

Adding geometry to a three.js mesh after render

的解决方案是使用的招数,引:修改你的顶点坐标,隐藏面孔......这取决于你想要做什么。

如果你的场景没有太多的顶点,你也可以移除前一个网格,并用一个新的几何体创建一个新的几何体,没有一个顶点和一个校正的面阵列。