分解 glRotatef

Posted

技术标签:

【中文标题】分解 glRotatef【英文标题】:Decompose glRotatef 【发布时间】:2018-11-10 03:51:42 【问题描述】:

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

【问题讨论】:

您确定要这样做吗?还是您需要?将方向分解为 3 个轴向旋转(又名:欧拉角)通常是糟糕设计的标志。 嗯,我想要的是从第一个函数中获得将它们传递给第二种形式的角度。 知道你想要什么。我是说你不应该想要。你想要这些角度来对它们做点什么;我的意思是,您尝试用这些角度做的事情可以通过不涉及这些角度的另一种方式更好地实现。 我不怀疑还有其他方法。但我需要这样做。 这个问题是一个数学问题而不是程序员问题。阅读Euler angles。 【参考方案1】:
    创建单位矩阵glLoadIdentity(); 将矩阵旋转glRotatef(-119.718,-0.58064,-0.575698,-0.575699); 通过glGetDoublev获取矩阵到CPU端代码 根据需要使用三角函数计算欧拉角

所以前 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

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

Understanding 4x4 homogenous transform matrices

另外,从 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);

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

【讨论】:

好朋友,效果很好!非常感谢您的帮助和时间。

以上是关于分解 glRotatef的主要内容,如果未能解决你的问题,请参考以下文章

聊聊特征分解和SVD分解

矩阵分解----Cholesky分解

高等工程数学 矩阵的三角分解 (LU分解,LDR分解,Cholesky分解)

高等工程数学 矩阵的三角分解 (LU分解,LDR分解,Cholesky分解)

高等工程数学 矩阵的三角分解 (LU分解,LDR分解,Cholesky分解)

高等工程数学 矩阵的三角分解 (LU分解,LDR分解,Cholesky分解)