我想从我的Three.js场景中放置的网格物体中获取碰撞检测。我很困惑Raycaster reallu是如何工作的,以及我是否正确。请解释three.js Raycaster方向参数
这里是一个小提琴descripe我有什么问题,
//Add cuba at 40/40
geometry = new THREE.CubeGeometry(20, 20, 20);
material = new THREE.MeshNormalMaterial();
mesh = new THREE.Mesh(geometry, material);
mesh.position.setY(40)
scene.add(mesh);
//Add Ray
var origin = new THREE.Vector3(50, 0, 0),
direction = new THREE.Vector3(-1,0,0),
ray = new THREE.Raycaster(origin, direction),
collisionResults = ray.intersectObjects([mesh]);
if(collisionResults.length!==0){
alert('Ray collides with mesh. Distance :' + collisionResults[0].distance)
}
//Add Arrow to show ray
scene.add(new THREE.ArrowHelper(direction, origin, 50, 0x000000));
不工作: http://jsfiddle.net/FredricBerling/LwfPL/1/
工作: http://jsfiddle.net/FredricBerling/LwfPL/3/
基本上小提琴勾画出一个立方体和50分的形式,我在一个“方向”射线。问题似乎是,即使它不应该,它也会说明“命中”。
我摆出一个Arrowhelper来显示我怀疑Raycaster射出它的射线。
从其他测试看来,Raycaster的方向似乎与Arrowhelper的不同。 Raycaster似乎将射线投射到场景的0,0,0。我很困惑
编辑! Rob给出了答案。我需要确保网格被渲染以便应用矩阵。小提琴用正确的代码进行更新,该代码适用于按预期测试Raycaster。
您不需要先渲染 - 您可以在设置网格位置后调用'mesh.updateMatrixWorld();'。 – WestLangley
谢谢。我注意到了。完全重新渲染这个世界在性能上并不是很好。 :) – Fredric