これがそのことです。立方体を形成するために配置された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つだけでなくオブジェクト全体を回転させる必要があるため、その方法がわかりません。子。誰かが私を正しい方向に導いてくれませんか?私のニーズを達成するための最良の方法は何ですか?