基本上,给予quaterion(QX,QY,QZ QW)...我怎样才能将其转换成一个OpenGL旋转矩阵? 我也有兴趣在矩阵行是“上”,“右”,“前进”等等......我在四元数的摄像机旋转,我需要在载体...
Answer 1:
下面的代码是基于一个四元数(QW,QX,QY,QZ),其中顺序是基于升压四元数:
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的前转了。
Answer 2:
做到这一点的方法之一,这是很容易想象,是应用(0,1,0)由您指定的四元数的基础矢量(1,0,0)旋转,和(0,0,1) 。 旋转后的值给出在旋转相对于原始系统的系统中的基本向量。 使用这些载体,以形成旋转矩阵的行。 将得到的矩阵,它的转置,表示原始系统和旋转系统之间的前向和逆变换。
我不熟悉与OpenGL的使用,所以也许有人可以回答你的问题的那部分的约定......
Answer 3:
您可能没有在所有处理旋转矩阵。 下面是似乎比转换为矩阵和矢量与它乘以更快的方式:
// 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
Answer 4:
使用GLM,你可以简单地使用一个转换操作符。 所以从matrix4到四元数转换,简单的写
GLM :: mat4_cast(quaternion_name)
文章来源: Convert Quaternion rotation to rotation matrix?