这部分主要介绍三维空间中的物体变换(旋转、平移、缩放)、mvp变换等内容及其推导过程。
🌐关于三维渲染中涉及的几个空间
- **模型空间/局部空间 :**模型本地化空间,一般以模型中心为原点
- 世界空间 world space:模拟世界中的空间,在世界空间中为对象定位及定朝向的矩阵称为
模型矩阵
。 - **相机空间 camera space/view space:**就像我们通过人眼观察世界,世界空间中的对象被转换为相机空间。
- **投影空间 projection space/clip space:**通过正交投影或透视投影,将相机空间中的对象转换为投影空间。
- **归一化设备空间 NDC Normalized Device Coordinates space:**为了便于属性插值、裁剪计算,将投影空间中的对象转化为[-1,1]的一个立方体。在一些旧版本的DirectX中,NDC的z坐标的范围是[0,1],而在OpenGL和新版本的DirectX中,z坐标的范围通常是[-1, 1]。
- **屏幕空间 screen space:**三维物体最终要显示到我们的屏幕上,其中每个坐标都对应屏幕上的一个像素位置。
相机空间与投影空间不同,相机空间可以理解为将世界空间进行镜面反射。
🔁变换矩阵MVP
三维变换矩阵包括:
- 模型矩阵
model
- 视图矩阵
view
- 投影矩阵
projection
包括透视投影、正交投影
Model transformation
INFO
模型空间~世界空间,
通过平移、旋转、缩放等矩阵变化,将模型从模型局部空间转换到世界空间。
View transformation
世界空间~观察空间
当我们将相机与物体保持同步的移动时,他们是相对静止的。 这也意味着,对于我们想要获取的一副画面,我们既可以移动相机(view transform),也可以移动物体(Model transform)。所以为了便于计算,我们通常的做法是将相机固定到原点,通过移动物体,来保持相机和物体的相对位置,从而实现相机移动的效果。
projection transform
观察空间~裁剪空间。
包括透视投影和正交投影。 透视投影更符合人眼的特征,看物体会有近大远小的特点。
正交投影
正交投影可以直接把Z轴扔掉。
可以这样来理解正交投影:
- 把相机放在原点,看向-z方向,up向Y方向;
- 扔掉Z坐标;(都挤到一个小平面上)
- 转换并且缩放结果矩形到[-1,1]2的一个矩形上(正则、规范视图体)。(这样做也是因为约定俗称的做法,方便后边计算)
这个正则、规范立方体也称为
canonical view volume
(CVV),引入CVV为了对视椎体裁剪空间的标准化,降低裁剪复杂度。 详细内容可以看这篇文章https://zhuanlan.zhihu.com/p/376150105
正式一点的做法是把正交视图体(orthographic view volume
)变换为规范视图体(canonical view volume
)。做法如下: