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,...