Transformation(变换)

变换的数学意义(介绍)

Why Transformation

Q1: 为什么要学习变换呢?

A1: 动画的实现,光栅化图像变换投射进“人眼”。由于计算机最终的变换服务于数学世界,于是同一用矩阵来表示变换,线性代数中学过对应知识。

Q2: 举例有哪些变换?

A2: Scale Matrix,缩放;Reflection Matrix,对称(镜像);

Shear Matrix,切变(有称”错切“,”斜切“);

Rotate Matrix…

旋转矩阵推导

image-20230518004250114

到目前为止的变换,我们都可以对(x,y…)进行线性变换(Liner transformation)得到变换结果(x’,y’)

但是平移变换不行?

试想一下,如果对x平移一个单位,那么变换矩阵

image-20230518005707401

无法用一个矩阵就解决变换,(上面的变换形式引出仿射变换(Affine Transformation)的概念),同时进行线性和平移变换

接下来

Homogeneous coordinates(齐次坐标)

要想用一个矩阵表示所有变换

这里引入了齐次坐标的概念,以二维举例,引入第三维度

设点的第三维度为1,向量为0.

  • 之所以向量为0,是因为向量具有方向不变性,假设进行平移变换,我们希望这个向量前后不变的;但是如果但三维度不是0,那么结果就有可能出现向量方向的变化。
  • 之所以点为1,是因为这样就解决了平移问题,通过增加维度,使得一个矩阵同时表示平移和线性变换。

另外

在齐次坐标系下,不难推导出,点+点等于中点,只需同时除以w=2,使得w回归为1

最后放一张仿射变换的图片和常见变换公式的图片

Composing Transform(变换组合)

  • 我们需要知道,复杂的一连串的变换是可以组合的,因为虽然变换越多,矩阵越多,但是由于都是乘法,根据矩阵结合律可以最终合成一个

  • 平移和旋转具有严格先后顺序,毕竟先加后乘,与先乘后加结果不一样;具体来说是先乘后加,先变换后平移

Decomposing complex transform(解构复杂变换)

由图知,直接从图一到图四其实并不方便。

我们先把物体的旋转中心移平移回原点,然后旋转,最后平移回去。(因为我们只能做原点为旋转中心的旋转,不然就无法用之前的固定结论)。

如果不以原点为旋转中心,以某个轴为旋转中心轴

绕z轴旋转(本来二维的扩展成三维后等价绕z轴旋转)

  • 绕哪个轴,哪个轴的坐标为位置不变

拓展到3d transformation也是一样

ps: 按照直觉可能会觉得绕y轴的旋转矩阵有问题,其实是因为该图表示的是右手坐标系的变换;已知x.crossproduct(z) = -z.crossproduct(x)(右手法则),这里XxZ = -Y,所以需要对α取反。

Rodrigues’s Rotation Formula

描述了绕任意轴旋转任意角度的变换矩阵

下面来推导一下这个公式同时引入四元数的学习

参考:四元数和旋转(Quaternion & rotation) (zhihu.com)

前提:axis n是一个单位向量,并且n过原点(如果不过原点,参考前面的方法先平移回原点)

有关四元数

定义:

MVP Transformation(实际操作)

拍照过程

  1. 摆放好待拍摄的物品,或者人物。(model transformation)
  2. 调整好拍摄(相机)角度。(view transformation)
  3. 调整焦距,拍摄。(projection transformation)

也就是常说的MVP变换

这里Viewing Transformation包括了View Transformation(视图变换)和Projection Transformation(投影变换)

View/Camera Transformation(视图变换)

视图变换就是把相机放好。把相机移回原点,相机的三个向量分别和世界坐标的三个轴对齐。先平移后旋转

  • 平移回原点
  • 旋转对齐轴

平移矩阵很好得到

然后是旋转矩阵

但是要想将相机三向量t,g,x转换到世界坐标轴XYZ(单位向量)上,其实不好算,所以这里反过来算

所以首先明确目标矩阵(1 0 0 0;0 1 0 0; 0 0 1 0; 0 0 0 1),由于反过来算,所以变成了起始矩阵

细节: g to -Z,相机对准Z的负方向,t to Y, gxt to X,x由g、t叉乘得到

R(view)的逆矩阵很好得到,毕竟(0,0,1)旋转到一个位置很好做

至此实现了从世界坐标轴到相机坐标轴的旋转,只要额外再取个逆,就能得到R(view)

Projection Transformation

Orthographic projection

正交投影假设物体和相机无限远,这样物体通过视锥体投影到相机没有近大远小

以下这张图解释了这个过程(先平移后缩放)

注意:这里是右手系,相机往-z方向看,OpenGL就是右手坐标系。

但是unity 和 dx都是左手坐标系

再这样的前提下|f|要比|n|要小

由此得到正交变换的变换矩阵

如何理解r,l,b,n,f,t这些东西,可以理解成物体左右上下前后的“坐标”,

平移矩阵好理解,缩放矩阵本质上是用【2/左右距离】作为缩放倍数,最后结果为2,使得物体缩放到【-1,1】的cube中。

至此正交投影结束

Perspective projection

视锥体原平面投影到近平面就能产生透视效果

这里做透视投影的过程是,先将视锥体squish(挤)成cuboid(长方体)再做正交投影

由远近平面的关系,我们可以根据相似三角形得到比例关系

y' = (n/z)y

首先明确我们的目标是将(x,y,z)变换到(x’,y’,z’)

进而在齐次坐标上是

从透视投影到正交投影的矩阵可以写成

这里我们要具体推导一下第三行的值

本质上就是用远近平面上的点带入,完成二元方程组,进而推导出第三行

最后合成透视矩阵

推导结束

至此,坐标被变换到了Clip Space(裁剪空间),也称作Projection Space(投影空间)

这块空间用于裁剪掉不需要的内容,使用视锥体(view frustum)