FPS遊戲方框透視基本原理
計算機圖形學基礎
計算機圖形學最基礎的目標就是把建模時構建好的3D物體顯示在2D屏幕上,這就涉及到物體在不同坐標系中坐標的轉換。(物體/建模坐標系 ———> 屏幕坐標系)
坐標系
在遊戲中涉及到各種坐標空間和對應的坐標系
遊戲中通過建模完成的3D物體要想在2D屏幕上顯示出來需要進行坐標的轉換。
矩陣變換
物體在一個三維坐標系中要想變換到另一個三維坐標系中需要通過矩陣乘法(與一個特殊的矩陣相乘),得到在另一個三維坐標系中的坐標。三維空間中某點的變換可以表示成點的齊次坐標與四階的三維變換矩陣相乘 。
D3D和OpenGL的矩陣存儲
D3D中會將對應的線代矩陣利用數組按行存儲(行主順),OpenGL中會按列存儲(列主序)。
FPS遊戲逆向思路
我們利用CE附加遊戲後我們可以找到人物在世界坐標中的世界坐標(x1,y1,z1),要想在屏幕上畫出人物邊框就需要將世界坐標轉化為屏幕坐標。
世界坐標 —-> 裁剪坐標
因為世界坐標通過乘觀察矩陣得到觀察坐標,觀察坐標在乘裁剪矩陣得到裁剪坐標。而且觀察矩陣和裁剪矩陣都會進行歸一化,也就是我們可以找到觀察矩陣和裁剪矩陣組成的組合矩陣,而且此4×4的組合矩陣會進行歸一化(第一個元素為(-1,1))。
X = a11*x1 + a12*y1 + a13*z1 + a14
Y = a21*x1 + a22*y1 + a23*z1 + a24
Z = a31*x1 + a32*y1 + a33*z1 + a34
W = a41*x1 + a42*y1 + a43*z1 + a44
//(x, y, z)就是(x1,y1,z1)對應的裁剪坐標
//注意w有可能小於0,如果w小於說明物體不在你的視角範圍中(不需要在屏幕上顯示)。
所以我們需要的就是通過組合矩陣的第一個元素a11為(-1,1)來搜索得到組合矩陣。
裁剪坐標 —-> NDC坐標
NDC坐標就是將裁剪坐標對應的xyz除以w,這就是透視分割算法(降維)。
NDC_X = X / W
NDC_Y = Y / W
NDC坐標 —-> 屏幕坐標
這需要一個視口變換矩陣,視口變換矩陣左乘NDC坐標就會得到對應的屏幕坐標。其中視口變換矩陣中fs和ns一般為0。
最後得到屏幕坐標的X = (Ws / 2 * NDC.x) + (NDC.x + Ws / 2), Y = -(Hs / 2 * NDC.y) + (NDC.y + Hs / 2)。而Ws * Hs為當前屏幕窗口的分辨率,且注意在windows中屏幕坐標系的規則