1. 程式人生 > >變換矩陣

變換矩陣

1、變換矩陣

變換矩陣可以分解為縮放,旋轉,平移矩陣的乘積:

M = T * R * S - 右手座標系

當均勻縮放時,旋轉和縮放可以交換順序

縮放和平移不可以交換順序

2、子座標系與父座標系

由在父座標系中的座標位置P,和三根軸X,Y,Z可定義一個子標系,按列構成一個變換矩陣[X,Y,Z,P],這個矩陣構成由子標系變換到父座標系的變換矩陣。DX裡面需要轉置一下。即按行構造。

一個例子是檢視矩陣的構建,子空間由視點和三根正交軸定義,檢視矩陣則是由它們構成的列矩陣的仿射求逆-由世界變換到檢視空間。

另一個例子世界變換矩陣,它由新模型座標系的位置和三根軸【定義在世界空間】按列構成。即由模型空間變換到世界空間。初始情況模型空間與世界空間是對齊的。

3、投影矩陣-OpenGL

透視投影矩陣:

可以知道投影變換後的w=-Ze,即在檢視空間的深度

在投影面上的座標Xp, Yp為:Xp=n*Xe/-Ze=Xclip/w*r,Yp=n*Ye/-Ze=Yclip/w*t

投影后Ze從[-n,-f]線性對映到[-n,f],除以w後進一步非線性對映到[-1,1]

透視投影除以w後,視景體的八個角點【檢視空間座標】分別對映到NDC空間中的八個角點,如[r,t,-n,1]對映到[1,1,-1,1],[f*r/n,f*t/n,-f,1]對映到[1,1,1,1]

正交投影矩陣:

變換後w=1,Xe,Ye,Ze被線性對映到-1~1,而透視投影是非線性對映,因而有Z-Fighting問題。

4.應用例子:從深度圖重建位置

延遲渲染,SSR等特效都要求由深度資訊重建位置資訊,如果深度是歸一化過的【0~1非線性】,可以將由紋理座標uv[畫一個全屏Quad],深度z,計算出在NDC中的座標,然後由投影矩陣逆變換,得到檢視空間中的位置,這種情況會有精度損失,因為z是非線性的。解決辦法是直接使用檢視空間的深度,由uv可以得到NDC中的座標[a,b,1,1],逆變換到檢視空間,得到ray=[a',b',f,1],結合深度d,可以計算出座標為d/f*ray。