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

    
B*Ly + C*Lz-B*Lx-C*Lx-D*Lx
-A*LyA*Lx + C*Lz-C*Ly-D*Ly
-A*Lz-B*LzA*LX + B*Ly-D*Lx
000A*Lx + B*Ly + C*Lz

转载于:https://my.oschina.net/lyr/blog/82294

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值