我想通过四元数进行一些旋转。
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”可以进行旋转。
让我很困惑。
答案 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矢量
您可以使用非垂直向量/四元数进行测试,您将看到旋转不正确