我正在尝试在执行以下代码后确定多维数据集的位置:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(3.0, 2.0, 1.0);
glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glTranslatef(1.0, 2.0, 3.0);
glPushMatrix();
glTranslatef(1.0, 1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glTranslatef(2.0, 2.0, 2.0);
glutWireCube(1.0);
我不知道我是否应该考虑GL_MODELVIEW矩阵或GL_PROJECTION 矩阵。在第一个 glPushMatrix()之后,glMatrixMode从GL_MODELVIEW变为GL_PROJECTION,所以我应该忽略 glTranslatef(3.0,2.0,1.0),所以最终的位置是cube是:(3.0,4.0,5.0)?
答案 0 :(得分:3)
让我们只使用MODELVIEW矩阵堆栈:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(3.0, 2.0, 1.0);
glPushMatrix();
glPopMatrix(); // nullifies the above push
glTranslatef(2.0, 2.0, 2.0);
堆栈以一个条目开头;您将其设置为identity,然后将其与转换矩阵相乘。 PushMatrix
在堆栈上的旧条目顶部的新条目中创建此矩阵的副本,然后通过PopMatrix
撤消该矩阵。所以你继续得到第一个矩阵,然后乘以另一个平移矩阵。有效地,模型视图转换(将多维数据集从其模型空间转换为世界空间)是
| 1 0 0 5 |
| 0 1 0 4 |
| 0 0 1 3 |
| 0 0 0 1 |
在世界空间中以(5,4,3)为中心的立方体。
然后继续使用以下
设置投影矩阵堆栈glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glTranslatef(1.0, 2.0, 3.0);
glPushMatrix();
glTranslatef(1.0, 1.0, 1.0);
基于与上述相同的逻辑,您可以获得
的有效投影矩阵| 1 0 0 2 |
| 0 1 0 3 |
| 0 0 1 4 |
| 0 0 0 1 |
这不是一个有效的投影变换矩阵;既不正交也不透视。您可以使用辅助函数glFrustum
(用于透视摄像头)或glOrtho
(用于正交摄像头)创建有效的投影矩阵。 GLU函数gluPerspective
和gluOrtho2D
比gl
函数稍微直观一些。有关详细信息,请参阅Using Viewing and Camera Transforms上的OpenGL常见问题解答。