图形学入门1

文章资源及内容来自 闫令琪博士的GAMES101课程

什么是变换?

这里的变换分成两种类型的变换
-Modeling:模型变换
-Viewing:视角变换(3D to 2D)

2D变换

2D变换顾名思义就是在二维空间中的变换,包括缩放,旋转,切变等等
二维的变换最主要的是要把矩阵,和变换联系起来

Scale

首先,我们认识一下缩放变换
缩放矩阵1
我们看到两张图,它的左下角在世界的原点(0,0),接下来我们要做一个缩放,把它变小
对于这个例子来说,横轴和纵轴都缩放了0.5,都变为原来的二分之一,那么它写成数学形式就是
缩放式子 1
我们之前学过线性代数,对于这两个式子,我们可以写成矩阵形式如下
缩放矩阵这就是缩放矩阵。
如果说,我们的缩放不是均匀的,假如说X和Y缩放的各不相同,比如下图
在这里插入图片描述
X的缩放是按照0.5的比例来缩放,Y的不变
也就是X和Y是不均匀的缩放,我们来看一下它的矩阵
变换矩阵2
X和Y虽然是不均匀的缩放,但是我们仍然可以写成这种对角矩阵的形式
只要Sx和Sy不相同就可以了。这里的Sx对应的就是0.5,Sy对应的就是1。
这就是对于一个非均匀的缩放的表示

Reflection Matrix

我们这里说一下反射操作,也就是对称操作
我们看到左边这张图,相对于Y轴会经过一个反转,就会得到右边的图
反转

相对于Y轴,做一个反转,表示成数学形式是什么呢?

反射

也就是说,原本给了一个X,然后反映在新的图上会变成-X
也就是说新的坐标X’=-x,然后Y坐标不变
我们可以试着写出它的矩阵形式,如下
在这里插入图片描述
我们把它写成矩阵,到后面会很方便

Shear Matrix

我们这里提到一个相对于困难的变换——切边(shear)
Shear

我们把左图,拽着上面的边,向右拉,然后我们发现这张图被拉的变歪了,就会形成右边这样一个结果
这个结果我们仍然可以通过分析,得到它的矩阵
我们观察这个图,可以发现

1.竖直方向来看,对于任何一个点来说,它的纵坐标并没有发生变换
所以,有一个式子已经可以写出来了,Y’=Y,因为Y方向根本没有任何操作

2,水平方向来看,如果Y=0,水平方向并没有发生任何变化
我们可以看到,最底下的便,也就是Y=0时,在X轴上,并没有任何的变化,也就是说,任何一个点,只要它在最底下的边,它的水平方向的移动,都是0

3.水平方向来看,如果Y=1,水平方向移动 a
我们可以看到,原本的左上角的点,水平方向从0变成了a,原本的右上角的点,水平方向假如说是1,变成了1+a。
也就是说,最上面的边上任何一个点水平方向都移动了a个单位

我们可以看一下中间的点,假如Y=0.5时,那么水平方向的移动是2/a
也就是说,水平方向到底移动了多少呢?应该移动了a乘以Y个位置
如果写成矩阵,得到
在这里插入图片描述
也就是说,任何一个水平方向的移动,都是a乘以Y
这样的话就等于是X’=X+aY,Y‘=Y,写成矩阵形式如上

我们可以从上面得到一个规律,我们要想写出一个变换,就要找出对应,找出变换之前的X,Y与变换之后的X’,Y’这两者之间的一一对应关系,找到这样的关系,自然就能写出这个变换了

Rotation

这里我们说一个更复杂的变换,也是非常常见的变换——旋转
这里我们说的旋转,说的是在二维平面内的旋转
我们规定两个事情

1.任何时候我们说旋转,不说别的信息,我们就默认认为是围绕原点(0,0)进行的旋转

2.如果不规定旋转方向,我们默认是逆时针方向

如图

在这里插入图片描述

旋转也是一种变换,那么旋转的 公式应该怎样去写出来呢?
我们可以看下面的例子
在这里插入图片描述
在这里插入图片描述

这就是我们看到的旋转矩阵的结果了。
那么旋转矩阵我们是如何得到的呢?这里我们做一个简单的推导

