WebGL第二十课:位移很奇怪及其矩阵表达(涉及数学推导)| 8月更文挑战
主题使用方法:http://github.com/xitu/juejin-markdown-themes
theme: juejin highlight: juejin
这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战
本文标题:WebGL第二十课:位移很奇怪及其矩阵表达(涉及数学推导)| 8月更文挑战
引子
前两次课分别讲了拉伸和旋转的矩阵表达。但是我们并没有讲一个根基的东西,凭什么就一定可以找到一个矩阵来表达呢。这个东西涉及到很多线性代数的东西,不能过多展开。
总之,拉伸和旋转是能够用矩阵来表达的,而位移则不同。不信我们来试试。
将$\left(\begin{array}{cc} x\ y\end{array}\right)$向右移动1个单位
我们知道最后的结果是 $\left(\begin{array}{cc} x+1\ y\end{array}\right)$
我们现在的目标就是找到一个矩阵,使得:
$$ \begin{bmatrix} a & c \ b & d \end{bmatrix} $$ * $ \left(\begin{array}{cc} x\ y\end{array}\right) = \left(\begin{array}{cc} x + 1\ y\end{array}\right)$
如果能成功找到,说明可以用矩阵来表达位移,如果不能找到,就说明不能用矩阵来表达位移。
将 $\left(\begin{array}{cc} x\ y\end{array}\right)$ = $\left(\begin{array}{cc} 1\ 0\end{array}\right)$ 代入计算
过程不写了,得到
$\left(\begin{array}{cc} a\ b\end{array}\right)$ = $\left(\begin{array}{cc} 1\ 0\end{array}\right)$
将 $\left(\begin{array}{cc} x\ y\end{array}\right)$ = $\left(\begin{array}{cc} 0\ 1\end{array}\right)$ 代入计算
过程不写了,得到
$\left(\begin{array}{cc} c\ d\end{array}\right)$ = $\left(\begin{array}{cc} 1\ 1\end{array}\right)$
根据上面的结果,貌似得到一个式子:
$$ \begin{bmatrix} 1 & 1 \ 0 & 1 \end{bmatrix} $$ * $ \left(\begin{array}{cc} x\ y\end{array}\right) = \left(\begin{array}{cc} x + 1\ y\end{array}\right)$
确实:
$\left(\begin{array}{cc} 1\ 0\end{array}\right)$变成了$\left(\begin{array}{cc} 2\ 0\end{array}\right)$
$\left(\begin{array}{cc} 0\ 1\end{array}\right)$变成了$\left(\begin{array}{cc} 1\ 1\end{array}\right)$
是往右位移了一个单位。
验证上述结果是否满足其他的点
例如,随便找一个点 $\left(\begin{array}{cc} 2\ 3\end{array}\right)$,看看是否能变成$\left(\begin{array}{cc} 3\ 3\end{array}\right)$
开始计算:
$$ \begin{bmatrix} 1 & 1 \ 0 & 1 \end{bmatrix} $$ * $ \left(\begin{array}{cc} 2\ 3\end{array}\right)$ =
$ \left(\begin{array}{cc} 1\ 0\end{array}\right) * 2 + \left(\begin{array}{cc} 1\ 1\end{array}\right) * 3$ =
$ \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)$
显然,上面的矩阵,不适用于点$\left(\begin{array}{cc} 2\ 3\end{array}\right)$,即
点$\left(\begin{array}{cc} 2\ 3\end{array}\right)$无法通过左乘这个矩阵变成$\left(\begin{array}{cc} 3\ 3\end{array}\right)$。
某种操作到底能不能用矩阵来表达,是一个数学问题,拉伸和旋转可以,而位移就不行。大家先要记住这个结论。如果有感兴趣的,去看一看线性变换
的概念,也就是说,只要是线性变换的操作
就可以用矩阵来表达。这里不展开讨论。
解决办法: 升维
难道就真不能用矩阵来表达位移了吗?
错!升维!
维度打击即将来临,面对高维攻击,低维生物完全无法抗衡!
我们确实不能找到一个矩阵:
$$ \begin{bmatrix} a & c \ b & d \end{bmatrix} $$ * $ \left(\begin{array}{cc} x\ y\end{array}\right) = \left(\begin{array}{cc} x + 1\ y\end{array}\right)$
但是,看好了:
$$ \begin{bmatrix} a & d & g \ b & e & h \ c & f & i\end{bmatrix} $$ * $ \left(\begin{array}{cc} x\ y \1\end{array}\right) = \left(\begin{array}{cc} x + 1\ y\ 1\end{array}\right)$
如果上式中的矩阵能找到,即对于所有$\left(\begin{array}{cc} x\ y \1\end{array}\right)$代入的话,等式都能成立,会有什么奇妙的东西出现吗?
当然有,只要你忽略结果中的第三维, 我们就能用这个 3 * 3 的矩阵来表达二维向量的位移了。
解决上式,找到 3 * 3 的这个矩阵
这里我们不进行代入法计算了,直接给出最后的结果:
$$ \begin{bmatrix} a & d & g \ b & e & h \ c & f & i\end{bmatrix} $$ = $$ \begin{bmatrix} 1 & 0 & 1 \ 0 & 1 & 0 \ 0 & 0 & 1\end{bmatrix} $$, 即
任意 $\left(\begin{array}{cc} x\ y \1\end{array}\right)$ 左乘上述矩阵,得到的结果都是:
$\left(\begin{array}{cc} x+1\ y \1\end{array}\right)$。
我们来验证一下这个矩阵是否是对的:
$$ \begin{bmatrix} 1 & 0 & 1 \ 0 & 1 & 0 \ 0 & 0 & 1\end{bmatrix} $$ * $\left(\begin{array}{cc} x\ y \1\end{array}\right)$ =
$ \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$ =
$\left(\begin{array}{cc} x+1\ y \1\end{array}\right)$。【验证完毕】
位移的一般式
擅于发现规律和理解线性组合的小伙伴,应该已经发现了,如果我们想要 x 位移 a,y 位移 b。
只需要将上面的矩阵改写一下就行了:
$$ \begin{bmatrix} 1 & 0 & a \ 0 & 1 & b \ 0 & 0 & 1\end{bmatrix} $$
即:
$$ \begin{bmatrix} 1 & 0 & a \ 0 & 1 & b \ 0 & 0 & 1\end{bmatrix} $$ * $\left(\begin{array}{cc} x\ y \1\end{array}\right)$ = $\left(\begin{array}{cc} x+a\ y+b \1\end{array}\right)$。
至于如何一眼看出上面的结论,请用线性组合的眼光去看待矩阵乘法,一切都不过是小菜一碟。
总结
一个二维向量,即一个二维坐标点,如果想要用矩阵乘法,来进行位移的话
- 二维本身不够用
- 将这个坐标加一维,第三维写一个固定的1
然后左乘
上述矩阵就可以得到想要的结果了。
当然结果中的第三维,你使用的时候,可以忽略他。
好吧,暂时忽略。
其实他还是有点作用的。这个后面再说。
正文结束,下面是答疑
### 小瓜瓜说:为什么坐标的第三维一定是1,其他数字不行吗?
- 答:也行,你自己代入里面,看看,也能做到位移,不过跟我们的需求不一样。
- 庖丁解牛斐波拉契数列和背包问题——详细解析两个问题优化过程,带你从最基本的问题看懂动态规划!!!
- WebGL第二十课:位移很奇怪及其矩阵表达(涉及数学推导)| 8月更文挑战
- 无锁读取配置变量
- WebGL第三十二课:简单2D光照
- 庖丁解牛之-Android平台RTSP|RTMP播放器设计
- 庖丁解牛-图解MySQL 8.0优化器查询转换篇
- 庖丁解牛-图解MySQL 8.0优化器查询转换篇
- 庖丁解牛-图解MySQL 8.0优化器查询解析篇
- 干货 | 45张图庖丁解牛18种Queue,你知道几种?
- 45 图|庖丁解牛 18 种「队列」,你知道几种?
- 庖丁解牛:最全babel-plugin-import源码详解
- WebGL第二课:写一个圆
- 用 Arthas “庖丁解牛”
- 用 Arthas “庖丁解牛”
- 用 Arthas “庖丁解牛”
- 庖丁解牛之 Flutter for Web
- 重磅|庖丁解牛之——Flutter for Web