将四元数旋转转换为旋转矩阵?

基本上,给定quaterion(qx,qy,qz,qw)...我如何将它转换为OpenGL旋转矩阵? 我也有兴趣在哪个矩阵行是“上”,“右”,“前进”等...我有一个相机旋转四元数,我需要在向量中...


以下代码基于四元数(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之前进行转置。


一种很容易可视化的方法是将由四元数指定的旋转应用到基向量(1,0,0),(0,1,0)和(0,0,1) 。 旋转的值给出了旋转系统中相对于原始系统的基向量。 使用这些向量来形成旋转矩阵的行。 得到的矩阵及其转置表示原始系统和旋转系统之间的正向和反向转换。

我不熟悉OpenGL使用的约定,所以也许别人可以回答你的问题的部分...


你可能根本不需要处理旋转矩阵。 这是一种看起来比转换为矩阵和乘以矢量更快的方式:

  // 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

链接地址: http://www.djcxy.com/p/81845.html

上一篇: Convert Quaternion rotation to rotation matrix?

下一篇: Rotating an object around it's centre in OpenGL