在这里插入图片描述我们上面说,最重要的是要找到两个点的一一对应关系,(X,Y)是怎样变成(X’,Y’)的
那么我们如何得到这矩阵的四个数呢?
首先,图形上任意的点都符合旋转公式
那么。既然任意一点都符合旋转公式,我们可以对一些特殊的点来求他们的关系
这里,特殊的点指(1,0)红色标注
在这里插入图片描述
这个点旋转之后会转到右图的位置上,并且我们知道旋转的角度是θ角度,
而且旋转了,肯定不会改变它的边长,我们知道上图正方形的边长是1,那么旋转之后的边长也是1
三角函数告诉我们,我们知道斜边是1,并且有一个锐角是θ,那么我们就知道另外的两边是什么。
一个是cosθ,一个是sinθ,这样一来我们就知道了原本的(1,0)被旋转成了(cosθ,sinθ).
我们假设矩阵的四个数为A,B,C,D,然后我们有下面的式子
在这里插入图片描述
然后我们发现A=cosθ,C=sinθ,也就是说我们用了一个特殊的点(1,0),然后用了一个三角函数,我们就可以得到A和C是多少
同样道理,我们只需要考虑另外一个特殊的点,就可以得出B和D的值

Linear Transforms = Matrices

我们由以上可以得到一些共同的点
上面几个运算,都可以写成下面的形式

在这里插入图片描述
也就是x’是a与b的线性组合,y’是c和d的线性组合,
写成矩阵形式如下
在这里插入图片描述
如果我们可以写成上面的形式,就是矩阵乘以输入的坐标,可以得到输出的坐标那我们就管这种变换叫做线性变换

齐次坐标

为什么 要提到齐次坐标呢?
因为有一种变换比较特殊——平移变换

Translation

我们看下图
在这里插入图片描述
我们看到左边的图经过了一个平移得到了右面的图
X方向移动了tx,Y方向移动了ty
看上去很简单,我们可以写出它的关系式
在这里插入图片描述
写出来之后,我们发现,这个式子虽然很简单,但是存在一个问题
我们发现这个式子不能写成向上面一样的矩阵形式
我们只能把它写成以下形式
在这里插入图片描述
我们为什么要加上一个tx,ty呢?
我们可以看到前面的矩阵与x,y相乘都会得到一个线性的结果
而平移的结果则是,X加上一个常数,Y加上一个常数,也就是说这个矩阵并不能表示这样一种操作,所以只能在后面加上一个tx和ty
如果这个变换只有平移的话,那么abcd的矩阵就是个单位矩阵,也就是a、b、c、d分别对应1、0、0、1
也就是说,通过这种形式,才可以表示一个平移的操作
这样很麻烦,而且平移操作并不属于线性变换。所以平移虽然简单,但是却是一个特殊的情况

但是,我们不希望平移成为 一个特殊的情况
那么有没有办法把所有的变换放在一起表示呢?
我们试图去找到一个统一的方法去表示各种变换——引入齐次坐标

Homogeneous Coordinates

我们在二维空间中,在原本的维度上再增加一个维度
在这里插入图片描述

为什么要把点和向量区别对待呢?

向量表示一个方向性,向量具有平移不变性,无论向量怎样平移,还表示原来的向量。
为了使经过矩阵运算后不变,而点的表示,假如(x,y,w)在齐次坐标中实际上是(x/w,y/w,1)(w≠0,若w=0则表示向量)
那么我们就有了,若点+点,则表示两个点的中点(w=1+1)

我们发现当把(x,y)变成(x,y,1)的时候有了一个非常好的性质,如下所示

在这里插入图片描述

我们发现左边的矩阵乘以(x,y,1)后会变右边的矩阵,我们发现这正是我们要的平移的变换
也就是说我们通过引入齐次坐标,增加一个数的方式,把平移变换也写成这样一个矩阵乘以向量的形式
其它的线性变换也可以写成这样的形式

Affine map = linear map + translation

我们把线性变换和平移变换一起,叫做仿射变换
在这里插入图片描述
而所有的仿射变换,都可以写成下面的矩阵的齐次坐标形式
在这里插入图片描述
我们可以看到在齐次坐标中,我们只需要用一个矩阵乘以一个向量,就能得到一个新的向量
这样的话,我们就用一个矩阵,统一了所有操作
如果我们用齐次坐标去表示仿射变化,它的最后一行,永远都是0、0、1,它的平移永远是写在最后一列的前两个数上,左边还有一个2x2的abcd表示线性变换

我们可以用齐次坐标来表示一下常见的几种变换
Scale
在这里插入图片描述
Rotation
在这里插入图片描述
Translation
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/liuSiJia1998/article/details/107948627