分解glRotatef

Decompose glRotatef

我有带这些参数的函数 glRotatef。

glRotatef(-119.718,-0.58064,-0.575698,-0.575699);

如果我这样做...

glRotatef(-119.718,-0.58064,0.0,0.0);
glRotatef(-119.718,0.0,-0.575698,0.0);
glRotatef(-119.718,0.0,0.0,-0.575699);

我没有得到与使用上面相同的旋转。那么,如何从中获取每个元素 (x, y, z) 的旋转?

glRotatef(-119.718,-0.58064,-0.575698,-0.575699);
  1. 创建单位矩阵glLoadIdentity();
  2. 将矩阵旋转glRotatef(-119.718,-0.58064,-0.575698,-0.575699);
  3. 通过glGetDoublev
  4. 得到矩阵到CPU边码
  5. 使用三角函数从中计算欧拉角,以满足您的需要

所以前 3 个项目符号很简单...

double m[16];
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glRotatef(-119.718,-0.58064,-0.575698,-0.575699);
glGetDoublev(GL_MODELVIEW_MATRIX,m);
glPopMatrix();

最后一个项目符号取决于您的欧拉角阶数和坐标系符号及其纯数学...因此,要么自己推导方程式(atan2acos 是您的朋友),要么google:

extracting euler angles from rotation matrix

并找到与您的订单匹配的命中...要实施它,您还需要了解这些内容,请参阅我的:

同样从 OP 中,我感觉你不明白 glRotate 是如何工作的。简而言之,它围绕点 (0,0,0) 和任意 3D 矢量作为轴旋转。请参阅前面 link 中的 Rodrigues_rotation_formula,但它也可以通过利用叉积和点积并使用轴对齐旋转来实现。

现在在获得欧拉角(假设顺序 ax,ay,az)后回到您的问题,那么旋转本身将如下所示:

glRotatef(ax,1.0,0.0,0.0);
glRotatef(ay,0.0,1.0,0.0);
glRotatef(az,0.0,0.0,1.0);

并且必须按照与您的欧拉角相同的顺序完成...