2017-12-02 21 views
0

クォータニオンの実装で何が問題になりますか?私は彼らがまだジンバルロックとすべてを持つオイラーのように行動すると思う。クォータニオンはオイラーのように振る舞う

Quaternionf rotations = makeQuaternion(new Vector3f(1, 0, 0), angles.x); 
      rotations.mul(makeQuaternion(new Vector3f(0, 1, 0), angles.y)); 
      rotations.mul(makeQuaternion(new Vector3f(0, 0, 1), angles.z)); 

Matrix4f matrix = new Matrix4f(); 

matrix.translate(position); 
matrix.rotate(rotations); 
matrix.scale(scale); 

anglesにはオイラー角が含まれています。人々はいつも私はそれらをまったく使用すべきではないと私に言いますが、私は四元数の価値をどう変えるか分かりません。そして私はQuaternionf rotationsが正しいと思います。例えば。角度が0, 90, 0の場合、クォータニオンは0.00, 0.707, 0.00, 0.707 (x,y,z,w)を含みます。どちらが正しい?

だからどこに問題がありますか?私はこの主題について私が見つけたすべてのものを読んだが、明らかにまだそれを得ていない。

EDIT:

private static Quaternionf makeQuaternion(Vector3f n, float a) { 

    float w, x, y, z; 

    a = a/360 * (float) Math.PI * 2; 

    w = (float) Math.cos(a/2); 

    x = (float) (n.x * Math.sin(a/2)); 
    y = (float) (n.y * Math.sin(a/2)); 
    z = (float) (n.z * Math.sin(a/2)); 

    Quaternionf quaternion = new Quaternionf(x, y, z, w); 

    return quaternion; 

} 
+0

*「クォータニオンの実装には何が問題になりますか?あなたの*クォータニオンの実装を表示していないので、私たちは理解できません。 – luk2302

+0

@ luk2302さて、それがそれの最も重要な部分だと思います。私はあなたに 'makeQuaternion'関数を与えることができますが、私が言ったように、正しい結果を与えると思います。 – Maineri

+0

クォータニオンを正規化していますか? –

答えて

1

四元数は非常に欺瞞的に見える、彼らのためにソリッドなフィーリングを得ることは非常に、非常に困難です。

まず、既に読んでいるかもしれないいくつかのリソース。四元ためのWikipediaのページには、方程式のための素晴らしいリソースです:https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation

私も四元、何についての基礎上のブログの記事は、私は彼らのために感触を得る助けた: https://blog.mide.com/quaternions-for-orientation

ありますmakeQuaternionで奇妙に見えるものはほとんどなく、物事を間違って使っているのか、別々の場所に作品を貼っているのかは不明です。

あなたが実装しようとしている式は次のとおりです。

ここ

quaternion equation

、Aはあなたが単一の軸の周りの総回転をした場合は、適用される回転で全回転角度、で、 Bx、By、Bzは方向角である。原点を指すベクトルを表すので、方向角の余弦の二乗の和は1である必要があります(つまり、cos^2 Bx + cos^2 By + cos^2 Bz = 1)。

あなたはn.x、n.y、n.zを使用します。それは、正方形の合計が1であることを確認する限り動作します。つまり、単位球上の点である必要があります。 Aと方向角の間にも同様の関係がありますが、クォータニオンの2乗の合計が1であることを確認する最も簡単な方法はあります。

+0

私は2クォータニオンを持っています。 1つはオブジェクトの向きであり、もう1つは一時的な現在の向きの変更です。一時的なもののx + y + z + wは正規化後1.01に似ており、主なものは-2と2の間でジャンプしています。これらの2つの四元数は一緒に乗算されます。 – Maineri

+0

makeQuaternionを使用していて、結果が-2から+2の場合は、aとnの値が不合理であることを意味します。 n個の値が余弦二乗検定の和を通過する場合は、aの値でなければなりません。 1.01はちょうど丸め誤差になる可能性があります また、ijkベクトルを使って正しく乗算していることを確認してください。 Q1がX = 1であり、Q2がY = 1である場合、Q1 * Q2 =(Z = 1) – pscheidler

+0

これらはどうなるでしょうか?彼らは、角度が0〜360の間にあることを私はそこに定めています。そして、軸の値は0と1の間です。 y軸を中心に90回転:makeQuaternion(new Vector3f(0、1、0)、90)。 – Maineri

関連する問題