四元数转换旋转旋转矩阵?(Convert Quaternion rotation to rotati

2019-07-22 13:32发布

基本上,给予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?