我试图从在Three.js场景中布置的网格中获取碰撞检测。我对Raycaster reallu的工作方式以及正确的方法感到困惑。
这是描述我有什么问题的小提琴
//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。我很迷惑
编辑!。罗布给出了答案。我需要确保已渲染网格,以便应用世界矩阵。Fiddle已更新为可正确测试Raycaster的正确代码。
您看到的明显的误报是由于这样的事实,即使您已经设置了盒子的位置,也尚未更新其世界变换矩阵。这通常仅在渲染之前发生。
如果将光线投射测试移至第一个渲染之后(或updateWorld()
手动调用),则不会受到打击。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句