关于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,你会发现你的旋转不对
经过一些研究。
我在 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);
}
如果有人能证明这一点。
非常感谢。
我想做一些四元数的旋转
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,你会发现你的旋转不对
经过一些研究。 我在 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);
}
如果有人能证明这一点。 非常感谢。