Opengl 分解GLF

Opengl 分解GLF,opengl,glrotate,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(-11

我有函数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);
  • 创建单位矩阵
    glLoadIdentity()
  • 通过
    glRotatef(-119.718,-0.58064,-0.575698,-0.575699)旋转矩阵
  • 通过
    glGetDoublev
  • 根据需要,使用三角法计算欧拉角
  • 所以前3个子弹很简单

    double m[16];
    glMatrixMode(GLU模型视图);
    glPushMatrix();
    glLoadIdentity();
    glRotatef(-119.718,-0.58064,-0.575698,-0.575699);
    glGetDoublev(GLU模型视图矩阵,m);
    glPopMatrix();
    
    最后一个项目取决于你的欧拉角顺序和坐标系符号,这是一个纯数学。。。因此,要么自己推导公式(
    atan2
    acos
    是你的朋友),要么谷歌:

    extracting euler angles from rotation matrix
    
    找到一个和你的订单相匹配的点击率。。。要实现它,您还需要了解这些内容,因此请参见我的:

    同样从OP中,我感觉到你不明白
    glRotate
    是如何工作的。简言之,它围绕点
    (0,0,0)
    和任意三维矢量作为轴旋转。请参见上一链接中的罗德里格斯旋转公式,但它也可以通过利用交叉和点积以及使用轴对齐旋转来实现

    现在回到你的问题,在你获得欧拉角(假设顺序为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);
    

    必须按照与欧拉角相同的顺序进行…

    您确定要这样做吗?还是你需要?将一个方向分解为3个轴向旋转(又名:欧拉角)通常是一个糟糕设计的标志。好吧,我想要的是从第一个函数中得到,将它们传递到第二个形式的角度。我知道你想要什么。我是说你不应该那样。你想要这些角度来做点什么;我是说,你试图用这些角度来做的事情,可以用另一种不涉及这些角度的方法来更好地实现。我不怀疑还有其他的方法。但我需要这样做。这个问题是一个数学问题,而不是程序员的问题。读一读。好朋友,它工作得很好!非常感谢你的帮助和时间。