由于three.js不再支持四边形面,因此我在使用Raycast拾取四个顶点组成的正方形的线段时遇到了问题,因为现在它们由三角形面组成。
因此,我的拾取返回的是三角形而不是正方形:
var faces = 10;
var myplane = new THREE.Mesh(
new THREE.PlaneGeometry(1000, 1000, faces, faces),
new THREE.MeshNormalMaterial({
color: 0x993333,
wireframe: false
}));
objects.push(myplane);
scene.add(myplane);
//raycast code
if ( intersects.length > 0 ) {
_controls.noRotate = true;
var face = intersects[0].face;
var temp = intersects[0].object;
var geo = temp.geometry;
geo.vertices[face.a].z -= 20;
geo.vertices[face.b].z -= 20;
geo.vertices[face.c].z -= 20;
//want other face verts below basically
geo.vertices[face.d].z -= 20;
geo.vertices[face.e].z -= 20;
geo.vertices[face.f].z -= 20;
geo.verticesNeedUpdate = true;
if(intersects[ 0 ].faceIndex % 2 == 0){
// geo.vertices[intersects[0].faceIndex + 1].z = 40;
// console.log("Even face Index: " + intersects[ 0 ].faceIndex);
}else{
// console.log("Odd face Index: " + intersects[ 0 ].faceIndex -1);
//geo.vertices[intersects[0].faceIndex - 1].z = 40, of course doest work
}
}
以下是一个2D示例,用于更好地展示:
目前我得到的结果是红色的,但我希望像绿色的示例一样选择:
![平面分段示例](https://istack.dev59.com/xGnGx.webp)
THREE.Geometry
类型的几何体进行平面光线投射,那么intersects[ 0 ].faceIndex
将告诉你所选面的面索引。 如果faceIndex
是偶数,则加1可得到该四边形第二个面的面索引。 如果faceIndex
是奇数,则减去1。 - WestLangley