7

私は光線と飛行機を持っています。光線は平面と交差していますが、どこで交差しているか知りたいです。このインターセションのワールド座標を取得するにはどうすればよいですか?

(私の特定のケースでは、スクリーン座標をカメラに投影せず、光線を作成します。平面はシーンの地面です)

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

2 に答える 2

10

これがいつものパターンです。特定の状況に合わせて調整する必要がある場合があります。

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 用に更新

于 2012-10-05T15:20:34.953 に答える
1

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 );
于 2014-10-03T22:29:21.653 に答える