1. 程式人生 > >DirectX視口變換矩陣詳解

DirectX視口變換矩陣詳解

視口變換在投影變換之後,視口變換的作用是將投影平面上的點轉換為螢幕上的點,這是一個縮放的過程。

投影變換的作用是將viewing frustum(視景體)中的場景投影到一個平面上,這個平面就是投影平面,在DirectX中,使用近剪裁平面作為投影平面(z=1),關於透視投影的矩陣求解,請參考透視投影詳解



視口變換則是將這個cuboid中的物體變換到視口中,見下圖。


其中cuboid的座標範圍是

而viewport的座標範圍是

注:由上圖知,視口的起點為(X, Y),寬高分別為Width和Height,x軸向右為正,y軸向下為正,y軸的方向與三維座標正好相反。視口是一個2D平面,但是在viewport變換中,Z座標也是跟著變換的,只是在這個圖中沒有體現。

先求變換矩陣的第一列

Cuboid中的左上角點(-1, 1, 0, 1)對映到viewport中的起點(X, Y, MinZ, 1),

Cuboid中的右上角點(1, 1, 0, 1)對映到viewport中的點(X+Width, Y, MinZ, 1),

假設變換矩陣的第一列為[x’, y’, z’, 1]T據矩陣乘法有

[-1, 1, 0, 1]* [x’, y’, z’, 1]T = X

[1, 1, 0, 1]* [x’, y’, z’, 1]T = X+Width

對應的兩個方程為

-1*x’ + 1*y’ + 0*z’ + 1*w’ = X

1*x’ + 1*y’ + 0*z’ + 1*w’ = X+Width

解之得

x’ = Width/2

y’ = 0

z’ = 0

w’ = x + Width/2

再求第二列

列方程(這裡省略了x’,z’,但結果不變,下同)

y’ + 1*w’=Y

-1*y’ + 1*w’=Y+Height

解之得

y’ = -Height/2

w’ = Y + Height/2

最後求第三列

列方程

0*z’ + 1*w’ = MinZ

1*z’ + 1*w’ = MaxZ

解之得

z’ = MaxZ – MinZ

w’ = MinZ

組合以上各列,得到視口變換矩陣