“学吧,学无止境! ”
最近想整理一下之前关于计算机图形学相关的基础知识,因此开了这篇博客,顺便对本人起到一个提醒作用,博客中提到的知识,大部分可以从GAMES相关课程中找到,感兴趣的可以再自己去论坛找相关课程看看。
1、矢量变换以及相关运算
计算机图形学中,最基础的知识就是矢量变换相关的运算,所谓变换最关键的,就要要找出向量在变换前和变换后的转换关系,在此之前,已经默认各位掌握了线性代数中与矩阵相关的基础知识。
线性变换:缩放、翻转、斜切、旋转
-
缩放变换:属于比较常见的一种变换情况,其例子和变换矩阵如下:
-
翻转变换:以Y轴翻转为例,若绕Y轴进行翻转,可以看到x坐标都变成了-x,y值没有变,所以可以写出如下变换矩阵:
以此,也可以推导出以X轴翻转的变换矩阵。
-
斜切变换:对于斜切变换,若我们在沿着X轴方向进行斜切,会发现Y坐标没有改变,最后得到以下情况:
以此类推,对于沿Y轴方向的斜切,只需要把变换矩阵中的a和0调换即可。
-
旋转变换:一般旋转矩阵中,我们默认以坐标原点作为旋转点,旋转方向为逆时针。
至此,我们可以发现线性变换的形式基本上是,[目标坐标] = [矩阵] * [当前坐标]的形式。
非线性变换:位移
-
位移变换:在实际应用中,位移操作是非常常见的。
由此我们可以看到,在位移变换中,我们没有办法将其再写做[目标坐标] = [矩阵] * [当前坐标]的形式,可以理解为位移变换是线性变换和位移向量共同作用的结果。因此为了统一这些变换形式,引入了齐次坐标。
齐次坐标
齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为p’ =M*p的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。因此在以上案例中,我们把一个低维问题放到高维中去解决,可以得到如下结果:
于是我们得到了统一后的矩阵变换形式:
以及在2D下的齐次变换矩阵:
另外,在多种变换同时存在时,由于矩阵乘法不满足交换律,所以变换次序是非常重要的。例如旋转矩阵始终是以原点为轴心,先平移后旋转会出现不合理的位移,所以矩阵一定是先旋转,后平移。
尽管矩阵相乘不满足交换律,但是,多矩阵相乘可以添加在左侧,如下
因此,多种矩阵变换结合可以变成一个复杂的矩阵:
综上所述,我们推论出——当物体绕一个特定的点旋转时,我们可以先将物体平移到原点,再旋转,最后再平移回去:
同时,我们也可以根据2D下的结论,类比推出3D下的变换。