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