关于glm四元数旋转

时间:2017-06-22 16:59:30

标签: opengl quaternions glm-math

我想通过四元数进行一些旋转。

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”可以进行旋转。

让我很困惑。

2 个答案:

答案 0 :(得分:2)

做了一些研究。 我在glm四元数中找到了操作“*”的定义以及那里发生了什么。

此实施基于这些网站。

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 :(得分: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/