計算機圖形學基礎
計算機圖形學最基礎的目標就是把建模時構建好的3D物體顯示在2D螢幕上,這就涉及到物體在不同座標系中座標的轉換。(物體/建模座標系 ---------> 螢幕座標系)
座標系
在遊戲中涉及到各種座標空間和對應的座標系
遊戲中通過建模完成的3D物體要想在2D螢幕上顯示出來需要進行座標的轉換。
矩陣變換
物體在一個三維座標系中要想變換到另一個三維座標系中需要通過矩陣乘法(與一個特殊的矩陣相乘),得到在另一個三維座標系中的座標。三維空間中某點的變換可以表示成點的齊次座標與四階的三維變換矩陣相乘 。
D3D和OpenGL的矩陣儲存
D3D中會將對應的線代矩陣利用陣列按行儲存(行主順),OpenGL中會按列儲存(列主序)。
FPS遊戲逆向思路
我們利用CE附加遊戲後我們可以找到人物在世界座標中的世界座標(x1,y1,z1),要想在螢幕上畫出人物邊框就需要將世界座標轉化為螢幕座標。
世界座標 ----> 裁剪座標
因為世界座標通過乘觀察矩陣得到觀察座標,觀察座標在乘裁剪矩陣得到裁剪座標。而且觀察矩陣和裁剪矩陣都會進行歸一化,也就是我們可以找到觀察矩陣和裁剪矩陣組成的組合矩陣,而且此4x4的組合矩陣會進行歸一化(第一個元素為(-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中螢幕座標系的規則