分解glRotatef

时间:2018-11-10 03:51:42

标签: opengl glrotate

具有这些参数的函数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 个答案:

答案 0 :(得分:2)

  1. 创建单位矩阵glLoadIdentity();
  2. 将矩阵旋转glRotatef(-119.718,-0.58064,-0.575698,-0.575699);
  3. 通过glGetDoublev将矩阵转换为CPU端代码
  4. 根据需要使用三角函数从中计算欧拉角

所以前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是您的朋友),要么谷歌:

extracting euler angles from rotation matrix

并找到与您的订单匹配的匹配项...要实施该匹配项,您还需要了解相关内容,因此请参阅我的:

从OP中我也感觉到您不了解glRotate的工作方式。简而言之,它围绕点(0,0,0)和任意3D向量作为轴旋转。请参阅上一链接中的 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);

并且必须按照与欧拉角相同的顺序进行...