2013-05-10 59 views
0

使用glFrustum,绘制在非规范化坐标 - 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,也不想使事情变得复杂?

回答

3

我认为你仍然很难想象什么是平截头体,以及它如何与投影相关。简单地说平截头体与它的尖端的棱锥每隔一段距离切断:

frustum

如果用作OpenGL的投影矩阵的平截头体的边界限定在视图空间体积坐标(即后模型视图变换),通过投影变换和均匀分割,变换为范围{-1,1}²×{0,1}的立方体。

近平面的范围定义视图空间坐标中的范围 - 即将视图点放置在(0,0,0)处的世界空间 - 将被映射(即“拉伸”和/或“捏“)到用glViewport定义的渲染窗口的范围。

简而言之:您使用glViewport来定义事物应该去的窗口中的像素坐标和glFrustum来排除视图空间中的切片(这是世界空间移动的方式,使得相机在(0,0,0))。

+0

在透视分割之后,立方体的x和y维映射到[-1,1]。但是,深度坐标范围是[0,1]。 – radical7 2013-05-10 22:03:53

+0

@ radical7:事实确实如此,然而OP正在与视角空间截锥体的概念斗争。我不想过分强调NDC方面的工作。 – datenwolf 2013-05-11 00:14:17

+0

@datenwolf:在时间轴中观看和建模转换之后,不是“glFrustum”是投影转换的一个步骤吗?对象空间坐标转换为眼睛空间 - >剪辑空间 - > NDC空间。那么为什么你提到的View/Eye Space中的这些问题呢? – user1240679 2013-05-13 12:58:17