回転クォータニオンがあり、アップ軸 (ヨー) を中心とした回転角度を抽出したいと考えています。私は XNA を使用していますが、私が知る限り、このための組み込み関数はありません。これを行う最善の方法は何ですか?
助けてくれてありがとう、ヴェナトゥ
回転クォータニオンがあり、アップ軸 (ヨー) を中心とした回転角度を抽出したいと考えています。私は XNA を使用していますが、私が知る限り、このための組み込み関数はありません。これを行う最善の方法は何ですか?
助けてくれてありがとう、ヴェナトゥ
回転のクォータニオン表現は、軸と角度のバリエーションです。したがって、x、y、z軸を中心にrラジアン回転すると、四元数qは次のようになります。
q[0] = cos(r/2);
q[1] = sin(r/2)*x;
q[2] = sin(r/2)*y;
q[3] = sin(r/2)*z;
y軸だけを中心に回転するクォータニオンを作成する場合は、 x軸とz軸をゼロにしてから、クォータニオンを再正規化します。
q[1] = 0;
q[3] = 0;
double mag = sqrt(q[0]*q[0] + q[2]*q[2]);
q[0] /= mag;
q[2] /= mag;
結果の角度が必要な場合:
double ang = 2*acos(q[0]);
これは、四元数表現が格納されていることを前提としています: w,x,y,z. q[0] と q[2] の両方がゼロまたはそれに近い場合、結果の四元数は {1,0,0,0} になります。
クォータニオン q を指定すると、ロール、ピッチ、ヨーを次のように計算できます。
var yaw = atan2(2.0*(q.y*q.z + q.w*q.x), q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z);
var pitch = asin(-2.0*(q.x*q.z - q.w*q.y));
var roll = atan2(2.0*(q.x*q.y + q.w*q.z), q.w*q.w + q.x*q.x - q.y*q.y - q.z*q.z);
これは、xyz オーダーの固有の tait-bryan 回転に適合するはずです。他の回転順序、外部および適切なオイラー回転については、他の変換を使用する必要があります。
ヨー、ピッチ、ロールは任意の回転には適していないことを知っていただければ幸いです。オイラー角には、特異点 (上記のリンクを参照) と不安定性があります。David Sachs のプレゼンテーションの 38:25 を見てください。
http://www.youtube.com/watch?v=C7JQ7Rpwn2k
幸運を!