2017-06-22 308 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” –