D3DXMatrixShadow 产生一个矩阵,把几何体投影到平面上,神奇的是这个矩阵不论对平行光还是点光,都具有统一的形式(见左边D3DXMatrixShadow的文档链接)。
Introduction to 3D Game Programming with DirectX9.0 模板缓冲区那一章里提示感兴趣的读者参考Chapter 6, “Me and My (Fake) Shadow,” Jim Blinn’s Corner: A Trip Down the Graphics Pipeline。
《计算机图形学与几何造型导论》用很基本的向量和矩阵(线性代数)的知识,分别推导出了平行投影和透视投影各自的变换矩阵。因为后者我很早就读过了,非常熟悉;只把前者简单地看了看,有了一个思路(随着点光源距离平面越来越远,平面上任意两点接收到的光线趋于平行,若点光源位置无穷远,则就是平行光了),把这两个变换矩阵合二为一。
齐次坐标
一维

数轴L上一点的坐标 x = x/1 = kx/k ( k!=0 ) 即数轴上一点的坐标可以写成两个实数 X、k 的比值,记作 (X,k) k!=0,这就是一维空间点的齐次坐标(比例关系X:k)。
(x,1) 与 k!=0 k(x,1)=(kx,k) 都是数轴L上的同一个点,对应着二维空间中的一条过原点、斜率不为零的直线(除去原点)。
(X,k) k!=0 代表数轴L上的点 x=X/k,若X!=0,k->0 x-> infinity,即无穷远。记 (X,0) X!=0 代表无穷远,对应着二维空间中过原点、斜率为零的直线(除去原点)。
而剩下的 (0,0) 对应着 二维空间的 原点。
二维

