定义
矩阵
(matrix)列矩阵
(column matrix)行矩阵
(raw matrix)
几何意义:变换
kM=Mk=km11m21m31m12m22m32m13m23m33=km11km21km31km12km22km32km13km23km33
运算方法
cij=ai1b1j+ai2b2j+⋯+aimbnj=k=1∑naikbkj
运算性质
运算方法
运算性质
运算方法
运算性质
- 可逆,(M−1)−1=M
- 单位矩阵的逆矩阵是本身,I−1=I
运算关系性质
- (MT)−1=(M−1)T
- (AB)−1=B−1A−1、(ABCD)−1=D−1C−1B−1A−1
运算意义
线性变换
指可以保留矢量和标量乘的变换,可以用3X3矩阵表示
平移变换不是线性变换,不满足标量乘法也不满足矢量加法,不能用一个3x3矩阵表示
仿射变换
就是合并线性变换
和平移变换
的变换类型,可以使用一个4x4的矩阵来表示
为此需要把矢量扩展到四维空间下,这就是齐次坐标空间
(homogeneous space)
常见的变换种类和他们的特性
变换名称 | 是线性变换吗 | 是仿射变换吗 | 是可逆矩阵吗 | 是正交矩阵吗 |
---|
平移矩阵 | N | Y | Y | N |
绕坐标轴旋转的旋转矩阵 | Y | Y | Y | Y |
绕任意轴旋转的旋转矩阵 | Y | Y | Y | Y |
按坐标轴缩放的缩放矩阵 | Y | Y | Y | N |
错切矩阵 | Y | Y | Y | N |
镜像矩阵 | Y | Y | Y | Y |
正交投影矩阵 | Y | Y | N | N |
透视投影矩阵 | N | N | N | N |
齐次坐标是一个四维矢量(相对于三维空间而已,可以超过四维),可以把三维矢量转换成齐次坐标
- 对于一个点,把w分量设为1
- 对方向矢量,把w分量设为
- 这样定义运算的原因:当用一个4x4矩阵对一个点进行变换时,平移旋转缩放都会施加于该点,但对方向矢量进行的平移会被忽略
- 基础变换矩阵:纯平移、纯旋转、纯缩放的变换矩阵叫做基础变换矩阵
这些矩阵有一些共同点,可以把一个继承变换矩阵分解成4个组成部分
左上角3x3矩阵表示旋转和缩放,右上角表示平移,左下角是零矩阵,右下角是标量1
[M3x301x3t3x11]
- 方块矩阵(square matrix)
- 对角矩阵(diagonal matrix)
- 单位矩阵(identity matrix)
- 正交矩阵(orthogonal matrix)
- 特点
- 等价于MMT=MTM=I
- 等价于MT=M−1
- 矩阵每一行都是单位矢量,且每一行个矢量之间互相垂直。该结论对列同样适用**【计算量最少的验证方法】**
- 举例
- 应用
对点变换
100001000010txtytz1xyz1=x+txy+tyz+tz1
对矢量变换(无效)
100001000010txtytz1xyz0=xyz0
特点
- 不是正交矩阵
- 对点有效,对矢量无效
- 逆矩阵是反向平移得到的矩阵
对点变换
kx0000ky0000kz00001xyz1=kxxkyykzz1
对矢量变换
kx0000ky0000kz00001xyz0=kxxkyykzz0
特点
- 一般不是正交矩阵
- 如果缩放系数kx=ky=kz,我们把这样的缩放称为
统一缩放
(uniform scale),否则称为非统一缩放
(nonuniform scale) - 逆矩阵是使用原缩放系数的倒数来对点或方向矢量进行缩放
绕x轴旋转时
Rx(θ)P=10000cosθsinθ00−sinθcosθ00001xyz1
绕y轴旋转时
Ry(θ)P=cosθ0−sinθ00100sinθ0cosθ00001xyz1
绕z轴旋转时(也适用于二维情况)
Rz(θ)P=cosθsinθ00−sinθcosθ0000100001xyz1
特点
- 是正交矩阵,且多个旋转矩阵之间的串联同样是正交的
- 逆矩阵是旋转相反角度得到的变换矩阵
顺序很重要
- 一般先缩放再旋转再平移,以保证结果一样
- 多个轴旋转时,在Unity中按zxy的顺序旋转,但注意呦两种坐标系可以选择
- (1) 绕坐标系E连续进行旋转,应使用(MzMxMy)P的顺序
- (2) 每次旋转将坐标系一起旋转,应使用MyMxMZP的顺序
- 两种坐标系使用不同的旋转顺序后,结果是一样的。而Unity文档中说明的旋转顺序是第一种情况的顺序
一些变量
- 子坐标空间的一点:Ac=(a,b,c)
- 坐标空间C的3个坐标轴在父坐标空间P下的表示xc、yc、zc和原点位置Oc
父坐标空间与子坐标空间,一般有两个需求(方向矢量变换时则不需要扩展到齐次坐标空间,用3x3矩阵即可)
(1) 将子坐标空间下的点或矢量Ac转换到父坐标空间下的表示Ap,即
Ap=Mc→pAc
其中Mc→p表示的是从子坐标空间变换到父坐标空间的变换矩阵
Mc→p=∣xc∣∣yc∣∣zc∣非矢量时
|&|&|&|\ x_c&y_c&z_c&O_c\ |&|&|&|\ 0&0&0&1 \end
Ac=Mp→cAp
其中Mp→c表示的是从父坐标空间变换到子坐标空间的变换矩阵
Mp→c=∣xp∣∣yp∣∣zp∣=−−−xcyczc−−−
推导过程
Ap=Oc+axc+byc+czc=∣OC∣+∣xc∣∣yc∣∣zc∣abc=∣xc∣0∣yc∣0∣zc∣0∣Oc∣1abc1
技巧:怎么判断横着放还是竖着放?可以猜,然后用MA→B来变换xB,看结果是否为(1,0,0)
MA→BxB=−−−xcyczc−−−xB=xBxByBxBzBxB=100
可以用矩阵来表示矢量,列矩阵或行矩阵都行
但当他与另一个矩阵相乘时需要注意选择次序和行列矩阵
(题外话:Unity中,一般把矢量放在矩阵的右侧,即把矢量转换成列矩阵来进行运算,使用的矩阵乘法是右乘)