OpenGL 平面陰影投射矩陣的推導

OpenGL SuperBible 這本書介紹了一種陰影的實現方法, 將模型視圖矩陣壓平, 全部被繪製的物體都將位於這個平面的二維世界中. 不過這本書沒有介紹該平面陰影投射矩陣是如何推導的.
假設平面方程 Ax + By + Cz + D = 0 已知, 光的方向L(Lx, Ly, Lz, 0)已知. 則模型視圖空間的點 P(Px, Py, Pz, 1), 沿着光的方向投射到平面上的點爲 S(Sx, Sy, Sz, 1). 其中咱們設置向量 N(A, B, C, D). 如今咱們須要求的是矩陣M, 使得 MP = S. 即 M左乘點P獲得點S.
因爲點S是P沿着光的方向L到達的, 因此可假設 S = P + kL. (k >= 0)
由於點S是平面上的一點, 因此 A*Sx + B*Sy + C*Sz + D = 0. 即 S*N = 0. 因爲 S = P + kL, 因此 (P + kL) * N = 0, 推導可得出 k = -(P*N)/L*N
即 K = -(A*Px + B*Py + C*Pz + D)/(A*Lx + B*Ly + C*Lz), 代入 S = P + kL
Sx = Px + k*Lx = Px - (A*Px + B*Py + C*Pz + D)*lX/(A*Lx + B*Ly + C*Lz)
= [Px*(B*Ly + C*Lz) - Py*(B*Lx) - Px*(C*Lx) - 1*D*Lx]/(A*Lx + B*Ly + C*Lz)
= P*((B*Ly + C*Lz), -B*Lx, -C*Lx, -D*Lx)/(A*Lx + B*Ly + C*Lz)
同理
Sy = P*(-A*Ly, (A*Lx + C*Lz), -C*Ly, -D*Ly)/(A*Lx + B*Ly + C*Lz)
Sz = P*(-A*Lz, -B*Lz, (A*LX + B*Ly), -D*Lx)/(A*Lx + B*Ly + C*Lz)
Sw = P*(0, 0, 0, (A*Lx + B*Ly + C*Lz))/(A*Lx + B*Ly + C*Lz)
因此可獲得矩陣M table

       
B*Ly + C*Lz -B*Lx -C*Lx -D*Lx
-A*Ly A*Lx + C*Lz -C*Ly -D*Ly
-A*Lz -B*Lz A*LX + B*Ly -D*Lx
0 0 0 A*Lx + B*Ly + C*Lz
相關文章
相關標籤/搜索