2017-06-22 312 views
2

我想通過四元數進行一些旋轉。關於glm四元數旋轉

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中,向量「v」只是乘以四元數「q」就可以進行旋轉。

它讓我困惑。

回答

1

之後做一些研究。 我在glm quaternion中找到了操作「*」的定義,並在那裏發生了什麼。

此實施基於這些網站。

Quaternion vector rotation optimisation

A faster quaternion-vector multiplication

這裏的版本二由四元數旋轉。

//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(角度),0)是垂直於VEC3(0,0,1);

你會看到,你需要由共軛乘以當它是不正確的。

q quaternion,v vector。

當你做q * v通常你會得到一個4D向量,另一個四元數。 我們只是不關心第一個組件,並假定它是0,一個純粹的四元數。當你做Q * V * Q」你一定要獲得純四元數,其轉化爲一個不錯的3D矢量

你可以用非垂直矢量/四元數測試,你會看到你的旋轉是不正確的

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

+0

事實上,我曾嘗試做q * v * q'來獲得旋轉矢量。但這是不正確的。 (cos(弧度(deg)),0,sin(弧度(deg)),0); quat q_conj =共軛(q); vec4 newv = vec4(0,v); newv = q * newv * q_conj;' 而我得到了(0.000000,0.000000,0.000000,1.000000) –

+0

它看起來像什麼都不做。 –

+0

我的代碼運作良好'季銨鹽TMP =混合物(m_init,m_end,t)的一個和平; vec3 res = tmp * m_initTargetVector * conjugate(tmp));'你不需要vec4「newv」 –