关于glm四元数旋转

Jun*_* Ke 6 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]);
Run Code Online (Sandbox Code Playgroud)

我的问题是,在许多文章中,四元数旋转的公式是

rotated_v = q*v*q_conj
Run Code Online (Sandbox Code Playgroud)

有点奇怪。在glm中,向量“v”只需乘以四元数“q”就可以进行旋转。

这让我很困惑。

Jun*_* Ke 6

做了一些研究后。我在 glm 四元数中找到了操作“*”的定义以及其中发生的情况。

此实现基于这些站点。

四元数向量旋转优化

更快的四元数向量乘法

这是四元数旋转的两个版本。

//rotate vector 
vec3 qrot(vec4 q, vec3 v) 
{ 
    return v + 2.0*cross(q.xyz, cross(q.xyz,v) + q.w*v);
} 
Run Code Online (Sandbox Code Playgroud)
//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);
} 
Run Code Online (Sandbox Code Playgroud)

如果有人能证明这一点。我真的很感激。