DirectX中陰影矩陣的推導過程

2021-06-28 00:19:52 字數 1485 閱讀 2443

directx龍書中給出了點光源和平行光源的投影矩陣,也就是從某個光源上的物體------>光源與平面的交點的變換矩陣。

書上給出了從物體上的點p投影到平面上的點s的變換公式以及變換矩陣,

但是沒有給出這個矩陣的推導過程,並且說明了可以在網上找到這個過程,

出於好奇心和試試看的想法,本人就試著推導了一下這個公式(以平行光源為例)。

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 ,結果不變

剩下幾列規則一樣  可得出整個變換矩陣

DirectX的常用矩陣函式

矩陣的計算 基本運算 1 相等 a b 如果兩個矩陣維數相同且對應元素也相同 2 矩陣與標量相乘 kd 3 加減法必須維數相同 4 ab ba 單位矩陣 identity matrix 主對角線上的元素為1其餘為0,而且是方陣 乘其它數不變 逆矩陣 inverse matrix 1 只有方陣才可能有...

矩陣 DirectX與OpenGL的不同

矩陣是三維圖形學中不可或缺的部分,幾乎所有和變換相關的操作都涉及矩陣,世界變換,檢視變換,投影變換,視口變換無一不需要矩陣,但是當今的兩大主流圖形庫directx和opengl對矩陣操作卻有著細微的差別,大多數的圖形學書籍都以opengl為基礎進行闡述,遊戲程式設計類的書籍則更多使用directx,...

矩陣 DirectX與OpenGL的不同

矩陣是三維圖形學中不可或缺的部分,幾乎所有和變換相關的操作都涉及矩陣,世界變換,檢視變換,投影變換,視口變換無一不需要矩陣,但是當今的兩大主流圖形庫directx和opengl對矩陣操作卻有著細微的差別,大多數的圖形學書籍都以opengl為基礎進行闡述,遊戲程式設計類的書籍則更多使用directx,...