计算机图形学基础
计算机图形学最基础的目标就是把建模时构建好的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中屏幕坐标系的规则