透视投影是用中心投影法将形体投射到投影面上,从而获得的一种较为接近视觉效果的单面投影图。它具有消失感、距离感、相同大小的形体呈现出有规律的变化等一系列的透视特性,能逼真地反映形体的空间形象。
透视投影符合人们心理习惯,即离视点近的物体大,离视点远的物体小,远到极点即为消失,成为灭点。它的视景体类似于一个顶部和底部都被切除掉的棱椎,也就是棱台。这个投影通常用于动画、视觉仿真以及其它许多具有真实性反映的方面。
透视投影的过程,如图,通过将左图变换为右图,再通过正交投影投射到摄像机上去。
已知条件:
n n n 表示距离摄像机最近的一个平面的距离
f f f 表示距离摄像机最远的一个平面的距离
摄像机的位置在原点,且朝向为 − z -z −z 方向,因此该物体中 z z z 轴上的定义域为 [ f , n ] [f, n] [f,n]
该物体中某个点的位置,用齐次坐标表示为:
( x y z 1 ) \begin{pmatrix} x\\ y\\ z\\ 1 \end{pmatrix} ⎝ ⎛xyz1⎠ ⎞
由上图可得:
y ′ = n z y , x ′ = n z x y' = \frac{n}{z}y, x' = \frac{n}{z}x y′=zny,x′=znx
这里 z z z 轴上的点还无法确定,只是知道在近平面上的点都不会发生变换,远平面上的点 z z z 轴不变
因此可以先提取一部分变换矩阵:
( n 0 0 0 0 n 0 0 0 0 ? ? 0 0 1 0 ) ( x y z 1 ) = ( x ′ y ′ ? 1 ) = ( n x n y ? z ) ⇒ ( n x z n y z ? 1 ) \begin{pmatrix} n & 0 & 0 &0 \\ 0 & n & 0 &0 \\ 0 & 0 & ? & ? \\ 0 & 0 & 1 &0 \end{pmatrix} \begin{pmatrix} x\\ y\\ z\\ 1 \end{pmatrix}= \begin{pmatrix} x'\\ y'\\ ?\\ 1 \end{pmatrix}= \begin{pmatrix} nx\\ ny\\ ?\\ z \end{pmatrix}\Rightarrow \begin{pmatrix} \frac{nx}{z}\\ \frac{ny}{z}\\ ?\\ 1 \end{pmatrix} ⎝ ⎛n0000n0000?100?0⎠ ⎞⎝ ⎛xyz1⎠ ⎞=⎝ ⎛x′y′?1⎠ ⎞=⎝ ⎛nxny?z⎠ ⎞⇒⎝ ⎛znxzny?1⎠ ⎞
现在根据特殊值来解这个矩阵,根据在近平面和远平面的条件我们可以得到关于 ? ? ? 那一行的方程组:
s e t : ( n 0 0 0 0 n 0 0 0 0 A B 0 0 1 0 ) set: \begin{pmatrix} n & 0 & 0 &0 \\ 0 & n & 0 &0 \\ 0 & 0 & A &B \\ 0 & 0 & 1 &0 \end{pmatrix} set:⎝ ⎛n0000n0000A100B0⎠ ⎞
近平面: z = n z=n z=n
( n 0 0 0 0 n 0 0 0 0 A B 0 0 1 0 ) ( x y n 1 ) = ( n x n y ? = n 2 n ) ⇒ ( n x n = x n y n = y n 2 n = n n n = 1 ) \begin{pmatrix} n & 0 & 0 &0 \\ 0 & n & 0 &0 \\ 0 & 0 & A & B \\ 0 & 0 & 1 &0 \end{pmatrix} \begin{pmatrix} x\\ y\\ n\\ 1 \end{pmatrix}= \begin{pmatrix} nx\\ ny\\ ?=n^2\\ n \end{pmatrix}\Rightarrow \begin{pmatrix} \frac{nx}{n} = x\\ \frac{ny}{n} = y\\ \frac{n^2}{n} = n\\ \frac{n}{n} = 1 \end{pmatrix} ⎝ ⎛n0000n0000A100B0⎠ ⎞⎝ ⎛xyn1⎠ ⎞=⎝ ⎛nxny?=n2n⎠ ⎞⇒⎝ ⎛nnx=xnny=ynn2=nnn=1⎠ ⎞
A n + B = n 2 An+B=n^2 An+B=n2
远平面: z = f z=f z=f
( n 0 0 0 0 n 0 0 0 0 A B 0 0 1 0 ) ( x y f 1 ) = ( f x f y ? = f 2 f ) ⇒ ( f x f = x f y f = y f 2 f = n f f = 1 ) \begin{pmatrix} n & 0 & 0 &0 \\ 0 & n & 0 &0 \\ 0 & 0 & A & B \\ 0 & 0 & 1 &0 \end{pmatrix} \begin{pmatrix} x\\ y\\ f\\ 1 \end{pmatrix}= \begin{pmatrix} fx\\ fy\\ ?=f^2\\ f \end{pmatrix}\Rightarrow \begin{pmatrix} \frac{fx}{f} = x\\ \frac{fy}{f} = y\\ \frac{f^2}{f} = n\\ \frac{f}{f} = 1 \end{pmatrix} ⎝ ⎛n0000n0000A100B0⎠ ⎞⎝ ⎛xyf1⎠ ⎞=⎝ ⎛fxfy?=f2f⎠ ⎞⇒⎝ ⎛ffx=xffy=yff2=nff=1⎠ ⎞
A f + B = f 2 Af+B=f^2 Af+B=f2
方程组:
{ A n + B = n 2 A f + B = f 2 \begin{cases} An+B =n^2 \\ Af+B =f^2 \end{cases} {An+B=n2Af+B=f2
解得:
{ A = n + f B = − n f \begin{cases} A =n+f \\ B =-nf \end{cases} {A=n+fB=−nf
故现在可得变换矩阵为:
( n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ) \begin{pmatrix} n & 0 & 0 &0 \\ 0 & n & 0 &0 \\ 0 & 0 & n+f &-nf \\ 0 & 0 & 1 &0 \end{pmatrix} ⎝ ⎛n0000n0000n+f100−nf0⎠ ⎞
那么根据games101-闫令琪老师提出的一个思考问题,物体坐标中的 z z z 分量会在这个变换过程中有什么变化?
前面的都是铺垫,后面才是解决这个问题的正文。
首先可以设一个坐标点:
( x y z 1 ) \begin{pmatrix} x\\ y\\ z\\ 1 \end{pmatrix} ⎝ ⎛xyz1⎠ ⎞
将变换矩阵与其相乘得到变换后的坐标:
( n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ) ( x y z 1 ) = ( n x z = x ′ n y z = y ′ ( n + f ) z − n f z = z ′ z z = 1 ) \begin{pmatrix} n & 0 & 0 &0 \\ 0 & n & 0 &0 \\ 0 & 0 & n+f &-nf \\ 0 & 0 & 1 &0 \end{pmatrix} \begin{pmatrix} x\\ y\\ z\\ 1 \end{pmatrix}= \begin{pmatrix} \frac{nx}{z} = x'\\ \frac{ny}{z} = y'\\ \frac{(n+f)z-nf}{z} = z'\\ \frac{z}{z} = 1 \end{pmatrix} ⎝ ⎛n0000n0000n+f100−nf0⎠ ⎞⎝ ⎛xyz1⎠ ⎞=⎝ ⎛znx=x′zny=y′z(n+f)z−nf=z′zz=1⎠ ⎞
此时可以设方程:
f ( z ) = z ′ − z = ( n + f ) − n f z − z , z ∈ [ f , n ] f(z) = z'-z=(n+f)-\frac{nf}{z}-z, z\in[f,n] f(z)=z′−z=(n+f)−znf−z,z∈[f,n]
对其求导:
f ′ ( z ) = n f z 2 − 1 , z ∈ [ f , n ] f'(z) = \frac{nf}{z^2}-1, z\in[f,n] f′(z)=z2nf−1,z∈[f,n]
输入: z = n , z = f z=n ,z=f z=n,z=f
注意,这里需要明确 n < 0 , f < 0 n < 0,f < 0 n<0,f<0,之前确实忽略了这一点,由评论中 little little bin
指出
{ f ′ ( n ) = f n − 1 > 0 f ′ ( f ) = n f − 1 < 0 \begin{cases} f'(n) =\frac{f}{n}-1 > 0 \\ f'(f) =\frac{n}{f}-1 < 0 \end{cases} {f′(n)=nf−1>0f′(f)=fn−1<0
那么可以在坐标轴上表示其关系:
由图可知,在 [ f , n ] [f,n] [f,n]上都有
f ( z ) = z ′ − z < 0 f(z)=z'-z<0 f(z)=z′−z<0
因此物体中的某个位置在变换过程中 z z z 分量会变小,但是从绝对值来说是增大。