1

我有带有这些参数的函数 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);
4

1 回答 1

2
  1. 创建单位矩阵glLoadIdentity();
  2. 将矩阵旋转glRotatef(-119.718,-0.58064,-0.575698,-0.575699);
  3. 通过以下方式将矩阵获取到 CPU 端代码glGetDoublev
  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();

最后一个项目符号取决于你的欧拉角顺序和坐标系符号及其纯数学......所以要么推导出你自己(atan2并且acos是你的朋友)或谷歌的方程:

extracting euler angles from rotation matrix

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

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

现在在获得欧拉角(假设 order 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);

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

于 2018-11-10T08:27:03.403 回答