在图形学中矩阵统一以列矩阵的形式呈现
比如一个单列矩阵
3*3矩阵
在此之前补一个Markdown如何写矩阵的内容,感谢原贴分享!
https://blog.csdn.net/qq_38228254/article/details/79469727
图片和内容均来自GAMES101,万分感谢大神的分享! http://games-cn.org/
进入正题
线性变换包含我们常说的【缩放】【斜切】【旋转】。
PS:这里我们以2D图像为例
缩放矩阵

等比即为原坐标乘以比例系数
等比缩放的矩阵形式为
从上可以看出,不等比缩放也同样适用以上矩阵变换。

另,镜像矩阵其实是缩放矩阵的一种特殊形式。

斜切矩阵

简单的理解,上图中的斜切矩阵,在y方向上没有变动,所以y' = y,在x方向上,所有的数值都向正方向移动了a,所以 x' = x + ax(注意这里a是倍数!)
旋转矩阵
需要注意的是,旋转矩阵通常默认都是以坐标原点作为pivot,旋转方向为逆时针(CCW)。
旋转矩阵的简单推导验证

取方形右下角{1, 0},旋转后坐标为{cosθ, sinθ},得出矩阵中 A = cosθ,C = sinθ;
相应的,取左上角{0, 1},旋转后的坐标为(-sinθ, cosθ),得出矩阵中 B = -sinθ,D = cosθ。

到这里其实已经发现了线性变换的共性,即[目标坐标] = [矩阵]*[当前坐标]

以上都是解决围绕原点的问题,假如要实现如下的位移变换呢?

此时回顾一下线性变换矩阵
会发现无论在任何情况下,都无法得到以上位移变换,也就是说,位移变换并不是线性变换!

那么有没有办法依然能够通过 [单一矩阵]*[坐标] 的形式来同时描述位移变换呢?有!这里我们要引入齐次坐标。
齐次坐标 w
齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为p' =M*p的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。
结合之前的案例,相当于在原本2*2的矩阵上再增加一个维度变为3*3,返回结果如下

这时候考虑到向量的平移是不会变的,所以点的平移和向量的平移要区别对待,即

简单理解,当齐次坐标补位值为1,则为向量,0则为点。

如果出现两个点相加为2,则/2进行归一化处理,返回值为笛卡尔坐标系中的中点坐标。
那么,我们常规意义上的仿射变换就可以统一用如下矩阵来表示:

所以,这里就可以解释为什么要用4*4的矩阵来描述三维空间内的转换了。
如何解读矩阵?

逆变换

简单的理解,逆变换就像是逆向动力学,而求逆矩阵的方法也很简单,矩阵和逆矩阵相乘结果为单位矩阵。
M*M-1=
矩阵变换次序很重要!!!

由于旋转矩阵始终是以原点为轴心,先平移后旋转会出现不合理的位移,所以矩阵一定是先旋转,后平移。
另外,由于行列式特殊的计算方式,矩阵相乘是不满足交换律的。但是!多矩阵相乘可以添加在左侧,如下

从这个角度看,矩阵的结合律其实就相当于左乘,复杂的矩阵变换就可以变成 矩阵变换互相作用*坐标

一个思考
如何让一个物体围绕一个特定的点来旋转??

核心是要拆分运动,首先使用位移矩阵挪到原点,然后作用旋转矩阵,最后再用反向位移矩阵恢复坐标c,完成!
整个过程中的核心是对旋转点c的定义。
相应的,在三维坐标中添加齐次坐标后就是我们常说的4*4矩阵了,作用方式同上述二维空间变换。

一个思考!
了解到旋转矩阵的使用方法后,此时如果有图像逆时针旋转θ角,则为
Rθ=
那么旋转-θ呢?(画个图看一下就能推出来了)
R-θ=
此时观察两个矩阵之间的关系,得出旋转-θ的矩阵就是旋转θ的转置(行列对换)
R-θ = RθT
另,根据定义,旋转-θ的和旋转θ应该是互逆的,也就是
R-θ = Rθ-1
所以得出最终结论====>
旋转矩阵的逆 = 旋转矩阵的转置
Rθ-1 = RθT
也就是常说的正交矩阵。
三维呢?
类似的,在三维状态下的矩阵,也需要齐次坐标


然而在旋转矩阵中,情况有所不同

为什么Ry和其他两个轴不一致?
因为在三维状态下,按照右手螺旋定则,如果是X*Z,得到的是Y方向的反方向,所以需要取-θ。
刚刚在二维空间中已经论证过了旋转θ和-θ的转置和互逆关系,所以Y轴旋转需要求转置矩阵。
传说中的欧拉角旋转

然而,有一种特殊情况,是欧拉角的bug——Gimbal Lock(万向节死锁)。
简单的理解,因为旋转矩阵的计算方式是有次序的(通常是以zyx为顺序而不是xyz),动态欧拉角会出现两个旋转轴在某个过程中重合的情况,此时就会有一个维度的消失。
在这个链接中有详细且直观的解释https://v.youku.com/v_show/id_XNzkyOTIyMTI=.html
另,一种旋转状态可能对应多种欧拉角甚至无数种。

所以也就有了罗德里格斯旋转公式

以及
大恶魔——“四元数”Quaternion!
关于四元数需要太多的先导学习,需要一整节来整理。
先来一个网站https://eater.net/quaternions
非常交互式的理解四元数,非常非常推荐阅读观看!
网友评论