Games101-3 变换 Transform

97 阅读3分钟

3D to 2D 投影

下图是一个投影变化实例

image.png

2D 变换

Scale

缩放可以用矩阵乘法表现。

image.png

反射 Reflection Matrix 镜像

对一个轴做镜像 image.png

切变 Shear Matrix

切变的的矩阵表现
x=x+yax^’=x+ya
y=yy^’=y

image.png

旋转 Rotate

旋转的矩阵表示,旋转默认是围绕(0,0)点,逆时针旋转。 image.png

推倒过程

image.png

线性变换 Linear Transforms = Matrices

前面说的都是线性变化,一个矩阵乘上一个输入坐标,得到一个结果坐标的变化,都是线性变换。

image.png

齐次坐标 Homogeneous Coordinates

平移 Translation

平移是典型的非线性变换,如下图所示,无法写成一个矩阵乘上一个向量的方式。

image.png

image.png

我们不想让平移成为一个特例,我们试图找到一个方法,能够表示所有的变换,包括平移和旋转,缩放等。

解决方案就是 【齐次坐标

首先对于任意一个二维的点,增加一个维度1,任意一个二维向量,增加一个维度0,具体加0还是1,取决于你准备用这个坐标表示一个点还是一个向量。 因为向量具有平移不变性,所以向量后面要加0,因为这样(x,y)平移之后,会是(x,y,0)表达的还是(x,y)的方向。 image.png 如上图,这样就变成了一个矩阵*一个向量的形式表达平移变换了。

image.png

向量+向量=向量

点-点=从被减数指向减数的一个点

点+向量=一个点沿着一个向量移动,移动到了一个新的点上,所以得到一个点

点+点=这两个点的中间点 (举个例子:(2,2,1)+(1,1,1)=(3,3,2)=>(1.5,1.5,1))

在齐次坐标下,当w不为0时,一个点可以表示为下图。 image.png

仿射变换

前面所说的平移,采用一个矩阵x一个向量再加上一个向量得到的平移结果为仿射变换,仿射变换都可以用齐次坐标表示

image.png

齐次坐标表达2D变换

缩放,旋转和平移 image.png

逆变换

逆变换是讲一个变换倒转回去恢复到之前的样子。在数学上表现为乘以这个矩阵的逆矩阵。矩阵乘以逆矩阵为单位矩阵,也就代表着什么都没做过。

image.png

组合变换

组合变换的顺序很重要,因为变换使用矩阵乘法表示,矩阵乘法不满足于交换律。 先旋转45度,再平移x轴一个单位的组合变换的公式表现:

image.png

这里需要注意的是,矩阵是从右到左应用的。

更多的组合变换,先A1,再A2,然后A3.....可以用下图表示:

image.png

分解变换

主要用于解决一些更加复杂的变换,如下图表示的是如何围绕一个给定点C做变换,而不是根据围绕原点做变换。

image.png 先将C点移动到原点,进行-c平移,然后旋转α,再从原点平移到C带你,进行c平移。

具体计算过程

image.png

image.png

3D 变换

3D变换的齐次坐标依然是在向量末尾加0,点末尾加1.

通常情况下,(x,y,z,w)(w!=0)就表示这样一个3d的点(x/w,y/w,z/w)。 image.png

使用4*4矩阵表达3D仿射变换

image.png