使用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(注意上面// //房间左侧墙的片段),即X轴:-1成为左边,1成为右边,原点位于中心。登记/> Y轴:1成为顶部,-1成为右侧,原点位于中心
glFrustum会自动将我的坐标更改为[-1,1]吗?
通常,我会通过指定屏幕坐标来绘制一个立方体,如下所示:
例如:ofBox(512,384,0,10)
在屏幕中央给我一个方框[窗口宽度:1024,窗口高度:768]
如果我想在我的像素坐标中正常绘制并且不希望通过尝试将像素坐标绘制转换为标准化坐标而使我自己变得复杂,即使我使用glFrustum
该怎么办?
答案 0 :(得分:3)
我认为你仍然很难想象截头锥体是什么,以及它与投影的关系。简单地说,截锥体是一个金字塔,它的尖端在一定距离处切断:
如果用作OpenGL投影矩阵,平截头体的边界在视图空间坐标中定义一个体积(即在模型视图转换之后),它将变成一个范围的立方体{-1,1 }²×{0,1}由投影变换和均匀分割。
近平面的范围定义视图空间坐标中的范围 - 即视点位于(0,0,0)的世界空间 - 将被映射(即“拉伸”和/或“收缩” “)到用glViewport
定义的渲染窗口的范围。
简而言之:您使用glViewport
来定义窗口中应该去的像素坐标,并glFrustum
将切片“切割”出视图空间(这是世界空间移动)以这种方式使相机处于(0,0,0))。