矩阵乘法浅析

发表于2017-12-19
评论0 2.8k浏览

   本篇的背景是这样,大家都知道矩阵变化操作,以前我认为只要记住几个标准的变换矩阵就可以了,不用在意那些数据知识。可是在    Shader学习渲染管线,投影矩阵推导时候,直接就崩溃了,根本无法知道投影变化中,视空间到cvv的推导是怎么弄的?实际上我觉得很多同学也会不以为然,毕竟投影变换MVP矩阵系统已经给出了。但是我这在学习利用屏幕坐标深度缓存还原世界坐标(深度缓存到世界坐标的重建)这也是一大类 shader imageeffect 和command buffer事后候渲染高级Shader时遇到了极大的困难。这个反推世界坐标的过程需要对矩阵变换的原理有很强的认识,我被这个问题卡了大概两个星期的时间,其中恶补了相当的数学知识。我想数学好同学肯定是没有什么问题,但对于我这样的数学菜鸟简直太困难啦。(当然你也可以通过这个反推重建的过程来验证下你对于矩阵和投影变化的真正理解程度)

     这里我将学习的数学知识做一个总结,通过白话的方式记录下来,也希望对像我一样数学不太好的同学有用,今天的主题是白话矩阵乘法本质是什么?我想稍微有一些编程经验的人都知道,图形变化中的矩阵,可以用来做旋转,缩放,平移和错切,
文中我将尝试下用简单的高中数学知识来解释推导的原理。
     首先我们还是先抛出概念矩阵乘法的本质是什么?比较确切的定义是,“矩阵乘法的本质是线性空间运动的描述”,也可以参考,下面这一篇神文,实际上已经很白话了,但是能不能再通俗一些呢?
https://www.zhihu.com/question/21351965/answer/204058188,矩阵乘法的本质是什么?
     矩阵乘法的本质是线性空间运动的描述,怎么用大白话,来理解这句话呢!
     让我们穿越下,回忆下初中和高中我们都学过一项知识,"如何求直线的位移",实际上老师教的时候有两种解法,一种是直接移动,另外一种是通过移动坐标轴来实现,实际上矩阵乘法,就是应用移动坐标轴的这种方法,只是我们初中学的时候比较简单,主要是做平移,平移用上面这篇文章讲的例子,"坐公交车的出行",那么我们来分析一下这个过程,我们上车以后,我们相对于公交车并没有移动,而是公交车通过移动把我们载到了目的地,这样我们不需要计算人的坐标移动,只要计算公交车移动就可以了,实际上这就是移动坐标系,来计算位移的原理。


让我们来类比一下?实际上矩阵乘法就是乘车行动的过程,公交车就是我们定义的矩阵。说白了,移动坐标轴的方法是这样,我们不需去求初始点到终点的移动,我们只需要求坐标轴的变化就可以了。我们用旋转矩阵的推导来说明一下,这里相关的例子很多,我就不详细推导证明了。参考下面两篇
http://www.cnblogs.com/wonderKK/p/5275003.html 旋转矩阵推导
http://blog.csdn.net/ubunfans/article/details/45676433 2D图像中点的旋转

实际上第一篇是网上广泛流行的一种推导,不知道大家看了以后是什么感觉?这种通过计算式来反推旋转矩方法,就有点像我们已经知道答案了,然后反推旋转矩阵是什么?实际上我看到这种推导文章觉得非常别扭。

下面我们尝试下正推,通过坐标轴变换来推导旋转矩阵。我们不需要求点的旋转,开始之前,我们要补充一个概念,就是坐标点是如何表示的比如(1,2) ,这个1,2表示的是什么意思呢?从几何上讲是从点作坐标轴的垂线,垂线在坐标轴的位置刻度(学名叫正交投影),明白了这这个概念以后。我们实际上需要完成两个步骤,如下图所示

来自:http://blog.csdn.net/m0_37283423/article/details/77890767


第一步是坐标轴旋转,而旋转点不动(坐标轴用原来坐标轴单位向量表示)
第二步是,点到新坐标系的投影(实际上就是做垂线得到在新坐标系下的刻度值),在新坐标系下的值就是,转换后的结果值。这里我也就不在详细说明这个过程啦,将文章中证明的文字直接引用过来,

坐标轴旋转,新的坐标轴可以表示为 x1 = (cosθ,sinθ), y1 = (-sinθ, cosθ) 这里用单位向量表示,只是指示一下新坐标轴的方向而已。这个很容易证明,单位向量种旋转坐标轴,可以想象就是坐标轴相对老坐标轴旋转θ度,

假设向量a在与新坐标轴X1的夹角为φ,那么a在X1上的投影为<a,X1>也就是向量a与X1的点积,因为坐标轴X1为单位向量,所以点积即为投影长度。(这不是前两篇我们说的点击的定义嘛)
同理<a, Y1>为向量在新坐标轴Y1上的投影长度,
于是x1cosθ-y1sinθ = x’
       x1sinθ + y1cosθ=y’
写成矩阵相乘的形式


这样我们就得出了矩阵乘法的本质,也知道矩阵到底表示的是什么?
在下面的图片中,我标注出了矩阵的冒,也就是列,记住他们代表的是转换坐标系的向量方向和大小,
最后,本文的结论,白话矩阵乘法的本质,通过改变线性空间的坐标系实现点的位置变换。

 

 

 

大话一下,矩阵乘法的本质,就是我们穿过传送门到达另一个坐标系的过程,我们没有变,只是世界变了,而传送门就是矩阵了。


需要注意以下几点
矩阵的左乘和右乘是不一样的,以上文章和本人使用的都是左乘;
关于旋转矩阵,顺时针和逆时针是不一样,看一下网上很多文章写的都是错的,所以建议参考维基百科的,说明,也就是本文贴图的那张图片,https://en.wikipedia.org/wiki/Transformation_matrix
关于平移矩阵,实际上不是一种线性变换而是一种仿射变换,但是可以通过升一个维度的线性变换来表示,这部分的内容比较难,具体可以学习下面这篇文章,
明白了矩阵乘法本质以及矩阵列表示的内容(坐标系变换),再推导三维或者其他变换矩阵就变得很容易了,记得我们是使用的正推哟。
由于本人数学水平有限,以上文章内容,纯属一家之言,有说的不对的地方,欢迎大家指正批评,最后附上一个公开课的视频,讲的很好。
https://www.zhihu.com/question/20666664/answer/157400568,如何通俗地讲解「仿射变换」这个概念?
http://www.bilibili.com/video/av6731067/index_1.html,【双字/合集】“线性代数的本质”系列合集_趣味科普人文_科技_bilibili_哔哩哔哩弹幕视频网

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引