DirectX中阴影矩阵的推导过程

来源:互联网 发布:互盾数据恢复软件破解 编辑:程序博客网 时间:2024/05/19 20:42

DirectX龙书中给出了点光源和平行光源的投影矩阵,也就是从某个光源上的物体------>光源与平面的交点的变换矩阵。

书上给出了从物体上的点P投影到平面上的点S的变换公式以及变换矩阵,

但是没有给出这个矩阵的推导过程,并且说明了可以在网上找到这个过程,

出于好奇心和试试看的想法,本人就试着推导了一下这个公式(以平行光源为例)。

先说明一下平行光源:1.书中的平行光的图片


2.书中关于s的推导的过程

     平行光的方向为L

      经过点p的平行光L投影到n*p + d = 0 平面的点s上

     设t为一个实数,光线r= p + tL   //此处p为物体上的点p,平面公式上的点p在这里对应着点s,tL就是有长度的光线

     所以点s为平面与光线r的交点,将r带入平面公式,得到n*(p+tL) + d = 0   <==>  t = (-d - np ) / (-nL)

     所以s= p+ ((-d-np) / (-nL)  )* L

疑惑之处:我一开始在学习中,有一点疑惑是,光线公式为:r = p + tL  而最后计算点s时的公式同样也是 s = p + tL, 这是为什么呢?

我们知道,向量是有长度有方向的量,在空间中,两个点p1,p2,p2-p1是一个向量,将这个向量规范为·单位向量,可以用来表示方向,

同理,光源的方向L也是这样表示的,为了表示光线,我们用这个单位向量L乘上一个数t,在加上p,用来表示光线与平面的交点,并且,

在空间中,向量和点的表示方法是一样一样的,所以向量r与s的计算公式是相同的。


3.好了,解释了半天我开始没弄懂得问题,现在正式开始推导公式

废话不多说,先上图,书中给出的先决条件:

先设p点的坐标(x,y,z,0)   //为了对应4D向量,把坐标设为4维的,并置最后一维为0

根据先前推导的公式s= p+ ((-d-np) / (-nL)  )* L 将 n=(nx,ny,nz,d),L= (Lx,Ly,Lz,Lw),nL = k 带入

抵消负号,n 向量与p相乘得到一个数值 nx*x+ny*y+nz*z,再讲结果与L向量相乘得到一个向量(nx*Lx*x +ny*Lx*y+nz*Lx*y,.....,......) //只举例x位置的结果

==>  s 的 x列的值 = x + (-d-(nx*x+ny*y+nz*z))*Lx / -k = ( k*x + nx*Lx*x +ny*Lx*y+nz*Lx*y+d*Lx) / k

根据矩阵乘法的规则,变换矩阵S的第一列 的第一行 为nx*Lx+k   第二行 ny*Lx  第三行 nz*Lx 第四行 dLx    //矩阵同时乘以k ,结果不变

剩下几列规则一样  可得出整个变换矩阵

 

0 0
原创粉丝点击