特定の軸で四元数から投影された角度を取得する方法は?

私はいくつかの基本的な角度を計算するために私のゲームでクォータニオンを使用しています。

今私は特定の軸を与えられた四元数の角度を取得しようとしています。したがって、四元数と新しい軸が与えられます。投影された角度を戻すことはできますか?

私にとっては、2つのベクトル間の符号付き角度を計算するための確かな方法のようです。コードはUnity3D C#で書かれていますが、必ずしもそうである必要はありません。それはもっと一般的な方法です。

public static float DirectionalAngle(Vector3 from, Vector3 to, Vector3 up)
{
   //project the vectors on the plane with up as a normal
    Vector3 f = Vector3.Exclude(up, from);
    Vector3 t = Vector3.Exclude(up, to);

   //creates an angle-axis rotation
    Quaternion q = Quaternion.FromToRotation(f, t);

   //do something to get the angle out of the quaternion,
   //given the new axis.
   //TODO: Make this method. Doesn't exist.
    Quaternion q2 = Quaternion.GetAngleFromAxis(q, Vector3.right);

    return q2.Angle(q2);
}

x、y、z、wとオイラー角だけでなく、四元数から角度と軸を得ることができます。しかし、軸上の四元数から投影された角度を得る方法はありません。

1

1 答え

見つけた!私がしなければならなかったのは、四元数をローカル空間に向けるように回転させることでした。この方法は、私がテストしたすべての飛行機にとって健全なようです。

public static float DirectionalAngle(Vector3 from, Vector3 to, Vector3 up)
{
   //project the vectors on the plane with up as a normal
    Vector3 f = Vector3.Exclude(up, from);
    Vector3 t = Vector3.Exclude(up, to);

   //rotate the vectors into y-up coordinates
    Quaternion toZ = Quaternion.FromToRotation(up, Vector3.up);
    f = toZ * f;
    t = toZ * t;

   //calculate the quaternion in between f and t.
    Quaternion fromTo = Quaternion.FromToRotation(f,t);

   //return the eulers.
    return fromTo.eulerAngles.y;
}
1
追加された
いいえ、それは私に符号なしの角度を与えます。私は2つの符号付き(指向性)角度が必要です。ですから、実際には から になります。しかし、私は一般的に使用されている atan2 アプローチが嫌いです。
追加された 著者 Marnix,
私がこれを正しく理解すれば;投影されたベクトル f t の間の角度を探していませんか?その場合、これで十分です: Vector3.Angle(f、t)
追加された 著者 Markus Jarderot,
実際には、 atan2 メソッドが必要です。これはひどく非効率的です(とにかくボンネットの下にatan2が残っています)。
追加された 著者 JCooper,