从线性代数到unity mvp矩阵

坐标变换:矩阵是一种线性空间变换的描述(矩阵的列向量,是坐标变换后的基向量)。

如:  \begin{bmatrix} 1&3 \\ -2&0 \end{bmatrix}\begin{bmatrix} -1\\ 2 \end{bmatrix} = \begin{bmatrix} 5\\ 2 \end{bmatrix}

如上图,即向量(-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)。

用矩阵计算就是:\begin{bmatrix} 2 & -2\\ 2& 2 \end{bmatrix}\cdot \begin{bmatrix} 0.5\\ 0.5 \end{bmatrix}=\begin{bmatrix} 0\\ 2 \end{bmatrix}。这个矩阵就是一个缩放、旋转组合的变换矩阵。

2.这时候我们知道了点D比点A在世界空间下是偏移了(0,2),我们又知道点A的世界坐标是(-3,2)。

那么D的世界坐标就是(-3,2) + (0, 2) = (-3, 4),

即:\begin{bmatrix} 1 & 0& -3\\ 0& 1& 2\\ 0& 0& 1 \end{bmatrix}\cdot \begin{bmatrix} 0 \\ 2 \\ 1 \end{bmatrix}=\begin{bmatrix} -3\\ 4\\ 1 \end{bmatrix}  。最左边的这个3X3矩阵就是平移变换矩阵。

最后从上面可以看出,我们必须先计算缩放、旋转矩阵的变换,再计算平移矩阵的变换。因为一开始的点(0.5, 0.5)是模型空间的坐标,而平移的坐标是世界空间下的坐标,两者并不在一个空间维度下,直接平移是不匹配的。只能先通过缩放、旋转矩阵变换之后得到的世界空间下的偏移值才能用坐标A来进行世界空间的平移变换。

逆矩阵:

逆矩阵就是矩阵的逆变换

若有矩阵A,则A的逆矩阵为:A^{-1}。有性质A^{}\cdot A^{-1} = E,其中E为单位矩阵。

若有向量i经过A矩阵变换后得到jA^{}\cdot i = j。又因为矩阵乘法结合律。

则有:A^{-1}\cdot j = A^{-1}\cdot A\cdot i = E\cdot i = i,即j经过A矩阵的逆变换会变回i

四维空间:

        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)进行平移变换:

\begin{bmatrix} 1 & 0& 0& 2\\ 0& 1& 0 & 3\\ 0& 0& 1& 4\\ 0& 0& 0 & 1 \end{bmatrix}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值