2012-10-05 55 views
5

私は光線と平面を持っています。光線が飛行機と交差していて、どこにいるのか知りたいです。どのように私はこのintersetionの世界座標を得るのですか?レイと平面の交点の座標

(私の特定の場合、私がカメラにスクリーン座標を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

を前提としてい..「* 'ベクトル* /マトリックス* /クォータニオン改名は'' add()/ sub()/ cross()... ''に '' addSelf()/ subSelf()/ crossSelf() –

答えて

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); 

EDIT:R55のとおりthree.js r.84

+1

ああ、 'ポイント'という属性があります。それは簡単です..ありがとう:) –

+0

r58のためにそれを更新していただきありがとうございます。 worldToLocal関数を使用して平面上の位置(新しいTHREE.PlaneGeometry(400,400,10,10))を取得しようとしていますが、座標がねじれているようですが、Xは正しい範囲を持っているようです( - 200から200)、Yは少し短いようです。これは通常どのように行われるのでしょうか? –

+0

@drakej新しい質問を投稿する必要があります。あなたのコードを必ず含めてください。 – WestLangley

0

用に更新、あなたはこのショートカットを使用することができます。これは似ていますが、あなたは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;); 

    } 

これは、同じオブジェクトの配列THREEのための最近のREADMEに

var objects = []; 

objects.push(plane_mesh); 
関連する問題