关于glm四元数旋转

About glm quaternion rotation

我想做一些四元数的旋转

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" 即可进行旋转。

这让我很困惑。

当你的四元数的虚部与你的矢量垂直时它起作用。

你的情况是 vec3(0,sin(angle),0) 垂直于 vec3(0,0,1);

你会看到你需要乘以共轭的时候不对。

q 四元数,v 向量。

当你正常执行 q * v 时,你将获得一个 4D 向量,另一个四元数。 我们只是不关心第一个分量并假设它是 0,一个纯四元数。当你做 q * v * q' 你一定会得到一个纯四元数,它可以转化为一个好的 3D 矢量

你可以用非垂直测试vector/quaternion,你会发现你的旋转不对

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

经过一些研究。 我在 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);
} 

如果有人能证明这一点。 非常感谢。