使用Three.js,当我使用position.set()定位对象时,THREE.Raycaster似乎不知道对象的新设置位置。如果我将对象保留在0,0,0,则网格正确交叉。
function init(){
var targets = [];
var object;
// More scene initializing code...
// creating a cube object and placing it at (-10,0,-10)
var objectGeometry = new THREE.CubeGeometry(2,2,2);
var objectMaterial = new THREE.PhongMeshMaterial({color: 0xEEEEEE });
object = new THREE.Mesh(objectGeometry, objectMaterial);
object.position.set(-10, 0, -10);
scene.add(object);
targets.push(object);
// more objects created and added to the scene
}
我有一个角色控制器,我可以使用随后的摄像头移动,所以我插入角色(obj)和目标,以测试函数testRay();
function testRay(obj,targets,distance){
// code to keep the ray pointing out in front of the character at all times
var endRayX = (Math.cos((270*(Math.PI/180))-obj.rotation.y)*distance + obj.position.x);
var endRayZ = (Math.sin((270*(Math.PI/180))-obj.rotation.y)*distance + obj.position.z);
var vector = new THREE.Vector3(endRayX,obj.position.y,endRayZ);
var raycaster = new THREE.Raycaster(obj.positon,vector);
intersects = raycaster.intersectObjects(targets);
if(intersects.length>0){
console.log("intersects.length: "+ intersects.length);
console.log("intersects.distance: "+ intersects[0].distance);
console.log("intersects.face: "+ intersects[0].face);
console.log("intersects.point: " + intersects[0].point);
console.log("intersects.object: " + intersects[0].object);
}
}
然后每个requestAnimationFrame(main)调用,我在testRay()中插入字符控制器和目标,看它是否相交。
function main(){
// some other code
testRay(character,targets,30)
window.requestAnimationFrame(main);
}
好的,所以问题不在于让它相交,这很有效。在创建过程中使用position.set()后,它会使对象的新位置相交。我注意到我可以简单地通过交叉来移动物体,这似乎也可以移动交叉点坐标。将对象添加到场景后移动对象会更好吗?有区别吗?
答案 0 :(得分:1)
这个问题有点旧,但这可能对某人有所帮助:
我遇到了类似的问题。似乎three.js使用对象世界变换矩阵进行光线交叉,并且根据您的操作顺序,这可能在position.set();
之后和raycaster.intersectObject();
调用之前未更新。我相信这是在场景中渲染对象时由三个自动完成的,但在我的情况下,对象实际上并不在场景中。我所要做的只是在做光线投射之前调用object.updateMatrixWorld()
。