坐标变换:矩阵是一种线性空间变换的描述(矩阵的列向量,是坐标变换后的基向量)。
如: =
如上图,即向量(-1,2)在经过由基底x轴:(1, -2) ,y轴:(3, 0)组成的矩阵变换后得到向量(5,2)
实际上就是-1倍的x轴:(1, -2)加上2倍的y轴:(3, 0)
以基底作为列向量组成的矩阵可以表示旋转、缩放变换。
下面说一个最简单的二维空间变换实例:
假设:BAC是一个以AC:(2,2)作为X轴,AB:(-2,2)作为Y轴的模型空间,那么点D在模型空间下的坐标就是(0.5, 0.5)。
我们现在把点D变换到世界空间下的坐标
1.可以看出点D在世界空间下,基于点A往AC方向走了0.5倍的AC,在AB方向走了0.5倍的AB。
用向量计算就是:0.5 · AC + 0.5 · AB = (0,2)。
那么点D相对于点A在世界空间下偏移了(0,2)。
用矩阵计算就是:。这个矩阵就是一个缩放、旋转组合的变换矩阵。
2.这时候我们知道了点D比点A在世界空间下是偏移了(0,2),我们又知道点A的世界坐标是(-3,2)。
那么D的世界坐标就是(-3,2) + (0, 2) = (-3, 4),
即: 。最左边的这个3X3矩阵就是平移变换矩阵。
最后从上面可以看出,我们必须先计算缩放、旋转矩阵的变换,再计算平移矩阵的变换。因为一开始的点(0.5, 0.5)是模型空间的坐标,而平移的坐标是世界空间下的坐标,两者并不在一个空间维度下,直接平移是不匹配的。只能先通过缩放、旋转矩阵变换之后得到的世界空间下的偏移值才能用坐标A来进行世界空间的平移变换。
逆矩阵:
逆矩阵就是矩阵的逆变换
若有矩阵A,则A的逆矩阵为:。有性质
,其中E为单位矩阵。
若有向量经过A矩阵变换后得到
:
。又因为矩阵乘法结合律。
则有:,即
经过A矩阵的逆变换会变回
四维空间:
2X2的矩阵代表二维空甲的线性变换,而3X3矩阵则可以表示一个三维空间的变换。
在三维空间中,将向量 u 变换到向量 v,如果该变换是一个线性变换,一般可以使用一个不依赖于 u、v 的 3x3 的矩阵描述,即 A · u = v,其中 A 是描述该线性变换的变换矩阵。但是,并不是所有线性变换都能使用 3x3 矩阵描述,如:平移变换和对称变换,对于这些变换,需要将空间扩展到四维空间中,再使用 4x4 矩阵描述。这里注意,平移变换对向量来讲是没有意义的,因为无论如何平移,向量都是一样的,平移变换只对坐标点有意义。
Unity 模型变换主要有平移、旋转、缩放、对称,其中旋转和缩放变换可以使用 3x3 矩阵描述,平移和对称变换必须使用 4x4 矩阵描述,为了统一描述这些变换,将三维空间扩展到四维空间中,扩展方法如下:
三维空间中的坐标原点 [0, 0, 0]' 映射到四维空间中的 [0, 0, 0, 1]' 点;
三维空间中的 x、y、z 轴正方向单位向量 [1, 0, 0]'、[0, 1, 0]'、[0, 0, 1]' 分别映射到四维空间中的 [1, 0, 0, 0]'、 [0, 1, 0, 0]'、 [0, 0, 1, 0]' 向量;
新添加的 w 轴 正方向单位向量为 [0, 0, 0, 1]'。
注意:三维空间中的原点 [0, 0, 0]' 并没有映射到四维空间中的原点 [0, 0, 0, 0]‘,而是映射到 [0, 0, 0, 1]’。
由以上空间映射关系可知:
三维空间中的任意点 [x, y, z]',对应的四维空间坐标为:[x, y, z, 1]';
三维空间中的任意向量 [x, y, z]',对应的四维空间坐标为:[x, y, z, 0]'。
为什么这样做?
举个例子:
1:对点(1, 1, 1)进行平移变换: