Part I 空气曲棍球 Chapter6(6.5 Defining a Perspective Projection)
6.5 定义一个透视投影(Defining a Perspective Projection)
透视投影矩阵需要与透视分割配合才能构造出3D效果,投影矩阵并没有透视分割的能力,透视分割也需要其它因素一起配合工作。
在透视投影中物体应该是向屏幕中心移动并且当距离我们越来越远的时候物体也会变得越来越小;因此投影矩阵的主要目标就是产生一个合适的w值,这样的话当OpenGL做透视分割的时候远的物体会变得比近的物体小。其中一种方法通过把z分量当成从焦点开始的距离,然后把z分量映射到w分量,距离越大物体就越小。
6.5.1 调整视口宽高比及视角(Adjusting for the Aspect Ratio and Field of Vision)
下面是一个可以改变宽高比及视角的投影矩阵:
如下表是对这个矩阵变量的解释说明:
a |
假设想要绘制的场景是由相机拍摄的,那这个变量代表的是相机的焦距。由以下公式得出: 且视角小于180度。 举个例子,视角为90度,则相应焦距为 也就是1。 |
aspect |
屏幕宽高比,也就是 |
f | 远平面的距离,必须为正且大于*面的距离。 |
n | *面的距离,必须为正;举个例子:设为+1,则*面位于z轴的-1处。 |
当视角变得越来越小且焦距越来越大的时候,较小的视口将会映射到规范化设备坐标中的区间[-1, 1],这样的话视锥体将会变窄。
在下图中,左边的视锥体的视角为90度,右边的视角为45度。
你应该已经发现45度视角的焦距更长些。
下图是分别从焦点处观察时所看到场景:
当视角越小的时候所看到的场景失真就越少;另一方面,当视角变得越大的时候,所观察到的图像失真就越大。在实际生活中,一个宽的视角会使得所有的东西看上去都带有一定的弧度,就像鱼眼所看到的效果一样。