2013-10-09 107 views
3

我想从我的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。

+2

您不需要先渲染 - 您可以在设置网格位置后调用'mesh.updateMatrixWorld();'。 – WestLangley

+0

谢谢。我注意到了。完全重新渲染这个世界在性能上并不是很好。 :) – Fredric

回答

2

您所看到的明显误报是由于这样一个事实,即使您已经设置了方框的位置,但尚未更新其世界变换矩阵。这通常只发生在渲染之前。

如果您将光线投影测试移至第一个渲染(或手动调用updateWorld())之后,您将不会受到影响。

+0

抢!就是这样。非常感谢你。 :)。小提琴也会更新 – Fredric