视景体定义了你实际看到世界的范围,视景体外的每个对象都不可见,而视景体内的一切都有可能是可见的(如果没有被前面的物体遮挡)。视景体的形状由所使用的投影类型确定。有两种投影类型:正交投影和透视投影。正交投影不考虑观察者距离(不太自然但对CAD软件等很有用),而透视投影考虑了观察者距离,因此更远的物体看起来更小。在正交投影中,视景体是一个立方体,在透视投影中,视景体呈一个棱锥形状(近裁剪平面比远裁剪平面小)。无论哪种情况,视景体的内容都被“投影”到近裁剪平面上。当然,这个过程比简单的投影矩阵乘以视景体中的每个顶点要复杂一些;但基本上在几乎所有与OpenGL相关的书籍中都有解释。视景体形状在某种程度上模拟了相机的属性...你能看到多宽,能看多远等等。
这本红书在专门的视角章节中很好地解释了这一点。
当谈论一个棱台时,意味着你正在使用透视投影。
要构建一个棱台,你需要8个点,并且通常希望构建对称的棱台来简化投影矩阵。
你将使用辅助方法(如gluPerspective(fovy,aspect_ratio,near,far)),而不是直接手动指定8个点来构造棱台;它使用“更直观”的参数进行棱台构造; 它基本上是glFrustum的包装器,为您计算8个点,然后调用glFrustum而不是您自己。
对于OpenGL 3.0及更高版本,您将提供自己的gluPerspective实现,您可以简单地通过谷歌搜索代码。
只需记住,投影使3D变成2D。
关于视图,OpenGL使用右手坐标系(x轴向左,y轴向上,z轴向屏幕外); DirectX使用左手坐标系。
请记住,在3D空间中,您只有2种坐标系方向(左手和右手)。
区别在于z轴的方向;如果你让z轴指向内部,那么它是一个左手坐标系,如果你让z轴指向外部,那么它是一个右手坐标系。
任何其他方向的z轴都不会使z轴垂直于x和y轴,因此你就没有了一个坐标系。
左右手定则决定了一些东西,比如正旋转的方向等等。
你的相机最初位于原点(0,0,0),默认情况下面对着-z轴;除非你应用某种变换,否则它将一直保持这样。
你的视锥体是围绕观察方向构建的,近裁剪平面位于距离相机初始位置z=-near的位置。
当您将
near和
far指定为正值时,使用glFrustum函数时,您并没有指定它们的
z位置,只是因为相机默认沿着负z轴方向,且相机最初位于原点(0,0,0),所以近裁剪平面位于
z=-near处,而您的近裁剪平面始终与观察者眼睛位置(即相机位置)相距
near。
每当更改视图(更改相机位置或更改相机方向或两者同时更改)时,您的视锥体仍将“围绕新视图方向”旋转,并且近裁剪平面仍将与新相机位置相距“near”。
希望您能理解这个概念。
视锥体定义了多少空间。
无论相机在哪里并指向何处。
GL_PROJECTION
矩阵中,而应该放在GL_MODELVIEW
矩阵中。 - Nicol Bolas