WebGL第二十课:位移很奇怪及其矩阵表达(涉及数学推导)| 8月更文挑战

733 阅读3分钟

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

本文标题:WebGL第二十课:位移很奇怪及其矩阵表达(涉及数学推导)| 8月更文挑战

引子

前两次课分别讲了拉伸和旋转的矩阵表达。但是我们并没有讲一个根基的东西,凭什么就一定可以找到一个矩阵来表达呢。这个东西涉及到很多线性代数的东西,不能过多展开。

总之,拉伸和旋转是能够用矩阵来表达的,而位移则不同。不信我们来试试。

(xy)\left(\begin{array}{cc} x\\ y\end{array}\right)向右移动1个单位

我们知道最后的结果是 (x+1y)\left(\begin{array}{cc} x+1\\ y\end{array}\right)

我们现在的目标就是找到一个矩阵,使得:

[acbd]\begin{bmatrix} a & c \\ b & d \end{bmatrix} * (xy)=(x+1y) \left(\begin{array}{cc} x\\ y\end{array}\right) = \left(\begin{array}{cc} x + 1\\ y\end{array}\right)

如果能成功找到,说明可以用矩阵来表达位移,如果不能找到,就说明不能用矩阵来表达位移。

(xy)\left(\begin{array}{cc} x\\ y\end{array}\right) = (10)\left(\begin{array}{cc} 1\\ 0\end{array}\right) 代入计算

过程不写了,得到

(ab)\left(\begin{array}{cc} a\\ b\end{array}\right) = (10)\left(\begin{array}{cc} 1\\ 0\end{array}\right)

(xy)\left(\begin{array}{cc} x\\ y\end{array}\right) = (01)\left(\begin{array}{cc} 0\\ 1\end{array}\right) 代入计算

过程不写了,得到

(cd)\left(\begin{array}{cc} c\\ d\end{array}\right) = (11)\left(\begin{array}{cc} 1\\ 1\end{array}\right)

根据上面的结果,貌似得到一个式子:

[1101]\begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix} * (xy)=(x+1y) \left(\begin{array}{cc} x\\ y\end{array}\right) = \left(\begin{array}{cc} x + 1\\ y\end{array}\right)

确实:

(10)\left(\begin{array}{cc} 1\\ 0\end{array}\right)变成了(20)\left(\begin{array}{cc} 2\\ 0\end{array}\right)

(01)\left(\begin{array}{cc} 0\\ 1\end{array}\right)变成了(11)\left(\begin{array}{cc} 1\\ 1\end{array}\right)

是往右位移了一个单位。

验证上述结果是否满足其他的点

例如,随便找一个点 (23)\left(\begin{array}{cc} 2\\ 3\end{array}\right),看看是否能变成(33)\left(\begin{array}{cc} 3\\ 3\end{array}\right)

开始计算:

[1101]\begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix} * (23) \left(\begin{array}{cc} 2\\ 3\end{array}\right) =

(10)2+(11)3 \left(\begin{array}{cc} 1\\ 0\end{array}\right) * 2 + \left(\begin{array}{cc} 1\\ 1\end{array}\right) * 3 =

(20)+(33)=(53)(33) \left(\begin{array}{cc} 2\\ 0\end{array}\right) + \left(\begin{array}{cc} 3\\ 3\end{array}\right) = \left(\begin{array}{cc} 5\\ 3\end{array}\right) \neq \left(\begin{array}{cc} 3\\ 3\end{array}\right)

显然,上面的矩阵,不适用于点(23)\left(\begin{array}{cc} 2\\ 3\end{array}\right),即

(23)\left(\begin{array}{cc} 2\\ 3\end{array}\right)无法通过左乘这个矩阵变成(33)\left(\begin{array}{cc} 3\\ 3\end{array}\right)

某种操作到底能不能用矩阵来表达,是一个数学问题,拉伸和旋转可以,而位移就不行。大家先要记住这个结论。如果有感兴趣的,去看一看线性变换的概念,也就是说,只要是线性变换的操作就可以用矩阵来表达。这里不展开讨论。

