坐标系
左右手坐标系
- 左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。
- 右手坐标系:伸开右手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。
3D笛卡尔坐标系:右手坐标系
OpenGL:右手坐标系
Direct3D:左手坐标系
Unity3D:左手坐标系(世界坐标系),即+x, +y, +z分别指向右方,上方和前方。
各种坐标空间(坐标系)
部分空间种类
- 模型空间
- unity约定:使用的左手坐标系,XYZ分别对应着右上前。
- 模型空间的原点和坐标轴通常由美术人员在建模软件里确定好的。当导入到unity中,我们可以在顶点着色器中访问到模型的顶点信息,其中包含了每个顶点的坐标,这些坐标都是相对于模型空间中的原点(通常位于模型的重心)定义的。
- 检视视图中显示的为localPosition的值。
- transform.localPosition(本地坐标)可以获得物体在父物体的局部坐标系中的位置点。
- 世界空间
- unity约定:使用左手坐标系,但它的XYZ轴是固定不变的。
- transform.position来获取游戏对象的世界坐标。
- 观察空间
- 右手坐标系,这是符合OpenGL传统的,再这样的观察空间中,摄像机的正前方向指的是-z轴方向。
- unity约定:摄像机位于原点,+x轴指向右方,+y轴指向上分,而+z轴指向的是摄像机的后方。
- 裁切空间
- 目标是能够方便地对渲染图元进行裁剪:完全位于这块空间内部的图元将会被保留,完全位于这块空间外部的图元将会被剔除,而与这块空间边界相交的图元就会被裁剪。
- 这块空间是由视椎体来决定。
- 屏幕空间
- 左手坐标系
- 以像素来定义的,屏幕的左下角为(0,0),右上角为(Screen.width, Screen.height),z轴的坐标是相机的世界坐标中z轴坐标的负值。
- 屏幕空间是一个二维空间。
- 鼠标位置坐标属于屏幕坐标,通过Input.mousePosition可以获得该位置的坐标。
- 手指触摸屏幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕时手指的坐标。
- 视口空间
- 将Game视图的屏幕坐标系单位化
- 左下角(0,0),右上角(1,1)。z轴的坐标是相机的世界坐标中z轴坐标的负值。
相互空间转换
- shader中空间转换
- 模型变换:顶点变换的第一步就是将顶点从模型空间变换到世界空间中。这个变换通常叫做模型变换。注意这里的变换顺序是不能互换的,即先进行缩放,然后进行旋转,最后是平移,然后我们可以构建出模型变换的变换矩阵(因为矩阵不满足交换律,所以不要随便调换变换顺序)
- 观察变换:顶点变换的第二步,就是将顶点坐标从世界空间变换到观察空间中,这个变换通常叫做观察变换。一种方法是计算观察空间中的三个坐标轴在世界空间下的表示,然后构建出观察空间变换到世界空间的变换矩阵,再对该矩阵求逆得到从世界空间变换到观察空间的变换矩阵。另一种方法是想象平移整个观察空间,让摄像机原点位于世界坐标的原点,坐标轴与世界空间中的坐标轴重合即可
- 投影变换:顶点变换的第三步,就是将顶点坐标从观察空间变换到裁切空间(也被称为齐次裁剪空间)中,这个变换通常叫做投影变换,这个用于变换的矩阵叫做裁剪矩阵,也被称为投影矩阵。
- 目的:首先是为投影做准备,真正的投影发生在后面的齐次除法过程中,而经过投影矩阵变换后,顶点的w分量将会有特殊的意义;其次是对x,y,z分量进行缩放。
- 视椎体指的是空间中的一块区域,这块区域决定了摄像机可以看到的空间。视椎体由两种类型,这涉及两种投影:一种是正交投影,一种是透视投影。
- 投影:可以理解成一个空间的降维,例如从四维空间投影到三维空间,而投影矩阵实际上并不会真正的进行投影,它会为真正的投影做准备工作。真正的投影会在屏幕映射时发生,通过齐次除法来得到二维坐标。
- 屏幕映射:就是把顶点从裁剪空间投影到屏幕空间中,来生成对应的2D坐标。在unity中,从裁剪空间到屏幕空间的转换一般是底层帮我们完成的,我们顶点着色器只需要把顶点转换到裁剪空间即可。最后由此通过齐次除法和映射到屏幕。——分为两个步骤:首先进行标准齐次除法,也被称为透视除法。就是用齐次坐标系的w分量去除以x,y,z分量;经过齐次除法后,透视投影和正交投影的视椎体都变换到一个相同的立方体内。接下来可以根据 变换后的x和y坐标来映射输出窗口的对应像素坐标。
- unity中C#相关API
- Transform.forward, Transform.right, Transform.up:当前物体的物体坐标系的z轴,x轴,y轴在世界坐标系上的指向。
- Transform.TransformPoint(Vector3 position) :将一个坐标点从局部坐标系转换到全局坐标系。
- Transform.InverseTransformPoint(Vector3 position):将坐标点从全局坐标系转换到局部坐标系。
- Transform.TransformDirection(Vector3 direction):将一个方向从局部坐标系转换到全局坐标系。
- Transform.InverseTransformDirection(Vector3 direction):将一个方向从全局坐标系转换到局部坐标系。
- Transform.TransformVector(Vector3 vector):将一个向量从局部坐标系转换到全局坐标系。
- Transform.InverseTransformVector(Vector3 vector):将一个向量从全局坐标系转换到局部坐标系。
- Camera.ScreenToWorldPoint(Vector3 position): 将屏幕坐标转换为全局坐标。
- Camera.WorldToScreenPoint(Vector3 position):将全局坐标转换为屏幕坐标。
- Camera.ScreenToViewportPoint(Vector3 position):将屏幕坐标转换为视口坐标。
- Camera.ViewportToScreenPoint(Vector3 position):将视口坐标转换为屏幕坐标。
- Camera.WorldToViewportPoint(Vector3 position):将全局坐标转换为视口坐标。
- Camera.ViewportToWorldPoint(Vector3 position):将视口坐标转换为全局坐标。
向量
认识向量
- 在数学中,向量(也称为矢量),是指具有大小和方向的量;书写向量时,水平书写的向量叫做行向量
[
1
2
3
]
begin{bmatrix} 1 & 2 & 3 end{bmatrix}
[123]
垂直书写的向量叫做列向量。
[
1
2
3
]
begin{bmatrix} 1 \ 2 \ 3 end{bmatrix}
⎣⎡123⎦⎤ - 向量的大小就是向量的长度,也叫做模。向量的方向描述了空间中向量的指向;向量中的数表达了向量在每个维度上的有向位移。
- 点中的数表示了一个位置,它没有大小、方向的概念;点只有位置,适量只有方向和大小,任何一个点都可以表示成一个从原点出发的矢量。
向量运算
特殊向量
- 零向量:大小为0,没有方向的向量,并且它不可以被归一化。
- 负向量:向量变负,将得到一个和原向量方向相反、大小相等的向量。
- 单位向量:也叫做标准化向量,就是大小为1的向量;对任意的非零向量,我们都可以计算出它的单位向量,即将其归一化(normalization)。单位向量的表示
a
^
=
a
∣
a
∣
widehat{bf{a}} =frac{bf{a}}{begin{vmatrix} bf{a} end{vmatrix}}
a
=∣∣a∣∣a - 在Unity中,可以使用Vector3.Normalize来归一化向量。使用Vector3.normalized来获得归一化后的单位向量;Vector3.Normalize改变当前向量,Vector3.normalized当前向量是不改变的并且返回一个新的规范化的向量。
向量的长度
- 即向量的大小,或者向量的模。
- 向量的大小就是向量各分量平方和的平方根
- 在Unity中,可以通过Vector3.magnitude计算向量的长度。Vector3.sqrMagnitude则返回向量长度的平方;Vector3.Distance(A,B)可以计算2个点A,B之间的距离,即返回向量AB或向量BA的长度。
向量与标量的乘/除法
- 向量与标量的乘法,即将向量的每个分量分别与标量相乘。
- 向量与非零标量的除法,即乘以该标量的倒数。
向量的加/减法
- 只有在两个向量的维度相同时,才可以相加或相减。
- 向量的加法和减法,即将向量的各个分量相加或相减。
- 向量的加法满足交换律和结合律,向量的减法仅满足结合律。
- 几何意义:对于加法,我们可以把矢量a的头连接到矢量b的尾,然后画一条从a的尾到b的头的矢量,来得到a和b相加后的矢量。减法类似
- 公式:
a
⃗
+
b
⃗
=
(
a
x
+
b
x
,
a
y
+
b
y
,
a
z
+
b
z
)
a
⃗
−
b
⃗
=
(
a
x
−
b
x
,
a
y
−
b
y
,
a
z
−
b
z
)
vec{a} + vec{b}=(a_x+b_x,a_y+b_y,a_z+b_z) \ vec{a} - vec{b}=(a_x-b_x,a_y-b_y,a_z-b_z)
a
+b
=(ax+bx,ay+by,az+bz)a
−b
=(ax−bx,ay−by,az−bz)
向量的点积
- 也叫做向量的内积。表示如下:其中点不可以省略
a
⃗
⋅
b
⃗
vec{a} cdot vec{b}
a
⋅b
- 两种计算公式如下:
a
⃗
⋅
b
⃗
=
∣
a
⃗
∣
∣
b
⃗
∣
cos
θ
a
⃗
⋅
b
⃗
=
(
a
x
b
x
+
a
y
b
y
+
a
z
b
z
)
vec{a} cdot vec{b}=rvert vec{a} rvert rvert vec{b} rvert cos theta \ vec{a} cdot vec{b}=(a_xb_x+a_yb_y+a_zb_z)
a
⋅b
=∣a
∣∣b
∣cosθa
⋅b
=(axbx+ayby+azbz) - 点积满足交换律。
- 向量点积的结果是一个标量
- 几何意义:
- 点乘结果描述了两个向量的“相似”程度,点乘结果越大,两向量越相近
- 投影:向量b在向量a上的投影的长度可以表示为
∣
b
⃗
→
a
⃗
∣
=
∣
b
⃗
∣
cos
θ
=
a
⃗
⋅
b
⃗
∣
a
⃗
∣
begin{vmatrix} vec{b} to vec{a} end{vmatrix}=begin{vmatrix} vec{b} end{vmatrix} cos theta=frac{vec{a} cdot vec{b}}{begin{vmatrix} vec{a} end{vmatrix}}
∣∣∣b
→a
∣∣∣=∣∣∣b
∣∣∣cosθ=∣∣a
∣∣a
⋅b
- 重要性质:
- 点积可结合标量乘法
(
k
a
⃗
)
⋅
b
⃗
=
a
⃗
⋅
(
k
b
⃗
)
=
k
(
a
⃗
⋅
b
⃗
)
(k vec{a}) cdot vec{b} = vec{a} cdot (k vec{b})=k ( vec{a} cdot vec{b})
(ka
)⋅b
=a
⋅(kb
)=k(a
⋅b
) - 点积可结合矢量加减法
a
⃗
⋅
(
b
⃗
+
c
⃗
)
=
a
⃗
⋅
b
⃗
+
a
⃗
⋅
c
⃗
vec{a} cdot ( vec{b}+vec{c}) = vec{a} cdot vec{b}+vec{a} cdot vec{c}
a
⋅(b
+c
)=a
⋅b
+a
⋅c
- 一个矢量和本身进行点积的结果是该矢量的模的平方
向量的叉积
- 也叫做向量的外积。表示如下:其中叉不可以省略
a
⃗
×
b
⃗
vec{a} times vec{b}
a
×b
- 计算公式如下:
[
x
1
y
1
z
1
]
×
[
x
2
y
2
z
2
]
=
[
y
1
z
2
−
z
1
y
2
z
1
x
2
−
x
1
z
2
x
1
y
2
−
y
1
x
2
]
begin{bmatrix} x_{1}\ y_{1}\ z_{1} end{bmatrix}timesbegin{bmatrix} x_{2}\ y_{2}\ z_{2} end{bmatrix} =begin{bmatrix} y_{1}z_{2}-z_{1}y_{2}\ z_{1}x_{2}-x_{1}z_{2}\ x_{1}y_{2}-y_{1}x_{2} end{bmatrix}
⎣⎡x1y1z1⎦⎤×⎣⎡x2y2z2⎦⎤=⎣⎡y1z2−z1y2z1x2−x1z2x1y2−y1x2⎦⎤ - 三重积:
a
⃗
⋅
b
⃗
×
c
⃗
=
a
⃗
⋅
(
b
⃗
×
c
⃗
)
vec{a} cdot vec{b} times vec{c}=vec{a} cdot (vec{b} times vec{c})
a
⋅b
×c
=a
⋅(b
×c
)
- 点积不满足交换律,也不满足结合律。
- 向量叉积的结果仍是一个向量
- 几何意义:
- 叉乘得到的向量垂直于原来的两个向量
- 叉乘的长度等于向量的大小与向量夹角sin值的积
∣
a
⃗
×
b
⃗
∣
=
∣
a
⃗
∣
∣
b
⃗
∣
sin
θ
begin{vmatrix} vec{a} times vec{b} end{vmatrix} = begin{vmatrix} vec{a} end{vmatrix} begin{vmatrix} vec{b} end{vmatrix} sin theta
∣∣∣a
×b
∣∣∣=∣∣a
∣∣∣∣∣b
∣∣∣sinθ - 叉乘的长度也等于以a和b为两边的平行四边形的面积
矩阵
认识矩阵
- 在数学中,矩阵是一个按照长方阵排列的复数或实数的集合。
- 在一个m×n的矩阵A中,有m×n个数,这些数称为矩阵A的元素。数 aij 位于矩阵的第i行,第j列,称为矩阵A的(i,j)元素。
- 矩阵中元素的下标是从1开始的。
[
a
11
a
12
a
13
⋯
a
1
j
a
21
a
22
a
23
⋯
a
2
j
⋮
⋮
⋮
⋱
⋮
a
i
1
a
i
2
a
i
3
⋯
a
i
j
]
begin{bmatrix} a_{11} & a_{12} & a_{13} & cdots & a_{1j} \ a_{21} & a_{22} & a_{23} & cdots & a_{2j} \ vdots & vdots & vdots & ddots & vdots \ a_{i1} & a_{i2} & a_{i3} & cdots &a_{ij} \ end{bmatrix}
⎣⎢⎢⎢⎡a11a21⋮ai1a12a22⋮ai2a13a23⋮ai3⋯⋯⋱⋯a1ja2j⋮aij⎦⎥⎥⎥⎤
矩阵和标量的乘法
- 矩阵和标量相乘,得到的仍然是一个相同维度的矩阵。矩阵和标量的乘法,即矩阵的每个元素和该标量相乘
矩阵和矩阵的加/减法
- 只有维度相同的矩阵,才可以相加相减
- 矩阵和矩阵的相加/相减即矩阵各相同位置的元素的相加相减
矩阵和矩阵的乘法
- 公式:一个r×n的矩阵A和一个n×c的矩阵B相乘,它们的结果AB将会是一个r×c大小的矩阵。这里第一个矩阵的列数必须和第二个矩阵的行数相同,他们相乘得到的矩阵的行数是第一个矩阵的行数,列数是第二个矩阵的列数。
- 演示:
- 矩阵乘法不满足交换律,但是满足结合律及以下关系:
A
B
≠
B
A
(
A
B
)
C
=
A
(
B
C
)
A
B
=
B
T
A
mathbf{AB}neq mathbf{BA} \ left ( mathbf{AB} right )mathbf{C}= mathbf{A}left ( mathbf{BC} right ) \ mathbf{AB}= mathbf{B^{T}A}
AB=BA(AB)C=A(BC)AB=BTA
- 矩阵的几何意义
- 方阵的的行能被解释为坐标系的基向量;
- 为了将向量从原坐标系变换到新坐标系,用它乘以一个矩阵;
- 从原坐标系到这些基向量定义的新坐标系的变换是一种线性变换;线性变换保持直线和平行线,但角度、长度、面积和体积可能会被改变。
- 零向量乘以任何矩阵仍然得到零向量。因此,方阵代表的线性变换的原点和原坐标系的原点一致,变换不包含原点。
- 可以通过想象变换后的坐标系的基向量来想象矩阵,这些基向量在2D中构成“L”型,在3D中构成“三角架”型。
如何理解矩阵相乘的几何意义或现实意义?
- 向量和矩阵相乘:行向量左乘矩阵时,结果是行向量;列向量右乘矩阵时,结果是列向量,其他相乘顺序是不允许的。
特殊矩阵
方阵
对角矩阵
- 对角线元素:方阵中行号和列号相同的元素,其他元素为非对角线元素
- 如果一个矩阵除了对角元素外的所有元素都为0,那么这个矩阵就叫做对角矩阵
单位矩阵
转置矩阵
- 一个r×c矩阵M,M的转置记作
M
T
bf M^T
MT是一个c×r矩阵,它的列由M的行组成。即
M
i
j
T
=
M
j
i
M_{ij}^{T}=M_{ji}
MijT=Mji - 性质1:矩阵转置的转置等于原矩阵:
(
M
T
)
T
=
M
left (mathbf{M} ^{T}right )^{T}=mathbf{M}
(MT)T=M - 性质2:矩阵串接的转置等于反向串接各个矩阵的转置:
(
A
B
)
T
=
B
T
A
T
left ( mathbf{AB} right )^{T}=mathbf{B}^{T}mathbf{A}^{T}
(AB)T=BTAT
逆矩阵
- 给定一个方阵M,它的逆矩阵表示:
M
−
1
bf{M}^{-1}
M−1 - 如果一个矩阵有相应的逆矩阵,则可以说这个矩阵是可逆的,或者说是非奇异的。如果一个矩阵没有相应的逆矩阵,则可以说这个矩阵是不可逆的,或者说是奇异的。
- 性质1:只有方块矩阵才可能有逆矩阵,因为一个矩阵A和它的逆矩阵B需要满足条件:AB = I(I是单位矩阵)。
M
M
−
1
=
M
−
1
M
=
I
mathbf{M}mathbf{M}^{-1}=mathbf{M}^{-1}mathbf{M}=mathbf{I}
MM−1=M−1M=I - 性质2:逆矩阵的逆矩阵是原矩阵本身。
(
M
−
1
)
−
1
=
M
left ( mathbf{M}^{-1} right )^{-1}=mathbf{M}
(M−1)−1=M - 性质3:单位矩阵的逆矩阵是它本身
I
−
1
=
I
mathbf{I}^{-1}=mathbf{I}
I−1=I - 性质4:转置矩阵的逆矩阵是逆矩阵的转置
(
M
T
)
−
1
=
(
M
−
1
)
T
left ( mathbf{M}^{T} right )^{-1}=left ( mathbf{M}^{-1} right )^{T}
(MT)−1=(M−1)T - 性质5:矩阵串接相乘后的逆矩阵等于反向串接各个矩阵的逆矩阵(这个性质可以扩展到更多矩阵相乘)
(
A
B
)
−
1
=
B
−
1
A
−
1
left ( mathbf{AB} right )^{-1}=mathbf{B}^{-1}mathbf{A}^{-1}
(AB)−1=B−1A−1 - 对于所有元素都为0的矩阵,没有对应的逆矩阵。
- 矩阵的逆的几何解释:如果向量v用矩阵M来进行变换,接着用M的逆进行变换,将会得到原向量。
正交矩阵
-
如果一个方阵M和它的转置矩阵的乘积是单位矩阵的话,我们就说这个矩阵是正交的:
M
M
T
=
M
T
M
=
I
mathbf{M}mathbf{M}^{T}=mathbf{M}^{T}mathbf{M}=mathbf{I}
MMT=MTM=I
-
推理:如果一个矩阵是正交的,那么它的转置矩阵和逆矩阵是一样的。
-
几何意义:若一个矩阵是正交矩阵,它必须满足下列条件:
- 矩阵的每一行都是单位向量
- 矩阵的所有行互相垂直
-
线性代数中一组向量互相垂直,这组向量被认为是正交基;如果他们同时满足都是单位向量,则称他们是标准正交基
矩阵的行列式
- 定义
- 在任意方阵中都存在一个标量,称作该方阵的行列式;非方阵的行列式是未定义的。
在书写行列式时,两边用竖线将数字块围起来,省略方括号。 - 2D:帮助记忆法:将主对角线和反对角线上的元素各自相乘,然后用主对角线元素的积减去反对角线元素的积。
∣
M
∣
=
∣
m
11
m
12
m
21
m
22
∣
=
m
11
m
22
−
m
12
m
21
left | M right |=begin{vmatrix} m_{11} &m_{12} \ m_{21} & m_{22} end{vmatrix}=m_{11}m_{22}-m_{12}m_{21}
∣M∣=∣∣∣∣m11m21m12m22∣∣∣∣=m11m22−m12m21 - 3D:帮助记忆法:把矩阵M连写两遍,将主对角线上的元素和反对角线上的元素各自相乘,然后用主对角线上元素积的和减去反对角线上元素积的和。
∣
M
∣
=
∣
m
11
m
12
m
13
m
21
m
22
m
23
m
31
m
32
m
33
∣
=
m
11
m
22
m
33
+
m
12
m
23
m
31
+
m
13
m
21
m
32
−
m
13
m
22
m
31
−
m
12
m
21
m
33
−
m
11
m
23
m
32
=
m
11
(
m
22
m
33
−
m
23
m
32
)
+
m
12
(
m
23
m
31
−
m
21
m
33
)
+
m
13
(
m
21
m
32
−
m
22
m
31
)
left | M right |=begin{vmatrix} m_{11} & m_{12} &m_{13} \ m_{21} & m_{22} &m_{23} \ m_{31} & m_{32} &m_{33} end{vmatrix}=m_{11}m_{22}m_{33}+m_{12}m_{23}m_{31}+m_{13}m_{21}m_{32}-m_{13}m_{22}m_{31}-m_{12}m_{21}m_{33}-m_{11}m_{23}m_{32}=m_{11}(m_{22}m_{33}-m_{23}m_{32})+m_{12}(m_{23}m_{31}-m_{21}m_{33})+m_{13}(m_{21}m_{32}-m_{22}m_{31})
∣M∣=∣∣∣∣∣∣m11m21m31m12m22m32m13m23m33∣∣∣∣∣∣=m11m22m33+m12m23m31+m13m21m32−m13m22m31−m12m21m33−m11m23m32=m11(m22m33−m23m32)+m12(m23m31−m21m33)+m13(m21m32−m22m31)
- 行列式的一些性质:
- 任意行或列的非零积加到另一行或列上不会改变行列式的值
- 交换矩阵的任意两行或两列,行列式变负
- 如果矩阵的任意行或列全为零,那么它的行列式等于零
- 矩阵积的行列式等于矩阵行列式的积;这个性质可以扩展到多个矩阵情况.
∣
A
B
∣
=
∣
A
∣
∣
B
∣
left | AB right |=left| A right|left| B right|
∣AB∣=∣A∣∣B∣ - 矩阵转置的行列式等于原矩阵的行列式。
∣
M
T
∣
=
∣
M
∣
left | M^{T} right |=left | M right |
∣∣MT∣∣=∣M∣
- 矩阵的行列式的几何意义:
- 2D中,行列式等于以基向量为两边的平行四边形的有符号面积;(有符号面积是指如果平行四边形相对于远来的方位“翻转”,那么面积变负。)
- 3D中,行列式等于以变换后的基向量为三边的平行六面体的有符号体积,3D中,如果变换使得平行六面体“由里向外”翻转,则行列式变负。
- 行列式和矩阵变换导致的尺寸改变相关。其中行列式的绝对值和面积(2D),体积(3D)的改变相关。行列式的符号说明了变换矩阵是否包含镜像或投影。
- 矩阵的行列式还可以对矩阵所代表的变换分类:如果矩阵行列式为零,那么该矩阵包含投影;如果矩阵行列式为负,那么该矩阵包含镜像。
变换
齐次坐标
齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示,是指一个用于投影几何里的坐标系统,如同用于欧氏几何里的笛卡儿坐标一般。
线性变换
- 定义:从代数上,是指可以保留矢量加和标量乘的变换。需要满足下面的2个条件。
A
(
α
+
β
)
=
A
(
α
)
+
A
(
β
)
A
(
k
α
)
=
k
A
(
α
)
A(α+β)=A(α)+A(β)\[1ex] A (kα)=kA(α)
A(α+β)=A(α)+A(β)A(kα)=kA(α)
从几何的角度上去理解,需要满足:
- 变换前是直线的,变换后依然是直线。
- 直线比例保持不变。
- 变换前是原点的,变换后依然是原点。
- 旋转和缩放都属于线性变换
- 旋转
2D旋转
R
(
θ
)
=
[
p
′
q
′
]
=
[
c
o
s
θ
s
i
n
θ
−
s
i
n
θ
c
o
s
θ
]
R(theta )=begin{bmatrix} p^{'}\ q^{'} end{bmatrix}=begin{bmatrix} costheta & sintheta \ -sintheta & costheta end{bmatrix}
R(θ)=[p′q′]=[cosθ−sinθsinθcosθ]
3D旋转
绕X轴
R
(
θ
)
=
[
p
′
q
′
r
′
]
=
[
1
0
0
0
c
o
s
θ
s
i
n
θ
0
−
s
i
n
θ
c
o
s
θ
]
R(theta )=begin{bmatrix} p^{'}\ q^{'}\ r^{'} end{bmatrix}=begin{bmatrix} 1&0&0 \ 0&costheta&sintheta \ 0&-sintheta&costheta end{bmatrix}
R(θ)=⎣⎡p′q′r′⎦⎤=⎣⎡1000cosθ−sinθ0sinθcosθ⎦⎤
绕Y轴
R
(
θ
)
=
[
p
′
q
′
r
′
]
=
[
c
o
s
θ
0
−
s
i
n
θ
0
1
0
s
i
n
θ
0
c
o
s
θ
]
R(theta )=begin{bmatrix} p^{'}\ q^{'}\ r^{'} end{bmatrix}=begin{bmatrix} costheta&0&-sintheta \ 0&1&0 \ sintheta&0&costheta end{bmatrix}
R(θ)=⎣⎡p′q′r′⎦⎤=⎣⎡cosθ0sinθ010−sinθ0cosθ⎦⎤
绕Z轴
R
(
θ
)
=
[
p
′
q
′
r
′
]
=
[
c
o
s
θ
s
i
n
θ
0
−
s
i
n
θ
c
o
s
θ
0
0
0
1
]
R(theta )=begin{bmatrix} p^{'}\ q^{'}\ r^{'} end{bmatrix}=begin{bmatrix} costheta&sintheta&0 \ -sintheta&costheta&0 \ 0&0&1 end{bmatrix}
R(θ)=⎣⎡p′q′r′⎦⎤=⎣⎡cosθ−sinθ0sinθcosθ0001⎦⎤
2.缩放(沿着每个坐标轴应用单独的缩放因子k)
2D缩放
S
(
k
x
,
k
y
)
=
[
p
′
q
′
]
=
[
k
x
0
0
k
y
]
S(k_{x},k_{y})=begin{bmatrix} p^{'} \ q^{'} end{bmatrix}=begin{bmatrix} k_{x} & 0\ 0 & k_{y} end{bmatrix}
S(kx,ky)=[p′q′]=[kx00ky]
3D缩放
S
(
k
x
,
k
y
,
k
y
)
=
[
p
′
q
′
r
′
]
=
[
k
x
0
0
0
k
y
0
0
0
k
z
]
S(k_{x},k_{y},k_{y})=begin{bmatrix} p^{'} \ q^{'} \ r^{'} end{bmatrix}=begin{bmatrix} k_{x}&0&0 \ 0&k_{y}&0 \ 0&0&k_{z} end{bmatrix}
S(kx,ky,ky)=⎣⎡p′q′r′⎦⎤=⎣⎡kx000ky000kz⎦⎤
仿射变换
- 定义:从几何的角度去理解,需要满足:
- 变换前是直线的,变换后依然是直线。
- 直线比例保持不变。
- 推理:平移、旋转、缩放都属于仿射变换。
- 对点平移
[
1
0
0
t
x
0
1
0
t
y
0
0
1
t
z
0
0
0
1
]
[
x
y
z
1
]
=
[
x
+
t
x
y
+
t
y
z
+
t
z
1
]
begin{bmatrix} 1 & 0 & 0 & t_{x}\ 0 & 1 & 0 & t_{y}\ 0 & 0 & 1 & t_{z}\ 0 & 0 & 0 & 1 end{bmatrix}begin{bmatrix} x\ y\ z\ 1 end{bmatrix}=begin{bmatrix} x+t_{x}\ y+t_{y}\ z+t_{z}\ 1 end{bmatrix}
⎣⎢⎢⎡100001000010txtytz1⎦⎥⎥⎤⎣⎢⎢⎡xyz1⎦⎥⎥⎤=⎣⎢⎢⎡x+txy+tyz+tz1⎦⎥⎥⎤ - 性质
1、平移变换不会对方向矢量产生任何影响。
2、平移矩阵的逆矩阵就是反向平移得到的矩阵 - 复合变换
由于上面我们使用的是列矩阵,因此阅读顺序是从右向左,即先缩放,在旋转,最后平移。顺序很重要。
- 透视投影
- 将3D空间投影到2D平面上,该平面称作投影平面,使用的是正交投影。正交投影也称作平行投影;透视投影的投影线不再是平行的,它们相交于一点,该点称作投影中心。因为投影中心在投影平面前面,投影线到达平面之前已经相交,所以投影平面上的图像是翻转的。。。当物体原理投影中心时,正交投影仍保持不变,但透视投影变小了,这种视觉现象称作透视缩略。
- 小孔成像:
公式:(向z=d平面投影)
p
′
=
[
x
′
y
′
z
′
]
=
[
d
x
/
z
d
y
/
z
d
]
{p}'=begin{bmatrix} {x}'\ {y}'\ {z}' end{bmatrix}=begin{bmatrix} dx/z\ dy/z\ d end{bmatrix}
p′=⎣⎡x′y′z′⎦⎤=⎣⎡dx/zdy/zd⎦⎤
使用矩阵进行透视投影
[
x
y
z
1
]
[
1
0
0
0
0
1
0
0
0
0
1
1
/
d
0
0
0
0
]
=
[
x
y
z
z
/
d
]
begin{bmatrix} x & y & z & 1 end{bmatrix}begin{bmatrix} 1 & 0 & 0 & 0\ 0 & 1 & 0 & 0\ 0 & 0 & 1 & 1/d\ 0 & 0 & 0 & 0 end{bmatrix}=begin{bmatrix} x & y & z & z/d end{bmatrix}
[xyz1]⎣⎢⎢⎡100001000010001/d0⎦⎥⎥⎤=[xyzz/d]
- unity相关API
- 使用Matrix4x4.Translate创建一个平移矩阵。
- 使用Matrix4x4.Rotate创建一个旋转矩阵。
- 使用Matrix4x4.Scale创建一个缩放矩阵。
- 使用Matrix4x4.TRS创建一个移动、旋转、缩放的复合矩阵。
- 使用Matrix4x4.MultiplyPoint或者Matrix4x4.MultiplyPoint3x4来变换一个点。
- 使用Matrix4x4.MultiplyVector来变换一个向量。