我们前面所学的各种变换的目的,就是要把三维的物体变成一张照片。而给定一个三维场景,如果从不同方向看,看到的画面是不一样的。这跟我们真实生活中用相机拍照是类似的。而用相机拍照通常需要经过这三个步骤:
- 找一个好地方并安排好被拍的人或物(Model transformation)
- 找一个合适的位置和角度摆放好相机(View transformation)
- “茄子”(Projection transformation)
其中摆放相机这个步骤就是我们所说的视图变换(View transformation),这三个步骤对应到图形学中是完全一样的,简称为 MVP 变换。而确定一个相机,需要确定三个变量:
- 位置(Position):用 表示。
- 朝向(Look-at/gaze direction):用 表示方向。
- Y 轴朝向(Up direction):用 表示方向。确定位置和朝向后,可以通过旋转相机控制 Y 轴朝向,同时该轴要跟 Look-at 垂直。
通常我们为了简化计算,会把相机固定在原点 (0, 0, 0) 的位置,同时使 Up-direction 对应 轴,Look-at 朝向 轴负方向(也就是 方向):
如果相机不在原点,那我们需要先把相机转换到原点后才能继续后面的操作。而要使相机转换前后所拍摄到的场景保持不变,根据相对运动,我们需要把整个场景都做相应的转换。相机的转换对应到数学中分为以下几个过程:
- 把代表位置的 平移到原点
- 把朝向 旋转到 方向
- 把代表 Up-direction 的 旋转到 轴
- 而 的方向自然也就对应到 轴
我们记整个场景转换到原点的变换为 ,则有:
注意这里顺序是先执行右边的平移变换 ,再执行旋转变换 。我们很容易得出齐次坐标下平移变换的矩阵:
而旋转矩阵 要做的事情是把 方向旋转到 轴,把 方向旋转到 轴,把 方向旋转到 轴。直接求解 不太好求,但如果把这个过程反过来,那就是把 轴旋转到 方向,把 轴旋转到 方向,把 轴旋转到 方向(这里不理解可以动笔画一画)。这个反过程的旋转矩阵是很好求解的,我们假设 轴上的向量 经过旋转矩阵 的变换后落在 方向上,假设是 ,也就是 。我们很容易得出它们在齐次坐标下的表示:
同样的,我们假设 轴上的向量 经过旋转矩阵 的变换后落在 方向上,假设是 ,也就是 。它们在齐次坐标下的表示是:
最后,我们假设 轴上的向量 经过旋转矩阵 的变换后落在 方向上,假设是 ,也就是 。它们在齐次坐标下的表示是:
因为 要同时满足三个轴上的变换,所以有:
的这个推导包含了我自己的理解,如果后面发现有错误再修正。我们知道 是 的反向(逆向)旋转,而从 2D transformations 中关于旋转那块描述我们知道,旋转矩阵是正交矩阵,因此 。所以求解出:
所以有:
* 未经同意不得转载。