D3D透视投影矩阵推导

D3D的设备空间为:x ∈[-1, 1] y ∈[-1, 1] z ∈[0, 1],坐标系为左手坐标系,下面推导D3D的投影矩阵:

设:

  • 点P在Camera坐标系下坐标为:clip_image002[20]_thumb, clip_image004[28]_thumb, clip_image006[18]_thumb
  • 在Camera坐标系下*剪切*面的坐标为:(x’, y’)
  • 在设备空间中投影后的坐标为(x, y, z)
  • Frustum的*剪切*面在Camera坐标系下的坐标范围为: x ∈[l, r], y ∈[b, t], z ∈[n, f]

1. 先求得Camera坐标系下*剪切*面的坐标:(x’, y’)

利用三角形形似得:

     clip_image008[10]_thumb

     clip_image010[10]_thumb

2. 求得(x, y, z)和(x’, y’)之间的关系

这里是利用线性插值,把(x’, y’)从x ∈[l, r], y ∈[b, t] 映射到x ∈[-1, 1] y ∈[-1, 1]之中:

     clip_image012[10]_thumb

     clip_image014[10]_thumb

整理得:

     clip_image016[10]_thumb

     clip_image018[10]_thumb

将投影z坐标映射到区间[0, 1]需要进行比较复杂的计算。由于点P位于Frustum之内,因此他的z坐标值满足n ≤ clip_image020[10]_thumb ≤ f。其中n和f分别是摄像机点到*视截面和远视截面的距离。我们希望找到一个将[n, f]映射到[0, 1]的函数。在扫描光栅化过程中,必须对z坐标进行倒数进行行插值,因此这里需要建立关于clip_image022[10]_thumb的映射函数,这样就可以对投影深度值进行线性插值,对应的映射函数形式为:

     clip_image024[66]_thumb

利用待定系数得:

     clip_image026[10]_thumb

     clip_image028[10]_thumb

整理得:

     clip_image030[10]_thumb

     clip_image032[10]_thumb

所以得:

     clip_image002[34]_thumb

3. 求得(x, y, z)和clip_image002[21]_thumb, clip_image004[29]_thumb, clip_image006[19]_thumb之间的关系:

通过1和2的结论整理关系得:

     clip_image036[10]_thumb

     clip_image038[10]_thumb

     clip_image040[10]_thumb

整理成齐次形式:

     clip_image042[10]_thumb

     clip_image044[10]_thumb

     clip_image046[10]_thumb

4. 得矩阵:

    clip_image002[32]_thumb

5. 在通常情况下:l = -r, b = -t 带入得

     clip_image052[10]_thumb

此矩阵和D3DXMatrixPerspectiveLH所得结果一致。

posted on 2012-04-16 17:11  Once  阅读(951)  评论(0)    收藏  举报