2

Three.js を使用して、position.set() を使用してオブジェクトを配置すると、THREE.Raycaster はオブジェクトの新しい設定位置を認識していないようです。オブジェクトを 0,0,0 のままにしておくと、メッシュは適切に交差します。

function init(){
var targets = [];
var object;
// More scene initializing code...

// creating a cube object and placing it at (-10,0,-10)
    var objectGeometry = new THREE.CubeGeometry(2,2,2);
    var objectMaterial = new THREE.PhongMeshMaterial({color: 0xEEEEEE });
    object = new THREE.Mesh(objectGeometry, objectMaterial);
    object.position.set(-10, 0, -10);
    scene.add(object);
    targets.push(object);

// more objects created and added to the scene

}

後を追うカメラで動き回れるキャラクター コントローラーがあるので、関数 testRay(); でテストするキャラクター (obj) とターゲットをプラグインします。

function testRay(obj,targets,distance){
// code to keep the ray pointing out in front of the character at all times
    var endRayX = (Math.cos((270*(Math.PI/180))-obj.rotation.y)*distance + obj.position.x);
    var endRayZ = (Math.sin((270*(Math.PI/180))-obj.rotation.y)*distance + obj.position.z);
    var vector = new THREE.Vector3(endRayX,obj.position.y,endRayZ);
    var raycaster = new THREE.Raycaster(obj.positon,vector);
    intersects = raycaster.intersectObjects(targets);
    if(intersects.length>0){
        console.log("intersects.length: "+ intersects.length);
        console.log("intersects.distance: "+ intersects[0].distance);
        console.log("intersects.face: "+ intersects[0].face);
        console.log("intersects.point: " + intersects[0].point);
        console.log("intersects.object: " + intersects[0].object);
    }
}

次に、すべての requestAnimationFrame(main) 呼び出しで、キャラクター コントローラーとターゲットをプラグインして交差するかどうかを確認するために testRay() を実行します。

function main(){
    // some other code
    testRay(character,targets,30)
    window.requestAnimationFrame(main);
}

さて、問題はそれが交差しないことです。それはうまく機能します。作成中に position.set() を使用した後、オブジェクトの新しい位置と交差するようになっています。オブジェクトを交差させるだけでオブジェクトを移動できることに気付きました。これにより、交差座標も移動するようです。オブジェクトをシーンに追加した後で移動した方がよいでしょうか? 違いはありますか?

4

1 に答える 1

3

この質問は少し古いですが、おそらくこれは誰かを助けるでしょう:私は同様の問題を抱えていました. three.js はオブジェクトのワールド変換行列を光線の交差に使用しているようで、操作の順序によっては、呼び出しposition.set();の前後に更新されていない可能性があります。raycaster.intersectObject();これは、オブジェクトがシーンにレンダリングされるときに 3 によって自動的に行われると思いますが、私の場合、オブジェクトは実際にはシーンにありませんでした。私がしなければならなかった のはobject.updateMatrixWorld()、レイキャスティングを行う前に電話することだけでした。

于 2015-01-11T23:29:29.740 に答える