D3D透视投影矩阵推导
D3D的设备空间为:x ∈[-1, 1] y ∈[-1, 1] z ∈[0, 1],坐标系为左手坐标系,下面推导D3D的投影矩阵:
设:
- 点P在Camera坐标系下坐标为:
,
, ![clip_image006[18]_thumb clip_image006[18]_thumb](https://images.cnblogs.com/cnblogs_com/oncememory/201204/201204161704107400.png)
- 在Camera坐标系下*剪切*面的坐标为:(x’, y’)
- 在设备空间中投影后的坐标为(x, y, z)
- Frustum的*剪切*面在Camera坐标系下的坐标范围为: x ∈[l, r], y ∈[b, t], z ∈[n, f]
1. 先求得Camera坐标系下*剪切*面的坐标:(x’, y’)
利用三角形形似得:
2. 求得(x, y, z)和(x’, y’)之间的关系
这里是利用线性插值,把(x’, y’)从x ∈[l, r], y ∈[b, t] 映射到x ∈[-1, 1] y ∈[-1, 1]之中:
整理得:
将投影z坐标映射到区间[0, 1]需要进行比较复杂的计算。由于点P位于Frustum之内,因此他的z坐标值满足n ≤
≤ f。其中n和f分别是摄像机点到*视截面和远视截面的距离。我们希望找到一个将[n, f]映射到[0, 1]的函数。在扫描光栅化过程中,必须对z坐标进行倒数进行行插值,因此这里需要建立关于
的映射函数,这样就可以对投影深度值进行线性插值,对应的映射函数形式为:
利用待定系数得:
整理得:
所以得:
通过1和2的结论整理关系得:
整理成齐次形式:
4. 得矩阵:
5. 在通常情况下:l = -r, b = -t 带入得
此矩阵和D3DXMatrixPerspectiveLH所得结果一致。
![clip_image002[32]_thumb clip_image002[32]_thumb](https://images.cnblogs.com/cnblogs_com/oncememory/201204/20120416170452744.png)
![clip_image052[10]_thumb clip_image052[10]_thumb](https://images.cnblogs.com/cnblogs_com/oncememory/201204/201204161704589387.png)
浙公网安备 33010602011771号