6

SplineCurve3を使用して、X軸とY軸にのみ線をプロットしています。この線に沿ってspline.getPoint(t)、tが0から1の時間で正常にアニメーション化されている立方体があります。内積を使用して、Yである上向きベクトルを介して立方体を線に向けようとしています。

ほぼ整列していますが、わずかにずれています。Yベクトルの内積と現在の点の接線を、クォータニオンを回転させる角度として使用することを考えました。

これが私のレンダリング関数です:

function render() {

    var updateMatrix = new THREE.Matrix4(); 
    updateMatrix.setPosition(spline.getPoint(t));

    var angle = new THREE.Vector3(0,1,0).dot(spline.getTangent(t).normalize());

    var quat = new THREE.Quaternion;
    quat.setFromAxisAngle(new THREE.Vector3(0,0,1), angle);
    updateMatrix.setRotationFromQuaternion(quat);

    marker.rotation.getRotationFromMatrix(updateMatrix);
    marker.matrixWorld = updateMatrix;

    t = (t >= 1) ? 0 : t += 0.002;

    renderer.render(scene, camera); 
}

そして、ここに私の問題を示すフィドルがあります、誰かが私が回転の側面でどこが間違っているのか教えてもらえますか?

あなたは私の-jsfiddleの例を編集することができます

4

1 に答える 1

14

経験則として、object.matrix直接混乱するのではなく、オブジェクト、、、およびを設定するのpositionrotation最善scaleです。ライブラリにマトリックス操作を処理させます。あなたは持っている必要がありますmatrixAutoUpdate = true;

回転部分を処理するには、最初に曲線の接線を取得します。

tangent = spline.getTangent( t ).normalize();

オブジェクトを回転させて、上向きベクトル(ローカルyベクトル)が曲線の接線ベクトルの方向を指すようにします。まず、回転する軸を計算します。軸は、上向きベクトルと接線ベクトルによって定義される平面に垂直なベクトルです。このベクトルを取得するには、外積を使用します。

axis.crossVectors( up, tangent ).normalize();

あなたの場合、スプラインはz軸に垂直な平面にあるため、計算されたばかりの軸はz軸に平行になることに注意してください。ただし、正のz軸または負のz軸の方向を指す場合があります。これは、接線ベクトルの方向によって異なります。

次に、上向きベクトルと接線ベクトルの間の角度をラジアンで計算します。上向きベクトルと接線ベクトルの内積は、それらの間の角度の正弦を示します(両方のベクトルが単位長であるため)。次に、角度自体を取得するためにアークコサインを取得する必要があります。

radians = Math.acos( up.dot( tangent ) );

次に、軸と角度からクォータニオンを抽出します。

marker.quaternion.setFromAxisAngle( axis, radians );

編集:[古いフィドルが削除されました]

three.js r.69

于 2012-06-24T21:33:51.177 に答える