基本上,给定一个四元数(qx,qy,qz,qw)......我如何将它转换为 OpenGL 旋转矩阵?我也对哪个矩阵行是“向上”、“向右”、“向前”等感兴趣......我有一个四元数的相机旋转,我需要矢量......
问问题
44040 次
4 回答
35
以下代码基于一个四元数(qw, qx, qy, qz),其中顺序基于 Boost 四元数:
boost::math::quaternion<float> quaternion;
float qw = quaternion.R_component_1();
float qx = quaternion.R_component_2();
float qy = quaternion.R_component_3();
float qz = quaternion.R_component_4();
首先你必须标准化四元数:
const float n = 1.0f/sqrt(qx*qx+qy*qy+qz*qz+qw*qw);
qx *= n;
qy *= n;
qz *= n;
qw *= n;
然后你可以创建你的矩阵:
Matrix<float, 4>(
1.0f - 2.0f*qy*qy - 2.0f*qz*qz, 2.0f*qx*qy - 2.0f*qz*qw, 2.0f*qx*qz + 2.0f*qy*qw, 0.0f,
2.0f*qx*qy + 2.0f*qz*qw, 1.0f - 2.0f*qx*qx - 2.0f*qz*qz, 2.0f*qy*qz - 2.0f*qx*qw, 0.0f,
2.0f*qx*qz - 2.0f*qy*qw, 2.0f*qy*qz + 2.0f*qx*qw, 1.0f - 2.0f*qx*qx - 2.0f*qy*qy, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f);
根据您的矩阵类,您可能必须在将其传递给 OpenGL 之前对其进行转置。
于 2009-10-12T19:39:18.040 回答
10
一种很容易可视化的方法是将四元数指定的旋转应用于基向量 (1,0,0)、(0,1,0) 和 (0,0,1) . 旋转后的值给出了旋转系统中相对于原始系统的基向量。使用这些向量来形成旋转矩阵的行。生成的矩阵及其转置表示原始系统和旋转系统之间的正向和逆变换。
我不熟悉OpenGL使用的约定,所以也许其他人可以回答你问题的那部分......
于 2009-10-12T19:13:11.883 回答
1
您可能根本不需要处理旋转矩阵。这是一种似乎比转换为矩阵并与向量相乘更快的方法:
// move vector to camera position co (before or after rotation depending on the goal)
v -= co;
// rotate vector v by quaternion q; see info [1]
vec3 t = 2 * cross(q.xyz, v);
v = v + q.w * t + cross(q.xyz, t);
[1] http://mollyrocket.com/forums/viewtopic.php?t=833&sid=3a84e00a70ccb046cfc87ac39881a3d0
于 2013-11-26T22:28:56.987 回答
1
使用 glm,您可以简单地使用强制转换运算符。所以要将matrix4转换为四元数,只需编写
glm::mat4_cast(quaternion_name)
于 2013-12-28T02:35:09.613 回答