参考资料:Real-Time Rendering
仿射变换
- 关于仿射变换群,可参见矩阵群
- 上的仿射变换,是仿射变换群中的元素
- 上的仿射变换,也是上保持无穷远超平面的射影变换
- 是3维实射影空间
- 一类是直线与相交,得到中的点。上面的第一类公式即为中的点的仿射变换
- 另一类是直线与平行,得到中的点。由平行性,它也可以视为中的向量,上面的第二类公式即为中的向量的仿射变换
- 进一步,上的射影变换构成射影变换群
- 由从线性方程出发中的Gauss消元法可知,可以由初等变换生成。因此,上的仿射变换可以由平移、初等变换生成,这些初等变换都有几何意义
- 平移(Translation)
- 伸缩(Scaling)
- 切变(Shearing)
- 镜面反射(Mirror Reflection)
- 平移(Translation)
刚体变换
- 关于刚体变换群,可参见矩阵群
- 赋予典范Riemann度量,成为一个Riemann流形
- 一方面,刚体变换群满足
- 另一方面,由Riemann几何的结果可知,可以由其1阶展开确定,
- 一方面,刚体变换群满足
- 中的元素都是绕某条直线的旋转(Rotation),从而上的刚体变换可以由平移、绕某条直线的旋转生成
- 设。那么,
- 同时,在与正交的2维平面上,也是保持定向的等距变换,并且保持原点不变,所以是中的元素。由四元数可知,中的元素是绕原点的旋转,所以是绕直线的旋转
- 设。那么,
- 由数值线性代数中的奇异值分解可知,可以由对角元素为正的对角矩阵、生成。由矩阵群可知,可以由、一个行列式为-1的矩阵生成
- 对角元素为正的对角矩阵 –> 对角元素为正的伸缩
- –> 旋转、镜面反射
- 因此,我们也可以将上面的伸缩更换为对角元素为正的伸缩,将上面的切变更换为旋转。在计算机图形学中,旋转通常用四元数来表示
四元数和旋转
- 关于四元数,可参见四元数
- 四元数的集合可以视为,并且可以分解为实部(基底为1,可以视为)、虚部(基底为、、,可以视为)。只有实部的四元数为实数,只有虚部的四元数为纯虚数
- 设为四元数,。定义
- 模长为1的纯虚数具有良好的性质。设、为模长为1的纯虚数,那么
- 将分解为实部、虚部,
- 由可知,保持不变,从而保持方向的直线不变
- 同时,在与正交的2维平面上,任取一个模长为1的纯虚数。利用,可得,它也是模长为1的纯虚数,并且对应于。由此可知,、、构成右手坐标系,并且。因此,将绕直线旋转
计算机图形学的MVP变换
- 计算机图形学可以将中的模型渲染为中的图像,其原理类似于相机拍摄模型的照片
- 模型(Model)变换是一个仿射变换(模型 –> M –> 世界空间)
- 模型变换可以让我们将模型设置为合适的位置(平移)、合适的大小(伸缩)、合适的角度(旋转)
- 视觉(View)变换是一个仿射变换(世界空间 –> V –> 视觉空间)
- 视觉变换可以让我们获得在相机的位置和角度,人眼所见的原风景
- 设相机的位置(Eye)为,相机对准的方向(Gaze)为,相机朝上的方向(Top)为。首先,我们使用一个平移,将相机的位置变为原点
- 其次,我们使用一个旋转,将变为轴,将变为轴,将变为轴。之所以取轴,是因为在右手坐标系中,如果人眼所见为轴水平向右、轴垂直向上,那么轴的方向是人眼所见的方向
- 投影(Projection)变换是一个射影变换(视觉空间 –> P –> 照片)
- 投影变换可以让我们从3维降低到2维
- 在相机拍摄模型的照片时,人眼所见的原风景并不是整个,而是一个有限的视觉体积(View Volume)。根据透视原理,我们可以取视觉体积为从原点出发的锥体
- 因为我们拍摄的照片通常是矩形的,所以我们让锥体的底面为矩形。因为视觉体积有限,所以我们用一个较远的平面来截断锥体,得到远底面;因为人眼位于原点,所以我们取一个较近的平面作为照片,得到近底面,然后投影到其上
- 设近底面、远底面的坐标分别为。对于近底面、远底面之间的所有模型上的点,我们都使用透视将其投影到近底面上,,。这无法用仿射变换来实现,原因是坐标是变量,故我们使用射影变换
- 因为近的模型会挡住远的模型,所以坐标用于判断模型的远近
- 如果我们让射影变换保持近底面、远底面不变,并且坐标与坐标无关,那么我们可以得到完整的射影变换
- 如果我们让射影变换保持近底面、远底面不变,并且坐标与坐标无关,那么我们可以得到完整的射影变换