6

少し複雑なので、我慢してください。

  • オブジェクトにmorphTargetsがない場合、レイ交差は完全に機能します。

  • オブジェクトにmorphTargetsがある場合、元の位置のみを交差させることができます。つまり、モデルをからモーフィングする0,0,050,50,50、光線は50、50、50でオブジェクトと交差しません。代わりに、マウスを上に置くと交差します0,0,0。 (オブジェクトがもう存在しない場合でも!?)。

頂点が移動したことをthree.jsに認識させるためにオンにする必要があるある種のフラグはありますか?

編集、コードを追加。

これによりメッシュが作成され、オブジェクト配列に追加されます(レイ交差が使用します)。

function createDeer( deerGeometry, materials ) {
    mesh = new THREE.MorphAnimMesh( deerGeometry, new THREE.MeshLambertMaterial( { color: 0xE8E8E8, ambient: 0xE8E8E8, morphTargets: true, vertexColors: THREE.FaceColors } ) );
    mesh.scale.set( 3, 3, 3 );
    mesh.position.set( 0, -3, 0 );
    mesh.rotation.set( 0, 0, 0 );
    mesh.castShadow = true;
    mesh.receiveShadow  = true;
    mesh.geometry.dynamic = true;
    scene.add( mesh );
    objects.push( mesh );
}

光線の交差はmouseDownで発生します(mouseOverもありますが、同じことです)。前述したように、コードは正常に機能し、元のモーフィングされていないメッシュと交差しているだけです。

function onDocumentMouseDown( event ) {

    event.preventDefault();

    var vector = new THREE.Vector3( mouse.x, mouse.y, 0.5 );
    projector.unprojectVector( vector, camera );

    var ray = new THREE.Ray( camera.position, vector.subSelf( camera.position ).normalize() );

    var intersects = ray.intersectObjects( objects );

    if ( intersects.length > 0 ) {

        SELECTED = intersects[ 0 ].object;

        for(var i=0; i<objects.length; i++)
            { 
                if(SELECTED.position.x == objects[0].position.x) {
                    thisObject = i; 
                    }
                }

            }

        var intersects = ray.intersectObject( plane );

        container.style.cursor = 'pointer';
    }

}

問題は(メッシュ変換のように)鹿の位置が決して変わらないという事実に関連しているに違いないと判断しましたが、頂点は移動します。光線が交差するときにオブジェクトの位置を比較しているので、おそらく問題はここにありますか?

4

2 に答える 2

1

これをマージして修正するプル リクエストを作成しました。

boundingSphereこれが機能するには、オブジェクトの にモーフィングの全範囲が含まれている必要があることに注意してください。

于 2014-01-09T23:58:08.493 に答える
0

アニメーションはMorphTarget完全にGPU(シェーダー コードで) で行われますが、光線の交差は常に で計算されCPUます。実際、ここで説明していることを達成する簡単な方法はありません。

于 2013-10-18T19:26:42.513 に答える