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

Pol*_*878 17 opengl graphics matrix quaternions

基本上,给定一个quaterion(qx,qy,qz,qw)...我怎样才能将它转换为OpenGL旋转矩阵?我也对哪个矩阵行是"向上","向右","向前"等感兴趣...我在矢量中需要四元数的相机旋转...

Mal*_*sen 31

以下代码基于四元数(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();
Run Code Online (Sandbox Code Playgroud)

首先,您必须规范化四元数:

const float n = 1.0f/sqrt(qx*qx+qy*qy+qz*qz+qw*qw);
qx *= n;
qy *= n;
qz *= n;
qw *= n;
Run Code Online (Sandbox Code Playgroud)

然后你可以创建你的矩阵:

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);
Run Code Online (Sandbox Code Playgroud)

根据您的矩阵类,您可能必须在将其传递给OpenGL之前进行转置.

  • 仅供参考,对于任何看这个的人来说,这看起来像是一个行主要的解释。它应该像传递给 OpenGL 一样工作,因为列优先和行优先导致相同的线性数组。但是,如果将它与列主库一起使用以与另一个矩阵相乘,您可能会遇到问题,具体取决于您的库的工作方式。 (2认同)

Jim*_*wis 9

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

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