黄色平面(z=1)上某点A的二维坐标 (x,y) = (x/1, y/1) = (kx/k, ky/k) k!=0,kx=X,ky=Y,写成齐次坐标的形式:(X, Y, k) <--> (X/k, Y/k, 1) = (x,y,1) k!=0,比例关系 (X: Y :k) 。
(x,y,1) 与 (kx,ky,k) k!=0 都表示黄色平面上的同一个点,对应着三维空间中一条过原点、不在xoy平面(灰色)内的直线(除去原点)。
(X, Y, k) k!=0 代表黄色平面上的点(x,y) x=X/k, y=Y/k,k->0, 若X,Y不同时为零,(x,y)= (X,Y)*(1/k) 沿(X,Y)方向趋于无穷远。记 (X,Y,0)代表无穷远,对应着三维空间中过原点、在xoy平面上、方向向量是(X,Y)的直线(除去原点)。
而剩下的 (0,0,0) 对应着 三维空间的 原点。
在黄色平面这个二维世界中,A是一个点光源,它的齐次坐标为 (a,b,w),即二维坐标为 (a/w,b/w) = (a,b)*(1/w),当w->0时,点A不断沿着平行于向量(a,b)的方向(与向量(a,b)的方向相同或相反)向远处移动,最后趋于黄色平面上向量(a,b)方向的直线两端的无穷远。此时A就是一个平行光了,方向是(a,b)。记作(a,b,0)。(a,b,0) 与 (ka,kb,0) k!=0 产生的平行光线是一样的。
这样平行光、点光源就用齐次坐标统一起来了:(a,b,w) w!=0 时,代表(a/w,b/w)位置的点光源;w=0且a、b不同时为零,代表平行于向量(a,b)的平行光。(0,0,0)含义未定义。
无穷远 对应 一组共线的非零向量。
同理可以推广到三维空间、更高维度几何空间点的齐次坐标,运用代数。
投影矩阵
平行投影
投影平面过Q点,法向是N,平行光线的方向向量为u(光线与平面不平行),则投影矩阵
Parallel(Q,N,u) 为(证明见附录),矩阵的值与被变换的点P(x,y,z,1)无关:
$$\begin{bmatrix}
I-\frac{N^\top u}{uN^\top} & 0 \\ \\
\frac{QN^\top}{uN^\top}u & 1 \\
\end{bmatrix}$$
透视投影
投影平面过Q点,法向是N,点光源的位置为u,则投影矩阵 Perspective(Q,N,u) 为(证明见附录),矩阵的值与被变换的点P(x,y,z,1)无关:
$$\begin{bmatrix}
(u-Q)N^\top I-N^\top u & -N^\top \\ \\
QN^\top u & uN^\top \\
\end{bmatrix}$$
齐次形式
(x,y,z,1) Parallel(Q,N,u) = (x',y',z',1)
(x,y,z,1) Parallel(Q,N,u)uN^T = (x',y',z',1) uN^T ~ (x',y',z';1)
$$Parallel(Q,N,u)uN^\top=\begin{bmatrix}uN^\top I-N^\top u & 0 \\ \\QN^\top u & uN^\top \\\end{bmatrix}$$
> Parallel(Q,N,u)uN^T也是平面Q,N和平行光u的平行投影矩阵。
点光源的位置是u,若表示成齐次坐标(S,w),w是任意不为零的常数,则u=S/w,代入Perspective(Q,N,u)得:
$$Perspective(Q,N,S,w)=\begin{bmatrix}
(\frac{1}{w}S-Q)N^\top I-\frac{1}{w}N^\top S & -N^\top \\ \\
\frac{1}{w}QN^\top S & \frac{1}{w}SN^\top \\
\end{bmatrix}\quad w\neq 0$$
(x,y,z,1) Perspective(Q,N,S,w) = (X,Y,Z,k) ~ (X/k,Y/k,Z/k,1)
(x,y,z,1) Perspective(Q,N,S,w) w = (X,Y,Z,k) w ~ (X/k,Y/k,Z/k,1)w!=0
$$Perspective(Q,N,S,w)w=\begin{bmatrix}
(S-wQ)N^\top I-N^\top S & -wN^\top \\ \\
QN^\top S & SN^\top \\
\end{bmatrix}\quad w\neq 0$$
> w!=0,Perspective(Q,N,S,w) w 是平面Q,N和点光源(S,w)的透视投影矩阵。
统一的表示
L=(a,b,c,w)=(S,w), a,b,c,w 不同时为零,定义一个矩阵叫做Projection(L,Q,N) 为:$$\begin{bmatrix}
(S-wQ)N^\top I-N^\top S & -wN^\top \\ \\
QN^\top S & SN^\top \\
\end{bmatrix}$$形式上与Perspective(Q,N,S,w) w完全一样。
w=!0时,L是点光源,其透视投影矩阵是Perspective(Q,N,S,w) w,也就是Projection(L,Q,N)。
现在对于任意的一个给定的S,让w趋向于0,点光源的位置沿着S方向的直线移动;极限情况下 L是一个与S共线的平行光,lim L = lim (S,w) = (S,0);
而w->0极限情况下 lim Projection(L,Q,N)= Parallel(Q,N,S)SN^T,是一个平行投影矩阵。(求极限都是把w=0带入)
所以,Projection(L,Q,N)在w!=0时表示点光源的透视投影矩阵,在w=0时表示平行光的平行投影矩阵。
附录
平行投影
字母既代表 点或(行)向量,也代表它们的坐标,运用向量代数:
$$\begin{array}{ll}
P' = P+ tu \\
(P'-Q)N^\top = 0\end{array}$$
解得 \( t = {{QN^\top-PN^\top} \over {uN^\top}} \),
所以 \( P' = P+ \frac{QN^\top u-PN^\top u}{uN^\top} = P + \frac{QN^\top u}{uN^\top} - \frac{PN^\top u}{uN^\top}
=P (I-\frac{N^\top u}{uN^\top}) + \frac{QN^\top}{uN^\top}u \).
\( v' = P'-Q = P (I-\frac{N^\top u}{uN^\top}) + Q(\frac{N^\top u}{uN^\top}-I) = (P-Q) (I-\frac{N^\top u}{uN^\top})= v (I-\frac{N^\top u}{uN^\top}) \).
\( M=(I-{N^\top u \over uN^\top}),w={QN^\top \over uN^\top} u \)
透视投影
质点几何
①把位置是P,质量是m!=0的点记做(mP,m),叫做质点坐标。已知某点的质点坐标很容易求出它的位置:mP/m=P。
(mP,m)~(P,1),~ 代表等价关系(自反、对称、传递的二元关系),a~b: a b同一位置。
②质点坐标的好处是质心位置的计算:A(mP,m),B(nQ,n),则A、B的质心为(mP+nQ, m+n) ~ ( (mP+nQ)/(m+n), 1)。
E是投影点,P' 位于投影平面上,该平面过点Q,法向是N(单位法向量),假定方向朝右(朝左不影响的)
E到平面的距离=d,P到平面的距离=z,
假设点E的质量=z,点P的质量=d,
则P' 所在的位置恰好是E、P两点的质心(杠杆EP的支点)。
透视投影矩阵
(E,1)~(Ez,z),(P,1)~(Pd,d),
(Ez,z)+(Pd,d) = (Ez+Pd, z+d) ~ (P',1)
其中,\(z=(P-Q)N^\top, \;d=(Q-E)N^\top, \;z+d=(P-E)N^\top \)
所以,\( (Ez+Pd, z+d)=( (P-Q)N^\top E+(Q-E)N^\top P, \; (P-E)N^\top ) \)
\( =( PN^\top E -QN^\top E +(Q-E)N^\top P, \; PN^\top -EN^\top) \)
\( =( P(N^\top E+(Q-E)N^\top I) -QN^\top E, \; PN^\top -EN^\top) \)
假设$$(P,1)\begin{pmatrix}
M & b \\
w & c \\
\end{pmatrix}_{H} =(Ez+Pd, z+d) \sim (P',1) $$
则\( M=N^\top E+(Q-E)N^\top I, \; w=-QN^\top E, \; b= N^\top, c=-EN^\top \)
因为 k (Ez+Pd, z+d)=( k(Ez+Pd), k(z+d) ) ~ (Ez+Pd, z+d) ~ (P',1) k!=0
所以 矩阵H可以 相差非零因子倍,于是法向朝左或朝右没有关系。