GAMES101学习之路(一):深入理解MVP变换
为什么要MVP变换?
对于现代计算机gj来说,如何把一个现实空间中的3维物体呈现在2维的屏幕空间中,需要确定的就是,物体“在哪里”,摄像机的“位置和朝向”,摄像机“如何看物体”。由此便引出来了MVP变换。
-
模型变换 ,为了找到物体的位置,我们通过将处在局部坐标系的物体,通过变换位移到全局坐标系下面,从而确定了物体“在哪里”。(例如把一个物体从小房间移动到了标准的大房间里面)
-
视图变换,为了确定摄像机的位置和朝向,我们把摄像机的位置给固定下来,并后续更好的拍照,因此确实了摄像机的“位置和朝向”(例如把拍摄物体的摄像头,位置和拍摄方向给定好,找准一个好的角度)
-
投影变换,为了确定摄像机是如何看物体,我们可以选择正交投影和透视投影,表明了物体在摄像机下是如何被看待的,选择好了摄像机“如何看物体”(例如调整摄像机的”摄影模式“)
而为了标准化的将物体的平移、旋转、缩放表示出来,我们便选用了齐次坐标系下的表达方式来表现(让所有变换可以表示为一个矩阵乘以一个向量的形式),这种表示方式可以解决几何变换中平移异常的问题。
同时,需要注意的是,平面中一个点是二维的存在,而为了区分点和向量之间的区别,我们引入了”第三维度“,点的z值始终为1,向量的z值始终为0。(同理空间中也如此)

齐次坐标系下二维空间中点和向量的表示

缩放、旋转、位移矩阵示例

空间中旋转矩阵的表示
定义
MVP
-
M ——Model 模型变换 将物体由其自己的模型空间,通过平移、旋转、缩放变换,到世界空间下。由局部的坐标系到全局的规范坐标系下
-
V —— View 视图变换 调整整个世界空间,从而让摄像机始终在观察**(0,0,0)原点和-z方向**,有利于简化后续的计算
-
P —— Projection 投影变换 通过正交投影或者透视投影来实现把原本的物体压缩到一个中心在原点,2 * 2 * 2的标准立方体里面(其xyz坐标范围均为[-1, 1])

透视投影vs正交投影
齐次坐标系
通过增加一个额外的维度(w分量),来表示更低维度的空间。这样做的核心目的,是为了用同一种数学运算(矩阵乘法)来统一表示所有的几何变换(特别是平移)。
MVP变换如何工作?
1. 模型变换
通过缩放、旋转、平移三种几何变换,将物体转化到标准化的世界坐标系下。(注意,不同模型的模型变换矩阵实际上是其本身所持有的一种属性,而非由图形渲染管线所定义,即数据驱动的设计思路)
//此处为GAMES101 proj1的模型变换函数参考示例
Eigen::Matrix4f get_model_matrix(float rotation_angle)
{
Eigen::Matrix4f model = Eigen::Matrix4f::Identity();
Eigen::Matrix4f rotate_Maxtrix;
float angle = rotation_angle * MY_PI / 180; //转化为角度
rotate_Maxtrix (0, 0) = R;//将R矩阵嵌入到rotation_maxtrix左上角
return rotation_maxtrix;
}