在三个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
的解决方案是使用的招数,引:修改你的顶点坐标,隐藏面孔......这取决于你想要做什么。
如果你的场景没有太多的顶点,你也可以移除前一个网格,并用一个新的几何体创建一个新的几何体,没有一个顶点和一个校正的面阵列。
probaly这个问题可能会有所帮助http://stackoverflow.com/questions/15384078/updating-a-geometry-inside-a-mesh-does-nothing我猜它的好老'verticesNeedUpdate'标志? – philipp
@菲利普:我忘了提及我已经使用这个标志。问题被编辑。删除顶点后,场景立即中断。 – nora
anwser解决你的问题吗? – Atrahasis