OpenGL中的多维数据集位置

时间:2015-10-27 09:14:39

标签: opengl translation

我正在尝试在执行以下代码后确定多维数据集的位置:

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)

1 个答案:

答案 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函数gluPerspectivegluOrtho2Dgl函数稍微直观一些。有关详细信息,请参阅Using Viewing and Camera Transforms上的OpenGL常见问题解答。