解决办法: 升维

难道就真不能用矩阵来表达位移了吗?

错!升维!

    维度打击即将来临,面对高维攻击,低维生物完全无法抗衡!

我们确实不能找到一个矩阵:

[acbd]\begin{bmatrix} a & c \\ b & d \end{bmatrix} * (xy)=(x+1y) \left(\begin{array}{cc} x\\ y\end{array}\right) = \left(\begin{array}{cc} x + 1\\ y\end{array}\right)

但是,看好了:

[adgbehcfi]\begin{bmatrix} a & d & g \\ b & e & h \\ c & f & i\end{bmatrix} * (xy1)=(x+1y1) \left(\begin{array}{cc} x\\ y \\1\end{array}\right) = \left(\begin{array}{cc} x + 1\\ y\\ 1\end{array}\right)

如果上式中的矩阵能找到,即对于所有(xy1)\left(\begin{array}{cc} x\\ y \\1\end{array}\right)代入的话,等式都能成立,会有什么奇妙的东西出现吗?

当然有,只要你忽略结果中的第三维, 我们就能用这个 3 * 3 的矩阵来表达二维向量的位移了。

解决上式,找到 3 * 3 的这个矩阵

这里我们不进行代入法计算了,直接给出最后的结果:

[adgbehcfi]\begin{bmatrix} a & d & g \\ b & e & h \\ c & f & i\end{bmatrix} = [101010001]\begin{bmatrix} 1 & 0 & 1 \\ 0 & 1 & 0 \\ 0 & 0 & 1\end{bmatrix}, 即

任意 (xy1)\left(\begin{array}{cc} x\\ y \\1\end{array}\right) 左乘上述矩阵,得到的结果都是:

(x+1y1)\left(\begin{array}{cc} x+1\\ y \\1\end{array}\right)

我们来验证一下这个矩阵是否是对的:

[101010001]\begin{bmatrix} 1 & 0 & 1 \\ 0 & 1 & 0 \\ 0 & 0 & 1\end{bmatrix} * (xy1)\left(\begin{array}{cc} x\\ y \\1\end{array}\right) =

(100)x+(010)y+(101)1 \left(\begin{array}{cc} 1\\ 0\\ 0\end{array}\right) * x + \left(\begin{array}{cc} 0\\ 1\\ 0\end{array}\right) * y + \left(\begin{array}{cc} 1\\ 0\\ 1\end{array}\right) * 1 =

(x+1y1)\left(\begin{array}{cc} x+1\\ y \\1\end{array}\right)。【验证完毕】

位移的一般式

擅于发现规律和理解线性组合的小伙伴,应该已经发现了,如果我们想要 x 位移 a,y 位移 b。

只需要将上面的矩阵改写一下就行了:

[10a01b001]\begin{bmatrix} 1 & 0 & a \\ 0 & 1 & b \\ 0 & 0 & 1\end{bmatrix}

即:

[10a01b001]\begin{bmatrix} 1 & 0 & a \\ 0 & 1 & b \\ 0 & 0 & 1\end{bmatrix} * (xy1)\left(\begin{array}{cc} x\\ y \\1\end{array}\right) = (x+ay+b1)\left(\begin{array}{cc} x+a\\ y+b \\1\end{array}\right)

至于如何一眼看出上面的结论,请用线性组合的眼光去看待矩阵乘法,一切都不过是小菜一碟。

总结

一个二维向量,即一个二维坐标点,如果想要用矩阵乘法,来进行位移的话

  • 二维本身不够用
  • 将这个坐标加一维,第三维写一个固定的1

然后左乘上述矩阵就可以得到想要的结果了。

当然结果中的第三维,你使用的时候,可以忽略他。

好吧,暂时忽略。

其实他还是有点作用的。这个后面再说。




  正文结束,下面是答疑

小瓜瓜说:为什么坐标的第三维一定是1,其他数字不行吗?

  • 答:也行,你自己代入里面,看看,也能做到位移,不过跟我们的需求不一样。