我需要使用不同的 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/