例如:创建N个Plane 位置随机,通过创建之后的mesh 设置 lookat设置为(0,0,0),然后merge为一个geometry;
var arr = [];
function addPlane() {
var geometry = new THREE.PlaneGeometry(5, 5, 32);
var plane = new THREE.Mesh(geometry);
return plane;
}
data.forEach((elem,index) => {
let plane = addPlane( );
plane.position.set(vec3.x, vec3.y, vec3.z);
plane.lookAt(new THREE.Vector3(0, 0, 0));
arr.push(plane)
plane.updateMatrix(); //手动更新模型的矩阵
geometry.merge(plane.geometry, plane.matrix); //将几何体合并
});
let mesh = new THREE.Mesh(geometry, material1);
scene.add(mesh);
生成之后的样子,如果通过射线去拾取plane,会按照geometry的顶点去拾取,但是看到的与射线拾取不同的;
射线拾取时时按照geometry的顶点去拾取,即上面代码中去掉lookat的效果,mesh之后再去改变并不会按照改变之后的拾取;
如果把位置 和 矩阵的设置 放在 new THREE.PlaneGeometry 的时候 设置 geometry;就可以成功