[英]Can a Three.js raycaster intersect a group?
我想知道我的 raycaster 是否正在查看我加载的 OBJ。 由于从 Cinema4D 导出的方式,我相信 OBJ 是一个有 3 个孩子的 THREE.Group,而不是一个 THREE.Object。 我可以更改我的 raycaster 代码行来查找该组而不是对象吗?
raycaster.set(controls.getObject().position, controls.getDirection(), 0, 40)
var intersects = raycaster.intersectObjects(scene.children, true);
if (intersects.length > 0) {
//CURRENTLY INTERSECTING SOMETHING
for (var i = 0; i < onOffCubes.length; i++) {
//if the first thing the raycaster sees is a one of my cubes
if (intersects[0].object == onOffCubes[i]) {
ExperiencesData[i].userClose = true
}
}
}
onOffCubes 是一个包含 6 个 OBJ/THREE.js 组的数组:
这么近。 相交对象是一个网格,该网格的父对象是组。 您需要匹配相交的父对象而不是相交的对象。 即:
intersects[ 0 ].object.parent === onOffCubes[ i ]
而不是:
intersects[ 0 ].object === onOffCubes[ i ]
TL; 博士
为了使用类似的结构进行测试,我生成了六组,每组三个网格,每组网格共享相同的材料。 请注意,onOffCubes 不是 THREE.js 组,而是一组组。 这就像原始海报的 onOffCubes:
var onOffCubes = []
for ( var i = 0; i < 6; i++ ) {
var material = new THREE.MeshBasicMaterial({ color: 0xee55aa })
var group = new THREE.Group()
for ( var j = 0; j < 3; j++ ) {
var mesh = new THREE.Mesh( geometry, material );
mesh.position.x = Math.random() * 100 - 50;
mesh.position.y = Math.random() * 100 - 50;
mesh.position.z = Math.random() * 200 - 200;
group.add( mesh );
}
onOffCubes.push( group )
scene.add( group )
}
检查全场景
var intersects = raycaster.intersectObjects( scene.children, true );
或只检查 onOffCubes
var intersects = raycaster.intersectObjects( onOffCubes, true );
与原始海报的代码基本相同,并带有一个修复程序:
if (intersects.length > 0) {
for (var i = 0; i < onOffCubes.length; i++) {
if (intersects[ 0 ].object.parent === onOffCubes[ i ]) {
// What I tested with
//intersects[ 0 ].object.material.color.set( 0xff0000 )
// Your code
ExperiencesData[i].userClose = true
}
}
}
试着看看你小组的孩子:
var intersects = raycaster.intersectObjects(YOUR_OBJECT.children, true);
THREE.Group 继承自 THREE.Object3D,所以它可以工作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.