如何将 glRotatef() 转换为 glMultMatrixd() 的乘法矩阵

Posted

技术标签:

【中文标题】如何将 glRotatef() 转换为 glMultMatrixd() 的乘法矩阵【英文标题】:How to convert glRotatef() to multiplication matrice for glMultMatrixd() 【发布时间】:2014-07-05 10:28:10 【问题描述】:

我需要使用不同的 openGL 函数执行一些操作。

我有一个初始化为 glList 的多维数据集。我正在做的是用 glu 标准函数进行一些转换,我喜欢用矩阵乘法做完全相同的操作。 但我被旋转功能卡住了。我想围绕 x achsis 旋转立方体,例如90°:

glRotatef(90.0, 1.0f, 0.0f, 0.0f);

应替换为:

GLdouble m[16] =1.0, 0.0,  0.0,  0.0,
                 0.0, 0.0,  1.0,  0.0,
                 0.0,-1.0,  0.0,  0.0,
                 0.0, 0.0,  0.0,  1.0 ;
glMultMatrixd(m);

我找到了this very usefull site ,但它与上面的功能并不完全相同。将glRotatef()函数转化为gl变换矩阵有通用原理吗?

更新:抱歉,我错过了文档开头的重要说明,即文档中的矩阵需要转置以在 openGL 中使用。

【问题讨论】:

那么你的问题解决了吗?然后回答或删除此问题。 好的,我添加了我的解决方案和示例。如果会有更通用的解决方案或更好的答案,我会接受。 【参考方案1】:

在 X 轴上

     |  1  0       0       0 |
 M = |  0  cos(A) -sin(A)  0 |
     |  0  sin(A)  cos(A)  0 |
     |  0  0       0       1 |

在 Y 轴上

     |  cos(A)  0   sin(A)  0 |
 M = |  0       1   0       0 |
     | -sin(A)  0   cos(A)  0 |
     |  0       0   0       1 |

在 Z 轴上

     |  cos(A)  -sin(A)   0   0 |
 M = |  sin(A)   cos(A)   0   0 |
     |  0        0        1   0 |
     |  0        0        0   1 |

注意:OpenGL 中的矩阵使用列主要内存布局

例子:

#include <math.h>
#define PI 3.14159265

// Rotate -45 Degrees around Y-Achsis
GLdouble cosA = cos(-45.0f*PI/180);
GLdouble sinA = sin(-45.0f*PI/180);

// populate matrix in column major order
GLdouble m[4][4] = 
   cosA, 0.0, -sinA,  0.0, // <- X column
   0.0,  1.0,   0.0,  0.0, // <- Y column
   sinA, 0.0,  cosA,  0.0, // <- Z column
   0.0,  0.0,   0.0,  1.0  // <- W column
;

//Apply to current matrix
glMultMatrixd(&m[0][0]);
//...

【讨论】:

对于 OpenGL,矩阵不必“转置”,OpenGL 只是使用一种内存布局(主要列),当天真地与 C 风格的多维数组一起使用时,它看起来“不直观”。然而,列主矩阵在计算机图形学中具有巨大的优势,因为大多数时候您对列向量的兴趣比对行向量的兴趣要大。 这不是和转置一样吗?我只是想这样做,所以我可以使用上面文档中提到的相同矩阵。 如果您将这些矩阵输入到使用行主要布局的库中,那么可以。然而,大多数数学包实际上使用列主顺序。我只是想强调 OpenGL 不会故意“转置”矩阵。

以上是关于如何将 glRotatef() 转换为 glMultMatrixd() 的乘法矩阵的主要内容,如果未能解决你的问题,请参考以下文章

从 glLookAt() 到 glRotatef() 和 gltranslatef

glRotatef() - 如何在多轴上应用旋转?

glRotatef 是不是也会旋转法线方向?

OpenGL 转换

如何在 glRotatef 中使用 glm::mat4

OpenGL glRotatef