现代计算机图形学入门-闫令琪,课程笔记。
Lecture 3~4 Transformation 变换
什么是变换?为什么要学习变换?
此外,在数学层面,可以将变换
理解为函数
,不需要关心中间发生了什么,只关心输入和输出的结果,输入向量输出的也是向量。之所以使用不同的术语,是因为变换
这个词更能体现运动
的意思,可以理解为点或向量在坐标系上的运动。🥳
图形学中涉及的变换就是物体的原始坐标转变为屏幕坐标的一系列过程,主要涉及以下几个步骤:
以拍照做类比,更容易理解图形学中经典的 MVP(model、view、projection)。
首先我们要将常见的几种二维变换方式以数学语言的方式表示出来,这其中主要是找到坐标的变化规律。
其实前面讲到的几种变换都属于线性变换,如果在笛卡尔坐标上展示的话就是:直线变换之后还是直线且原点不会变化。线性变化可以很方便的使用矩阵的形式来表示和计算,可以观看 3Blue1Brown 的这个视频 帮助理解。
墙裂推荐看完 3Blue1Brown 关于线性代数的这个 视频合集,肥肠有帮助!🍺
缩放 Scale:坐标 (x, y) 中 x, y 分别缩放 Sx, Sy 倍,以等式的形式表示就是:
以矩阵的形式表示就是:
镜像 Reflection:以 Y 轴为轴做镜像时,x 的坐标就成了负值,以矩阵的形式表示就是:
切变 Shear:y 轴的值不变,x 轴坐标变为 x + a*x
,以矩阵形式表示:
旋转 Rotation:推导过程:先列出公式的大概样子,然后以特殊点的坐标 (0, 1), (1, 0) 去反推公式中的四个未知数 ABCD。
总结:以上几种变换形式都是线性变换,都可以使用矩阵 x 向量
的变换矩阵来描述,不同变换对应的 a,b,c,d 约束不同。
此外还有一种变换——平移,他属于仿射变换。平移变换时图形的原点发生了变化,所以不属于线性变换,不遵循上面公式的规律!
为了让所有的变换形式保持统一的公式样式以便于批量处理,我们需要引入新的工具来解决这个问题,这个工具就是齐次坐标!
齐次坐标就是将一个原本是 n 维的向量用一个 n+1 维向量来表示。
向量和点,在二维坐标系中都可以使用 (X, Y) 的形式来表示,在三维他们分别这样表示 (X, Y, 0),(X, Y, 1)。
此时刚才线性变换的变换矩阵就会变成下图所示,不同变换的 a,b,c,d,e,f 约束不同。
而此时,仿射变换也可以写成一样的变换矩阵:
此时问题解决。刚才不同类型的线性变换转换为 3x3 矩阵之后如下所示:
维基百科的这张图片很好的总结了上面讲到的各种 2D 变换所对应的变换矩阵:
如图,以不在原点的点旋转时,可以先将这个点移动到原点,再去旋转,然后再平移回去。
与 2D 类似,三维空间中的点和向量可以使用四维的矩阵来表示(齐次坐标):
旋转变换需要考虑的多一些,先看绕轴旋转:
任意角度任意方向的旋转可以视为绕轴旋转的组合:
罗德里格斯旋转公式,将任意角度的旋转总结成了一个矩阵表达式:
更复杂的三维旋转需要引入四元数解决,这里没有展开讲。
首先相机需要定义三个属性才能确定拍出来的照片是正确的:
其次,如果相机和物体一起运动的话,拍照的效果是一样的,因为相对静止。
基于以上两点,为了方便计算,我们约定始终将相机放置在坐标的原点,相机指向 -Z 方向,相机上方为 Y 轴方向。
下面解决这样一个问题,从示意图 02 到 示意图 04 如何变换?
具体过程是将 e 点移动到原点,三个轴旋转到 XYZ 轴,可以使用一个变换矩阵 M 来表示。M=RT,其中 R 为三个轴的旋转矩阵,T 为 e 点的平移矩阵,先平移,后旋转。
根据前面所讲的,平移矩阵比较简单:
旋转矩阵:把 etg 旋转到 XYZ 不好计算,但可以求出 XYZ 旋转到 etg 的矩阵,然后将求得的矩阵转置(求逆)即可!
包括透视投影 (Perspective projection) 和正交投影 (Orthographic projection)。
透视投影和正交投影示意图,stackoverflow
正交投影 Orthographic projection
一个简单的理解正交投影的方式:所有物体的Z 值
丢掉就好了,如下图。
但实际计算时,这种方式其实并不容易,使用更多的以下这个方法:
首先,为了投影后的物体坐标可以更方便的投影到屏幕的二维坐标上,我们会定义一个标准视体 (canonical view volume / canonical cube),它的边长为 2,中心点在坐标系的原点,这个立方体内的所有点都符合 (x, y, z) ∈ [−1, 1]3
。
如何投影到屏幕的二维坐标上下一章讲。
当物体做正交投影时,并不一定就在标准视体中,此时我们会再定义一个立方体,一个刚刚好框住物体的立方体,就叫它正交视体 (orthographic view volume)。然后使用 [l, r] × [b, t] × [f, n]
来描述正交视体的顶点坐标。
此时,我们只需将正交视体的中心平移至原点,然后各边缩放至与标准视体一致,即可实现正交投影。
矩阵表示:
透视投影 Perspective projection
透视投影就不能使用正交视体了,我们会定义一个框住物体的椎体,叫做视锥 (frustum)。视锥有两个面,远平面和近平面。
透视投影的过程可以理解为,远平面以及视锥内物体上的坐标点,缩放为与近平面一般大小(Z 值不需变化),然后进行正交投影。
如何定义一个视锥?
先说明几个概念:
有了以上几个概念,就可以计算出 l, r, b, t 四个变量(推导要用)。
用矩阵表示:
正交投影变换矩阵 (ortho) 上面已经有了,那如何获得缩放变换的矩阵?我们可以先使用相似三角形原理获得远平面与近平面的对应关系。
此时:X' = nX/Z
, Y' = nY/Z
. 转为齐次坐标后,每一行与 Z
相乘,点的位置不会发生变化,如下所示:
此时可以逆推出缩放变换矩阵的一部分:
第三行在推导之前有两个前提条件:
然而这个推导过程我并没有理解,老师最后只是用了两个特殊的点就推导出了公式中的未知数,这样可以??先不记了,todo 吧😑
Viewport transformation 这一步是在透视投影之后的立方体转换为屏幕坐标点,其实就是光栅化的过程,老师单独开了一课,我们下一章见~
本文作者:青波
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!