2012-10-05 44 views
5

我已經有雷射和平面。射線與飛機相交,我想知道它在哪裏。我如何獲得這個交點的世界座標?雷與平面相交的座標

(我的特定情況下,我unproject屏幕座標到相機並創建射線。飛機是該場景的地面)

var vector = new THREE.Vector3(mousePosition.x, mousePosition.y, 1); 
projector.unprojectVector(vector, camera); 
var ray = new THREE.Ray(
    camera.position, 
    vector.subSelf(camera.position).normalize() 
); 
+0

在最近的自述三..「*更名'矢量* /矩陣* /四元數''addSelf()/ subSelf()/ crossSelf()...'到'add()/ sub()/ cross()...'。「 –

回答

9

這是通常模式。您可能需要調整它以適應您的特定情況。

var raycaster = new THREE.Raycaster(); // create once and reuse 
var mouse = new THREE.Vector2(); // create once and reuse 

... 

mouse.x = (event.clientX/renderer.domElement.clientWidth) * 2 - 1; 
mouse.y = - (event.clientY/renderer.domElement.clientHeight) * 2 + 1; 

raycaster.setFromCamera(mouse, camera); 

var intersects = raycaster.intersectObjects(objects, recursiveFlag); 

if (intersects.length > 0) { 

    console.log(intersects[ 0 ].point;); 

} 

這裏,objects是一個數組。例如,

var objects = []; 

objects.push(plane_mesh); 

編輯:更新了three.js所r.84

+1

哦,有一個叫'點'的屬性。這很容易..謝謝你:) –

+0

感謝您更新r58。我試圖通過使用worldToLocal函數來獲取飛機上的位置(新的THREE.PlaneGeometry(400,400,10,10)),但座標似乎被搞砸了,X似乎具有正確的範圍( - 200至200),但Y似乎有點短。這通常是如何完成的? –

+0

@drakej你將不得不發佈一個新的問題。一定要包含你的代碼。 – WestLangley

0

由於R55的,你可以使用此快捷方式。它與此類似,但簡化了光線投射,您甚至不必擔心unprojectVector()。

這裏的WestLangley的例子的修改的版本:

var vector = new THREE.Vector3(( 
     event.clientX/window.innerWidth) * 2 - 1, 
     - (event.clientY/window.innerHeight) * 2 + 1, 
     0.5 
    ); 

    var ray = projector.pickingRay(vector.clone(), camera); 

    var intersects = ray.intersectObjects(objects); 

    if (intersects.length > 0) { 

     console.log(intersects[ 0 ].point;); 

    } 

這假定相同的對象陣列

var objects = []; 

objects.push(plane_mesh);