http://wenku.baidu.com/link?url=wDkyQR9fDI_tZas1BlMRUnNNoKwiQDygltm2wWxRr_sDwcDB51_QCDfR4Gb5wYrIUZ_tYxpjhZcquYeBgOC2Ce5tH-I6npzKEqtHZ9zFNt7
这几个参量,也可以根据视野(
FOV
–
Field Of View
)参量来求得。下面是两
个平面的视野关系图:
其中,
两个
fov
分别是在
x-z
以及
y-z
平面上的视野。
如果只给了一个视野,
也
可以通过投影平面的宽高比计算出来:
用一个视野算出
w
或者
h
,然后用宽高比算出
h
或者
w
。
(
2
)一般情况的方程
这组方程比较繁琐,但更具一般性(和
OpenGL
一般矩阵的推导一致,这也是
D3DXMatrixPerspectiveOffCenterLH
和
D3DXMatrixPerspectiveOffCenterRH
两
个方法所使用的情况)。我们导出它:
我们继续反推出透视投影矩阵:
其中
最后那个矩阵就是
D3D
的一般透视投影矩阵。
好了,
目前为止,
我们已经导出了
D3D
的两个透视投影矩阵。
下面我把上一篇导
出的
OpenGL
的透视投影矩阵写出来,大家可以拿它和刚刚导出的
D3D
的一般性
透视投影矩阵做一个对比。
如果仔细观察,
可以发现二者在元素的布局上是一个转置的关系,
这个就是由它
们使用的左右手坐标系以及使用的行列矩阵的差异造成的。
而另外在一些元素的
细节上也存在着差异,
这是由于
D3D
的
CVV
的
z
范围不同造成的。
可见在原理相
同的情况下,
细微的环境差异可以造成非常大的变化,
而这就是透视投影矩阵存
在诸多不同版本的原因。一般情况的透视投影矩阵也可以使用视野方式来定义,
方法和特殊情况相同。
M3G
的透视投影矩阵
M3G
是对
OpenGL
进行的一个封装,
它的透视投影变换矩阵被放到了类
Camera
里
面。
因为它封装了
OpenGL
,
因此环境和
OpenGL
相同:
右手坐标系、
列向量乘法、
CVV
范围
[-1
,
1]
。它唯一和
OpenGL
有些差异的地方就在于它只使用投影平面
的中心和
x-y
平面的中心重合
(在
x
和
y
方向上都居中)
的情况
(就是我们上面
D3D
的第一种特殊情况)。我们用
OpenGL
透视投影矩阵最终版本来说明(再次
提醒,如果读者对此感到迷惑,请参考第一篇文章):
上面是
OpenGL
透视投影矩阵的最终版本,也是一般性版本,我们要把它变成特
殊性,版本,非常简单,和上面
D3D
的特殊情况一样,我们从对
x
和
y
进行插值
的那一步来看:
和
D3D
的第一种情况一样,销掉两边的
1/2
,得到:
则我们反推出透视投影矩阵:
最右边那个矩阵就是
M3G
的透视投影矩阵。
仍然可以通过视野参数来设置透视投
影矩阵,这里请读者自行推导,方法与上面
D3D
的完全相同