如何将 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() 的乘法矩阵的主要内容,如果未能解决你的问题,请参考以下文章