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

标签 c++ opengl matrix glut glu

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

因为我有一个初始化为 glList 的多维数据集。我正在做的是用 glu 标准函数进行一些转换,我喜欢用矩阵乘法做完全相同的操作。 但是我被旋转功能卡住了。我想围绕 x 轴旋转立方体,例如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 中使用。

最佳答案

在 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]);
//...

关于c++ - 如何将 glRotatef() 转换为 glMultMatrixd() 的乘法矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24585454/

相关文章:

c++ - 在使用 mmap 读出文件的同时写入文件

c++ - GLFW getkey 'esc' 并关闭窗口

c++ - glsl - 获取像素颜色 [像素着色器]

python - 如何从另一个数组的值中获取一个 numpy 数组 (Python)

c++ - 在 Windows 64 中编译 32 位应用程序时未解析的外部符号

c++ - 如何检索 USB 设备接口(interface) GUID?

c++ - 有没有办法将字符串放入 `string.insert("", "")` 函数中?

c++ - glReadPixels 函数返回错误 1282 (GL_INVALID_OPERATION)

python - 使用 LU 分解求逆矩阵

"condense"矩阵的 Pythonic 方式