其实问题就是给定y方向的视域角 α \alpha α,和视域的宽高比 r r r,求投影矩阵。
我们首先假设投影平面距离摄像机的距离为
d
d
d,视域的宽为
w
w
w,高为
h
h
h,近剪裁面距离摄像机的距离为
n
n
n,远剪裁面距离摄像机的距离为
f
f
f,那么首先有:
r
=
w
h
r= \frac{w}{h}
r=hw
t a n α 2 = h d tan\frac{\alpha}{2} = \frac{h}{d} tan2α=dh
假设观察坐标系中的任一点
P
P
P,坐标为
(
x
,
y
,
z
)
(x,y,z)
(x,y,z),通过投影变换到投影平面的坐标为
(
x
′
,
y
′
,
z
′
)
(x',y',z')
(x′,y′,z′),由相似三角形,得到:
x
′
x
=
d
z
\dfrac{x'}{x} = \dfrac{d}{z}
xx′=zd
y ′ y = d z \dfrac{y'}{y} = \dfrac{d}{z} yy′=zd
综合上式,求出
x
′
x'
x′和
y
′
y'
y′:
x
′
=
h
x
t
a
n
α
2
z
x'= \dfrac{h x}{tan\dfrac{\alpha}{2} z}
x′=tan2αzhx
y ′ = h y t a n α 2 z y'= \dfrac{h y}{tan\dfrac{\alpha}{2} z} y′=tan2αzhy
位于视锥体中的
x
′
x'
x′和
y
′
y'
y′满足
−
w
≤
x
′
≤
w
-w \leq x' \leq w
−w≤x′≤w,
−
h
≤
y
′
≤
h
-h \leq y' \leq h
−h≤y′≤h,那么将其归一化有:
x
′
=
x
r
t
a
n
α
2
z
x'= \dfrac{x}{r tan\dfrac{\alpha}{2} z}
x′=rtan2αzx
y ′ = y t a n α 2 z y'= \dfrac{y}{tan\dfrac{\alpha}{2} z} y′=tan2αzy
注意到上述求得的
x
′
x'
x′和
y
′
y'
y′里的分母中均包含
z
z
z,为了用矩阵形式来表达投影变换,必须要借助齐次坐标,有:
[
x
,
y
,
z
,
1
]
⋅
[
1
r
t
a
n
α
2
0
0
0
0
1
t
a
n
α
2
0
0
0
0
A
1
0
0
B
0
]
=
[
x
′
⋅
z
,
y
′
⋅
z
,
A
z
+
B
,
z
]
[x, y, z, 1] \cdot \begin{bmatrix} \dfrac{1}{rtan\dfrac{\alpha}{2}} & 0 & 0 & 0 \\ 0 & \dfrac{1}{tan\dfrac{\alpha}{2}} & 0 & 0 \\ 0 & 0 & A & 1 \\ 0 & 0 & B & 0 \end{bmatrix} = [x'\cdot z, y' \cdot z, Az+B, z]
[x,y,z,1]⋅⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡rtan2α10000tan2α10000AB0010⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤=[x′⋅z,y′⋅z,Az+B,z]
因而可得到 z ′ = A z + B z z'=\dfrac{Az+B}{z} z′=zAz+B。同时,我们希望 z ′ z' z′满足:
- 0 ≤ z ′ ≤ 1 0 \leq z' \leq 1 0≤z′≤1
- 对于原始的 z 1 , z 2 z_1,z_2 z1,z2,如果满足 z 1 < z 2 z_1 < z_2 z1<z2,那么 z 1 ′ < z 2 ′ z'_1 < z'_2 z1′<z2′
因为原始的
z
z
z范围为
n
≤
z
≤
f
n \leq z \leq f
n≤z≤f,所以有:
{
A
n
+
B
n
=
0
A
f
+
B
f
=
1
\begin{cases} \dfrac{An+B}{n} = 0 \\ \dfrac{Af+B}{f} = 1 \end{cases}
⎩⎪⎨⎪⎧nAn+B=0fAf+B=1
解方程组,得到:
{
A
=
f
f
−
n
B
=
n
f
n
−
f
\begin{cases} A = \dfrac{f}{f - n} \\ B = \dfrac{nf}{n - f} \end{cases}
⎩⎪⎨⎪⎧A=f−nfB=n−fnf
综上,得到最终的投影矩阵为
[
1
r
t
a
n
α
2
0
0
0
0
1
t
a
n
α
2
0
0
0
0
f
f
−
n
1
0
0
n
f
n
−
f
0
]
\begin{bmatrix} \dfrac{1}{rtan\dfrac{\alpha}{2}} & 0 & 0 & 0 \\ 0 & \dfrac{1}{tan\dfrac{\alpha}{2}} & 0 & 0 \\ 0 & 0 & \dfrac{f}{f - n} & 1 \\ 0 & 0 & \dfrac{nf}{n - f} & 0 \end{bmatrix}
⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡rtan2α10000tan2α10000f−nfn−fnf0010⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
所以,投影变换后的 z ′ = f f − n + n f ( n − f ) z z' = \dfrac{f}{f - n} + \dfrac{nf}{(n - f)z} z′=f−nf+(n−f)znf。
让我们观察下不同情况下
n
n
n和
f
f
f的取值变换
z
′
z'
z′的函数曲线。
左边的曲线是 ( n = 1 , f = 100 ) (n=1,f=100) (n=1,f=100),右边的曲线是 ( n = 10 , f = 100 ) (n=10,f=100) (n=10,f=100)。不难看出,当 n n n和 f f f的差距越小时,变换后的 z ′ z' z′精度更高。
在进行投影变换之后,透视除法之前,这时候坐标系称作齐次剪裁空间或者投影空间。在透视除法之后,被称作标准设备坐标系。