2017-06-22 6 views
2

クォータニオンで回転をしたいです。glmクォータニオンローテーションについて

これは非常にうまくいっています。

vec3 v(0.0f, 0.0f, 1.0f); 
float deg = 45.0f * 0.5f; 
quat q(glm::cos(glm::radians(deg)), 0, glm::sin(glm::radians(deg)), 0); 
vec3 newv = q*v; 
printf("v %f %f %f \n", newv[0], newv[1], newv[2]); 

私の質問があり、多くの記事でクォータニオンによる回転の式は

rotated_v = q*v*q_conj 

それは奇妙なだった:

以下

は私のコードでした。 glmでは、四元数「q」だけを乗算したベクトル「v」が回転を行うことができます。

私を混乱させました。

答えて

1

いくつかの調査をした後。 glm四元数の操作 "*"の定義が見つかりました。

この実装は、これらのサイトに基づいています。

Quaternion vector rotation optimisation

A faster quaternion-vector multiplication

ここでクォータニオンによる回転の2つのバージョンがあります。

//rotate vector 
vec3 qrot(vec4 q, vec3 v) 
{ 
    return v + 2.0*cross(q.xyz, cross(q.xyz,v) + q.w*v); 
} 

//rotate vector (alternative) 
vec3 qrot_2(vec4 q, vec3 v) 
{ 
    return v*(q.w*q.w - dot(q.xyz,q.xyz)) + 2.0*q.xyz*dot(q.xyz,v) +  
      2.0*q.w*cross(q.xyz,v); 
} 

その証拠誰かがことができます。 本当にありがとう。

1

クォータニオンの虚数部分がベクトルと垂直である場合に機能します。

vec3(0、sin(angle)、0)はvec3(0,0,1)と垂直です。

これは、正しくないときにコンジュゲートで乗算する必要があることがわかります。

qクォータニオン、vベクトル。

q * vを実行すると通常は4Dベクトル、もう1つの四元数が得られます。 最初のコンポーネントを気にせず、純粋なクォータニオンである0と仮定します。あなたは、Q *のVの* qを」を実行するときには、優れた3次元ベクトルに変換する純粋な四元数を取得することを確認している

あなたは非垂直なベクトル/四元でテストすることができ、あなたの回転は右ではないことがわかります

https://www.3dgep.com/understanding-quaternions/

+0

実際、回転ベクトルを得るためにq * v * qを実行しようとしています。しかしそれは間違っている。 のようなもの 'quat q(cos(ラジアン(deg))、0、sin(ラジアン(deg))、0); quat q_conj = conjugate(q); vec4 newv = vec4(0、v); newv = q * newv * q_conj; ' そして(0.000000、0.000000、0.000000,1.000000) –

+0

それは何もしないようです。 –

+0

私はよく働くコードの平和を持っています。quat tmp = mix(m_init、m_end、t); vec3 res = tmp * m_initTargetVector * conjugate(tmp)); 'vec4" newv "は不要です。 –

関連する問題