Skip to content

这部分主要介绍三维空间中的物体变换(旋转、平移、缩放)、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]。

NDC

  • **屏幕空间 screen space:**三维物体最终要显示到我们的屏幕上,其中每个坐标都对应屏幕上的一个像素位置。

相机空间与投影空间不同,相机空间可以理解为将世界空间进行镜面反射。

🔁变换矩阵MVP

三维变换矩阵包括:

  • 模型矩阵 model
  • 视图矩阵 view
  • 投影矩阵 projection 包括透视投影、正交投影

Model transformation

INFO

模型空间~世界空间,

通过平移、旋转、缩放等矩阵变化,将模型从模型局部空间转换到世界空间。

View transformation

世界空间~观察空间

当我们将相机与物体保持同步的移动时,他们是相对静止的。 这也意味着,对于我们想要获取的一副画面,我们既可以移动相机(view transform),也可以移动物体(Model transform)。所以为了便于计算,我们通常的做法是将相机固定到原点,通过移动物体,来保持相机和物体的相对位置,从而实现相机移动的效果。

projection transform

观察空间~裁剪空间。

包括透视投影和正交投影。 透视投影更符合人眼的特征,看物体会有近大远小的特点。 image.png

正交投影

正交投影可以直接把Z轴扔掉。

可以这样来理解正交投影:

  1. 把相机放在原点,看向-z方向,up向Y方向;
  2. 扔掉Z坐标;(都挤到一个小平面上)
  3. 转换并且缩放结果矩形到[-1,1]2的一个矩形上(正则、规范视图体)。(这样做也是因为约定俗称的做法,方便后边计算)

这个正则、规范立方体也称为canonical view volume(CVV),引入CVV为了对视椎体裁剪空间的标准化,降低裁剪复杂度。 详细内容可以看这篇文章https://zhuanlan.zhihu.com/p/376150105

image.png 正式一点的做法是把正交视图体(orthographic view volume)变换为规范视图体(canonical view volume)。做法如下: image.png

透视投影 TODO