从零开始图形学 | Matrix的线性变换和位移变换

2020-11-19  本文已影响0人  大师的学徒

在图形学中矩阵统一以列矩阵的形式呈现
比如一个单列矩阵

A1=\left[ \begin{matrix} a1\\ a2\\ a3 \end{matrix} \right]
3*3矩阵
A3=\left[ \begin{matrix} a1&b1&c1\\ a2&b2&c2\\ a3&b3&c3 \end{matrix} \right]
在此之前补一个Markdown如何写矩阵的内容,感谢原贴分享!
https://blog.csdn.net/qq_38228254/article/details/79469727

图片和内容均来自GAMES101,万分感谢大神的分享! http://games-cn.org/

进入正题

线性变换包含我们常说的【缩放】【斜切】【旋转】。

PS:这里我们以2D图像为例

缩放矩阵

系数为0.5的缩放矩阵

等比即为原坐标乘以比例系数

等比缩放的矩阵形式为

\left[ \begin{matrix} x' \\ y' \end{matrix} \right] = \left[ \begin{matrix} s&0\\ 0&s \end{matrix} \right] \left[ \begin{matrix} x\\ y \end{matrix} \right] = \left[ \begin{matrix} s*x + 0*y\\ 0*x + s*y \end{matrix} \right] \ = \left[ \begin{matrix} sx \\ sy \end{matrix} \right] \
从上可以看出,不等比缩放也同样适用以上矩阵变换。

不等比矩阵对应的两个s系数不同
另,镜像矩阵其实是缩放矩阵的一种特殊形式。
镜像矩阵是系数为-1的缩放矩阵

斜切矩阵

理解斜切矩阵

简单的理解,上图中的斜切矩阵,在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θ。

二维旋转矩阵

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


线性变换公式

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

在 x 和 y 方向上位移t
此时回顾一下线性变换矩阵
\left[ \begin{matrix} x' \\ y' \end{matrix} \right] = \left[ \begin{matrix} a&b\\ c&d \end{matrix} \right] \left[ \begin{matrix} x\\ y \end{matrix} \right] = \left[ \begin{matrix} a*x + b*y\\ c*x + d*y \end{matrix} \right] \
会发现无论在任何情况下,都无法得到以上位移变换,也就是说,位移变换并不是线性变换!
位移变换是线性变换和位移向量共同作用的结果

那么有没有办法依然能够通过 [单一矩阵]*[坐标] 的形式来同时描述位移变换呢?有!这里我们要引入齐次坐标。

齐次坐标 w

齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为p' =M*p的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。
结合之前的案例,相当于在原本2*2的矩阵上再增加一个维度变为3*3,返回结果如下


返回结果正是想要的位移变换

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



简单理解,当齐次坐标补位值为1,则为向量,0则为点。
含有齐次坐标的运算法则
如果出现两个点相加为2,则/2进行归一化处理,返回值为笛卡尔坐标系中的中点坐标。

那么,我们常规意义上的仿射变换就可以统一用如下矩阵来表示:


仿射变换转变为等效的齐次坐标矩阵

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

如何解读矩阵?
二维矩阵增加齐次坐标后的解读
逆变换
逆变换工作原理

简单的理解,逆变换就像是逆向动力学,而求逆矩阵的方法也很简单,矩阵和逆矩阵相乘结果为单位矩阵。

M*M-1=\left[ \begin{matrix} 1&0&0\\ 0&1&0\\ 0&0&1 \end{matrix} \right]

矩阵变换次序很重要!!!

先平移后旋转VS先旋转后平移

由于旋转矩阵始终是以原点为轴心,先平移后旋转会出现不合理的位移,所以矩阵一定是先旋转,后平移。



另外,由于行列式特殊的计算方式,矩阵相乘是不满足交换律的。但是!多矩阵相乘可以添加在左侧,如下

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

一个思考

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

围绕特定点的矩阵旋转原理

核心是要拆分运动,首先使用位移矩阵挪到原点,然后作用旋转矩阵,最后再用反向位移矩阵恢复坐标c,完成!
整个过程中的核心是对旋转点c的定义。

相应的,在三维坐标中添加齐次坐标后就是我们常说的4*4矩阵了,作用方式同上述二维空间变换。


三维空间中的4*4矩阵

一个思考!

了解到旋转矩阵的使用方法后,此时如果有图像逆时针旋转θ角,则为
Rθ=\left( \begin{matrix} cosθ&-sinθ\\ sinθ&cosθ \end{matrix} \right)

那么旋转-θ呢?(画个图看一下就能推出来了)
R=\left( \begin{matrix} cosθ&sinθ\\ -sinθ&cosθ \end{matrix} \right)

此时观察两个矩阵之间的关系,得出旋转-θ的矩阵就是旋转θ的转置(行列对换)
R = RθT

另,根据定义,旋转-θ的和旋转θ应该是互逆的,也就是
R = Rθ-1
所以得出最终结论====>

旋转矩阵的逆 = 旋转矩阵的转置

Rθ-1 = RθT

也就是常说的正交矩阵。

三维呢?

类似的,在三维状态下的矩阵,也需要齐次坐标

三维中的齐次坐标
三维中的缩放和平移
然而在旋转矩阵中,情况有所不同
Y轴旋转有所不同
为什么Ry和其他两个轴不一致?
因为在三维状态下,按照右手螺旋定则,如果是X*Z,得到的是Y方向的反方向,所以需要取-θ。
刚刚在二维空间中已经论证过了旋转θ和-θ的转置和互逆关系,所以Y轴旋转需要求转置矩阵。

传说中的欧拉角旋转

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

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


image.png

以及

大恶魔——“四元数”Quaternion!

关于四元数需要太多的先导学习,需要一整节来整理。
先来一个网站https://eater.net/quaternions
非常交互式的理解四元数,非常非常推荐阅读观看!

上一篇下一篇

猜你喜欢

热点阅读