0

これがそのことです。立方体を形成するために配置された6つの平面で構成されるObject3dがあります。ここで、マウス入力に基づいてクォータニオン回転を適用した後、立方体が停止した後、立方体を最も近い側(平面の子)でカメラにまっすぐに向ける必要があります。私が今していることは、Object3dマトリックスの現在のオイラー角を取得し、このマトリックスに回転を適用し、setFromRotationMatrix()関数を使用してオブジェクトのクォータニオンに戻すことです。この方法が機能する場合もあれば(通常は低角度で)、Z軸の動作が正しくない場合もあります(またはY、あるいはそれらすべてがわからない場合もあります)。

これで、確かに最も近い側を計算して、この側の直接クォータニオンをオブジェクトに適用できます。これは機能しますが、アニメーションは表示されません。

私は現在の角度を取得するためにこのコードを使用しています:http ://www.cs.princeton.edu/~gewang/projects/darth/stuff/quat_faq.html#Q37 。これに基づいて、すべての軸に最も近い90度の回転を計算します。

        function lookAtCamDeg(val){
            var d = 1;
            var s = 1;
            var newAngle;

            if(val < 0)d*=-1;

            val = Math.abs(val);

            if(val <= 45)s*=-1;
            if(val > 45)val=90-val;

            newAngle = val*d*s;

            return newAngle;
        }

そしてそれを適用して私の立方体を回転させます:

            var angles = getAngles();http://www.cs.princeton.edu/~gewang/projects/darth/stuff/quat_faq.html#Q37
            var newX = lookAtCamDeg(angles.x);
            var newY = lookAtCamDeg(angles.y);
            var newZ = lookAtCamDeg(angles.z);

            var ma = cube.matrix;
            ma = ma.rotateX(-newX*DEGREES)
            ma = ma.rotateY(-newY*DEGREES)
            ma = ma.rotateZ(-newZ*DEGREES)
            cube.quaternion.setFromRotationMatrix(ma);

私が今考えているのは、立方体(子)の別々の平面を使用して、それらの法線に基づいてlookAt()メソッドを適用することですが、1つだけでなくオブジェクト全体を回転させる必要があるため、その方法がわかりません。子。誰かが私を正しい方向に導いてくれませんか?私のニーズを達成するための最良の方法は何ですか?

4

1 に答える 1

0

THREE.Quaterionオブジェクトには、補間のためのメソッドが含まれています。したがって、元の顔の法線のクォータニオン値、ここでsetFromRotationMatrix(ma)から取得したクォータニオンを計算し、THREE.Quaterion.slerp()を繰り返し適用して中間を取得します。これは、cube.quaternionに適用できます。

于 2012-12-04T20:36:00.193 に答える