【问题标题】:How to convert glRotatef() to multiplication matrice for glMultMatrixd()如何将 glRotatef() 转换为 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 中使用。

【问题讨论】:

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

标签: c++ opengl matrix glut glu


【解决方案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 不会故意“转置”矩阵。
猜你喜欢
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多