入门图形学4——变换1
4.1 变换的定义与作用
4.1.1 什么是变换
- 变换也称仿射变换或仿射映射 ,是利用矩阵在空间中使物体发生运动的操作的总称。
- 包括诸如:平移,旋转,缩放,错切等。
4.1.2 变换的种类与操作
- 变换大致分为模型变换和视图变换,前者是不改变坐标系,变换模型本身,而后者是变换坐标系。这一点孰优孰劣需要具体分析,但绝大多数场景下,我们使用变换坐标系的变换,因为这样可以忽略很多细节,提高性能。
- 而物体变换某个量相当于坐标系变换相反的量,这也不难理解,比如想要某个物体缩放0.5倍,其实就是将坐标系变大2倍,自然原本的物体尺寸就变为了原来的0.5倍:
4.1.2 缩放变换
4.2 二维的变换
4.2.1 二维缩放
- 首先我们来看一个最简单的变化也就是我们前文提到的二维缩放变化,基于之前我所学的矩阵乘法,我们很容易就可以得到以下结果
4.2.1 二维缩放矩阵
- 最后我们可以发现,结果就是 x‘ = Sx * x , y’ = Sy * y
4.2.2 二维反转
4.2.2 二维翻转矩阵
- 如上是一个二维翻转矩阵,我们可以很快判断出,实际上它是将x进行取反操作,y保持不变。
- 那么我们就可以得出来一个结论,谁乘1保持不变,谁就是旋转轴,因此,该矩阵实际上是按y轴进行翻转,那么你能给出一个绕x轴翻转的矩阵吗?相信很简单,只需要调换一下正负号就好了。
4.2.3 二维切变
- 接下来我们看一个稍微复杂一点的变换,二维切变,这种变换方式比上述两种变换方式都要更难理解,但我们同样可以通过分析得出其操作方式。
4.2.3 二维切变
- 观察这个变化,你发现了什么呢?有如下几点:
- 1.首先,这张图片的y坐标并没有任何变化
- 2.这张图片的底部x坐标也没发生变换
- 3.这张图片的顶部x坐标向x正方向移动了a个单位距离
- 因此根据以上这些判断,我们可以得出,实际上x坐标变化了ay个单位,最大时y = 1,因此最大变化a,实际上这是一条斜率为a的斜线。因此我们可以得出以下的矩阵:
4.2.4 二维切变矩阵
4.2.4 二维旋转
- 接下来我们来看一个更困难一点的操作——旋转,这里需要唤醒各位一点关于三角函数的知识,但放心,并不难,只需要细心观察,认真计算即可。
4.2.4 二维旋转
- 我们来一起推导一下这些个值都是如何得到的
4.2.4.1 二维旋转矩阵的推导
- 最后,我们就可以得到我们想要的二维旋转矩阵了,旋转值由我们来定,当然这是一个只限于原点的旋转,后续我们会继续扩充,使其可以绕任意轴向旋转。
4.2.4.2 二维旋转矩阵
4.2.5 线性变换
- 通过观察上述这几个变换,我们可以总结出一下规律
4.2.5 变换规律
- 我们称这种变换方式叫做线性变换。
4.3 平移矩阵与其次坐标
4.3.1 为什么没有平移?
- 细心的同学肯定发现了,我们介绍了这些线性变换之中,竟然没有我们最常用也应该是最基础的变换,那就是平移变换,为什么没有呢?这是因为平移这个操作,很特殊。
4.3.2 特殊的平移变换
4.3.2 二维平移操作
- 同样,我们试着去描述它,我们能否将其写作如上文所述的线性表达形式呢,尝试一下?可能很快就会给出结果了吧,答案是不行,我们只能用额外的矩阵操作表述这个平移变换
4.3.2.1 引入平移变换的二维线性变换矩阵
- 这样虽然表示出来了,但并不美好,它是一个特殊的操作,计算机中我们不喜欢这样的特例,你需要花费更多的时间去记忆这些特例,太麻烦了,那么如何解决呢?数学家们为我们给出了答案那就是——其次坐标!
4.3.3 其次坐标
- 首先再次强调一下为何我们要引入其次坐标:
Translation特殊,无法用线性变换完成,那么就要引入==其次坐标== - 接下来介绍其次坐标,实际上其次坐标就做了一下的操作:
- 通过增加维度来统一,==点增加一个维度为1,向量为0==
- 因为我们要通过原点坐标来描述向量或点在空间中的位置,而这个位置是固定不变的因此我们需要一个==记录坐标信息的额外维度来扩充原有的矩阵==
- 我们来看一下其次坐标的推导过程:
4.3.3 其次坐标矩阵
- 铛铛!一个完美的描述矩阵完成了!它看起来很美好,不是吗?但我们也会发现增加了很多东西,正所谓 NO FREE LUNCH ! 因此我们也需要注意引入其次坐标带来的麻烦。
4.3.4 个人思考
- Q:为什么点是1而向量为0?
- A:首先,这是一个区分向量和点的方式,这是他们不同的原因。向量之所以为0,是因为其有平移不变性,我们不希望对其进行平移操作时破坏这种不变性,因此为0。而点平移是会发生改变的,自然需要一个还原其本身意义的操作也就是将对点的操作×1,来保持这种操作的有效性。
- 同样,我们还可以利用这个特性,实现点与向量运算的性质,如下图,可以发现,实际上引入0,1能恰好使得运算得到的结果保持正确性:
个人思考——为何其次坐标是这样的?
- 而最后一项,点与点的加和,最后得到的其实是它们的中点,因为在二维变换中,实际上我们最后得到的应该是:
个人思考——二维点的表述
- 1+1=2 因此我们需要将这个点转换为一个标准的点,也就是将其额外的维度归为1,所以都除去w,最后发现实际上得到的就是这两个点的中点。
4.3.5 其次矩阵
- 前文我们介绍了其次坐标,接下来我们就可以将矩阵改写为其次坐标的形式,也就是其次矩阵。
4.3.5 其次坐标下的其次矩阵
- 我们可以观察到他们有一些特点,比如最后一行都是001,比如变换都发生在右上角的位置。
4.3.6 逆变换
- 逆矩阵就是逆变换
- 逆变换其实就是乘以一个逆矩阵来取消操作
4.3.6 逆变换
在Processing中实践
我们通过Processing来实践这个变换,为了实现旋转缩放平移的统一,我们引入了其次坐标这个概念。 ^f256dd
- 在以上代码中,我们通过Processing内部封装的translate函数,通过改变变化基准坐标也就是改变坐标系的值,让方块进行运动,但实际上我们并没有改变方块本身的值:
- 如果左乘变换矩阵(算子),那么我们就在改变物体自身的值,而没有改变坐标,而如果我们右乘,就是上图的translate函数所做的,那就是改变坐标(坐标原点)。可在给出的源码中查看动态效果,这个方块在做循环往复的周期平移!
Scale矩阵如下
在Processing中实践
- 在以上代码中,我们通过Processing内置的Scale函数,对图形进行缩放。你可以找到对应的源码来观看实际的缩放动画,它是一组连续缩放的画面。
- Rotation矩阵如下
^165e7f
- 效果图展示:
- 源码展示:
参考资料
- games101图形学入门——闫令琪 https://www.bilibili.com/video/BV1X7411F744
- 游戏开发入门——数学和物理 徐芝琦等著
- Fundamental Of ComputerGraphics(虎书)by Steve Marschner
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Pleasant233!