0

在使用 glFrustum 时,

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1, 1, -1, 1, 0.1, 1000.0);
glLoadMatrxi(GL_MODELVIEW);
glBegin(GL_QUADS); //A room's left wall
glVertex3f(-1.0, 1.0, 0.0);
glVertex3f(-1.0, 1.0, -0.4);
glVertex3f(-1.0, -1.0, -0.4);
glVertex3f(-1.0, -1.0, 0.0);
glEnd();

我所有的绘图都发生在-1, 1 中(注意上面的//A room's left wall 的片段),即
X 轴:-1 变成左边,1 变成右边,原点在中心。
Y 轴:1 成为顶部,-1 成为右侧,原点在中心

glFrustum 会自动将我的坐标更改为 [-1,1] 吗?

通常,我会通过指定屏幕坐标来绘制一个立方体,如下所示:
例如:ofBox(512,384,0,10)在屏幕中心给我一个框[窗口宽度:1024,窗口高度:768]

如果我想在我的像素坐标中正常绘制并且不想通过尝试从像素坐标绘图转换为规范化坐标(即使我使用)而使事情变得复杂,该怎么glFrustum办?

4

1 回答 1

3

我认为您仍然很难想象平截头体是什么,以及它与投影的关系。简单地说,平截头体是一个金字塔,其尖端在一定距离处被切断:

截头锥体

如果用作 OpenGL 投影矩阵,则截锥体的边界定义了视图空间坐标中的体积(即在模型视图转换之后),该体积将由投影变换和同质划分。

近平面的范围定义了视图空间坐标中的范围 - 即视点位于 (0,0,0) 的世界空间 - 将被映射(即“拉伸”和/或“压缩”)到用 定义的渲染窗口的范围glViewport

简而言之:您用于glViewport定义窗口中的像素坐标应该去的地方,并glFrustum在视图空间中“切割”一个切片(这是世界空间以相机位于(0,0 ,0))。

于 2013-05-10T14:22:00.430 回答