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

时间:2014-07-05 10:28:10

标签: c++ opengl matrix glut glu

我需要使用不同的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 ,但有些与上面的函数完全不同。有没有一个generell原理如何将glRotatef()函数转换为gl变换矩阵?

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

1 个答案:

答案 0 :(得分: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]);
//...
相关问题