MVP Matrix
MVP 矩阵即 Model(模型)、View(观察)、Projection(投影)矩阵。
Model
模型矩阵描述的是 3D Point 的仿射变换,包含 Scale(缩放)、Rotate(旋转)、Translate(平移)。
可以按照下面的方式表示:
- 最后进行 Translation 是为了保证前面的操作参考坐标轴不会变化。
- OpenGL 是左乘的,因此编程时计算模型矩阵需要按照 Translate、Rotate、Scale 的顺序进行。
写的具体一点如下: 之所以用 4 × 4 的矩阵来表示,是为了统一用矩阵乘法。如果用 3 × 3 的矩阵,会导致计算 Translate 变化时,只能用 3 × 3 的矩阵矩阵加法来表示。并且这样可以用来区分点(Point)和向量(Vector)。
- 3D Point (w = 1,Translate OK)
- 3D Vector (w = 0,No Translate)
- 3D Point + 3D Point(w = 2,Middle Point)
- 3D Point - 3D Point (w = 0,3D Vector)
- 3D Point + 3D Vector(w = 0,3D Point)
- 3D Vector + 3D Vector(w = 0,3D Vector)
define is the 3D Point 。
这种定义叫做齐次坐标(Homogeneous coordinates)。
View
观察矩阵用于将模型投影到摄像机(Camera)上。
一般而言,定义观察矩阵(或者说摄像机状态)需要下面的一些参数:
- Position:摄像机位置
- Up:摄像机上方
- LookAt:摄像机观察方向
- Right:摄像机右方
为了推导出实际的 View 矩阵(记为 ),假设初始状态如下的 View 矩阵(记为 )的参数如下:
- (原点)
- (正 Y 轴)
- (负 Z 轴)
- (正 Z 轴)
注意,对于观察者而言,我们要感受到物体进行了平移旋转之类的操作,需要对 View 矩阵(摄像机)进行相反的操作。要得到实际 View 矩阵,需要进行逆变换,其操作具体如下:
- Translate
- P:
- Rotate:
- U:
- L:
- R:
对于 Translate,容易得到 对于 Rotate,不方便直接计算,考虑逆向情况:
- R:(X 轴方向)
- U:(Y 轴方向)
- L: (Z 轴方向)
因此有: 注意到旋转矩阵在实际中会使用正交矩阵,即: 因此实际的 View 矩阵为:
Projection
Projection (投影)矩阵一般分为 Orthographic Projection(正视投影)和 Perspective Projection (透视投影)。
Orthographic Projection
之前在 Games101 上看到闫令琪老师的定义感觉很清晰:
Map a cuboid to the canonical cube 。
- 这里的是右手系,所以远平面 f 在前面(比如 OpenGL 中的前面一般认为是负 Z 轴,f < n);
要完成正视投影,只需要两步即可:
- Translate
- Scale
可以很容易得到正视投影矩阵为: Perspective Projection
透视投影可以通过挤压远平面 f 来变成正交投影。
并且有下面的规定:
- 近平面 n 上的点经过挤压后坐标不变。
- 远平面 f 上的中心点挤压后坐标不变。
- 远平面 f 上的点经过挤压后 z 坐标不变(z = f)。
对于某一点 ,经过变换后变为 。
明显有: 类似有: 在齐次坐标中,可以写出下面的式子(3D Point,w = 1): 记矩阵 表示从透视矩阵转为正交矩阵的矩阵: 由于: 即: 同理:
由于任何近平面 n 上的点坐标不变,因此: 即: 由于和 与 无关,因此前两项必为 0: 化简有: 由于任何远平面 f 上的中心点 坐标不变,因此: 即: 化简有: 联立解得: 因此: 最终计算出透视投影矩阵为:
- 本文链接:https://morisa66.github.io/2021/01/14/MVP/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。