2016-07-26 58 views
0

我有一个物体(飞机),它是相机的一个孩子,因此它“固定在屏幕上”。THREE.JS对相机的孩子进行光线投射

   plane = new THREE.Mesh(new THREE.PlaneGeometry(10, 10, 10, 10), material); 

       plane.position.set(0,0,-5); 

       camera.add(plane); 

在这架飞机上,我有另一个我想移动的物体,我正在发送光线投射到飞机上。

   if(INTERSECTED){ 

       handleEvent(); 

       raycaster.setFromCamera(mouse, camera); 

       var intersects = raycaster.intersectObject(plane); 

       if(intersects.length>0){ 

        //what is happening here? 
        //these points are definitely not on the plane! 


        var x = intersects[0].point.x; 
        var y = intersects[0].point.y; 
        var z = intersects[0].point.z; 

        INTERSECTED.position.set(x,y,z); 

        console.log(x,y,z); 

       }   
      } 

射线撞击飞机的位置对我来说没有任何意义!

请帮帮我,我卡住了! 谢谢!

这里是小提琴:

jsfiddle.net/74jLjz6q/2 

PS:我发现这个职位,类似的问题,这里的摄像头是另一对象的孩子..我找不到我的问题有任何帮助

它必须是周围的其他方法(世界到地方):..

THREE.js Raycasting from a child camera to the scene

+0

尝试使用'raycaster.intersectObject(plane,true);'true告诉raycaster通过子视图,然后'intersects [0]'应该是第一个相交的对象 – Rush2112

回答

1

欧凯,我通过试错得到了它。

我不知道如果我真的明白这一点..

因此,在世界空间中提供的点。 (..因为THREE.Raycaster总是这样吗?) 它必须在本地空间,因为飞机是相机的孩子。

是吗?

(我不得不手动的。减去相机和平面之间的距离。)

plane.worldToLocal(intersects[0].point); 
INTERSECTED.position.set(intersects[0].point.x,intersects[0].point.y,intersects[0].point.z-5); 

更新和工作小提琴(立方体最后停留在飞机上!:)):

http://jsfiddle.net/74jLjz6q/9/

+1

是的,刚才检查了three.js文档(HTTP://threejs.o rg/docs /?q = Raycaster#Reference/Core/Raycaster),你是对的,它总是返回世界坐标,所以你需要将它们转换为本地 – Alexus