【游戏开发3D数学笔记】4.矩阵和线性变换

一.不同变换的矩阵推导


  • 旋转
        在前文知道旋转矩阵的行向量就是旋转后的坐标系的基向量。2D中绕原点的旋转只有一个参数,角度θ,它描述了旋转量。逆时针旋转经常(不是必须)被认为是正方向,顺时针方向是负方向。如下图,我们很容易得到旋转后的基向量,从而得到旋转矩阵:



2D旋转矩阵

R(θ)=[pq]=[cosθsinθsinθcosθ]

        在3D中,绕坐标轴旋转,而不是绕点旋转,此时首先需要定义的是何为旋转正方向:
        左手坐标系中定义此方向的规则为左手法则。首先,要明确旋转轴指向哪个方向。当然,旋转轴在理论上是无限延伸的,但我们还是要认为它有正端点和负端点。与笛卡尔坐标轴定义坐标系相同,左手法则是这样的:伸出左手,大拇指向上,其余手指弯曲。大拇指指向旋转轴的正方向,此时,四指弯曲的方向就是旋转的正方向。如下图:


        下面是分别以 x,y,z 轴旋转 θ 角度的旋转矩阵:(矩阵行向量是变换后的坐标系的基向量)

3D旋转矩阵

x:Rx(θ)=1000cosθsinθ0sinθcosθy:Ry(θ)=cosθ0sinθ010sinθ0cosθz:Rz(θ)=cosθsinθ0sinθcosθ0001


        在3D中还可以绕任意轴的旋转。因为不考虑平移,这里的轴一定是通过原点的。这里我们不给与证明,需要看数学证明的可以看这里,下面给出旋转矩阵:( n,θ )


3D绕任意轴旋转矩阵

R(n,θ)=pqr=nx2(1cosθ)+cosθnxny(1cosθ)nzsinθnxnz(1cosθ)+nysinθnxny(1cosθ)+nzsinθny2(1cosθ)+cosθnynz(1cosθ)nxsinθnxnz(1cosθ)nysinθnynz(1cosθ)+nxsinθnz2(1cosθ)+cosθ



  • 缩放

        我们可以通过让比例因子k按比例放大或缩小来缩放物体。如果在各方向应用同比例的缩放,并且沿原点“膨胀”物体,那么就是均匀缩放。均匀缩放可以保 持物体的角度和比例不变。如果长度增加或减小因子k,则面积增加或减小k^2。在3D中,体积将增加或减小 k^3。
        如果需要“挤压”或”拉伸”物体,在不同的方向应用不同的因子即可,这称作非均匀缩放。非均匀缩放时,物体角度将发生变化。视各方向缩放因子的不 同,长度、面积、体积的变化因子也各不相同。
        如果|k|<1,物体将“变短”;如果|k|>1,物体将“变长”,如果k = 0,就是正交投影,如果k < 0就是镜像。应用非均匀缩放的效果类似于切变,事实上,非均匀缩放和切变和很难区分的。

沿坐标轴缩放矩阵

2D:S(kx,ky)=[pq]=[kx00ky]3D:S(kx,ky,kz)=pqr=kx000ky000kz


        同样,沿着任意方向的缩放要更加复杂一点,不过我们还是可以通过将原向量按照缩放方向分解成沿着缩放方向和垂直缩放方向,然后只需要缩放沿着缩放方向的分支然后再合成。如下图:



        具体的证明可以参照此处:这里,最后缩放矩阵如下:

沿任意轴缩放矩阵

2D:S(n,k)=[pq]=[1+(k1)nx2(k1)nxny(k1)nxny1+(k1)ny2]

3D:S(n,k)=pqr=1+(k1)nx2(k1)nxny(k1)nxnz(k1)nxny1+(k1)ny2(k1)nzny(k1)nxnz(k1)nynz1+(k1)nz2


  • 正交投影

        一般来说,投影意味着降维操作,有一种投影方法是在某个方向上用0作为缩放因子。这种情况下,所有点都被拉平至垂直的轴(2D)或平面(3D)上。 这种类型的投影称作正交投影(或者平行投影),因为从原来的点到投影点的直线相互平行。
        通过使垂直方向上的缩放因子为零就能达到正交投影的目的:

沿坐标轴正交投影矩阵

x2DPx=S([01],0)=[1000](S())
y2DPx=S([10],0)=[0001]

沿坐标平面正交投影矩阵

xy3DPxy=S([001],0)=100010000
xz3DPxz=S([010],0)=100000001
yz3DPyz=S([100],0)=000010001

向任意直线或者平面投影(n为投影方向)

线2DP(n)=S(n,0)=[1nx2nxnynxny1ny2]
3DP(n)=S(n,0)=1nx2nxnynxnznxny1ny2nznynxnznynz1nz2


  • 镜像投影

        镜像也叫做反射,与正交投影相似,正交投影将缩放值k设为0,而镜像则设为-1。



沿任意轴镜像的矩阵(轴过原点)

2D:P(n)=S(n,1)=[12nx22nxny2nxny12ny2](S())

3D:P(n)=S(n,1)=12nx22nxny2nxnz2nxny12ny22nzny2nxnz2nynz12nz2


  • 切变

        。切变是坐标系的变换,非均匀的拉伸。切变时候,角度变化,但是面积或体积不变。也可以理解为坐标轴间的角度变化,造成的扭曲。
如下图,这是x坐标根据y坐标的切变,机器人的y坐标没有变化,只有x坐标变化了,变化后的坐标x’可以理解为将y坐标乘以切变因子s与原坐标x的和: x=x+sy 。如果是3D则增加z坐标的切变因子 tx=x+szy=y+tz

切变矩阵

2D:Hx(s)=[1s01]Hy(s)=[10s1](HxxyHy)

3D:Hxy(s)=10s01t001Hxz(s)=1s00100t1Hyz=100s10t01

        切变是一种很少用到的变换,它也被称作 扭曲变换。 包含切变与缩放(均匀或非均匀)的变换通常很容易与包含旋转与非均匀缩放(只能是非均匀)的变换发生混淆。


二.变换的分类

  • 1.线性变换

F(a+b)=F(a)+F(b)F(ka)=kF(a)F(a)线

F(a)=aM,MF线


        所以,根据上面的结论我们知道,以上我们提到的变换都是线性变换;但是有一个可能出乎意料的事实:平移不是线性变换

  • 2.仿射变换

v=vM+b仿


        平移作为最常用的变换之一,然而却不是线性变换;所以为了包括平移变换提出了仿射变换。仿射变换是指线性变换后接着平移。因此,仿射变换的集合是线性变换的超集,任何线性变换都是仿射变换,但不是所有的仿射变换都是线性变换。事实上,可能有的人会觉得平移也可以由一个矩阵变换得到,如下:

(0,0)(1,0):[xy1]101010001=[x+1y1]

        当然,这并不意味着平移变换就是线性变换了,事实上:增加一个维度之后,就可以在高维度通过线性变换来完成低维度的仿射变换。对于高维度来说只是经历了一次切变+投影变换就可以实现低维度的平移。查看更多

  • 3.可逆变换


        如果存在一个逆变换可以”撤销”原变换,那么称这个变换是可逆的。存在非仿射变换的可逆变换,不过暂不考虑它们;我们知道仿射变换是线性变换加上平移,对于平移我们肯定是可以通过相反的量来撤销;所以对于一个仿射变换是否可逆,只需要看它的线性变换是否可逆。
        在上面的所有变幻中,除了投影变换,其他变换都能”撤销”。当物体被投影时,某一维度的有用信息被抛弃了,所以这些信息是没法恢复的。

  • 4.等角变换

        如果变化前后两个向量的夹角大小和方向都不改变,该变换是等角的。
        只有平移,旋转和均匀缩放是等角变化,而镜像变换会改变夹角的方向。

  • 5.正交变换

        正交变换的基本思想是保持轴相互垂直,并且不进行缩放变换。
        平移,旋转,镜像是仅有的正交变换。正交变换中:长度、角度、体积、面积都是不会发生改变的!!

  • 6.刚体变换

        刚体变换是只改变物体的位置和方向,不包括形状。
        平移,旋转是仅有的正交变换。所有的刚体变换都是正交、等角、可逆和仿射的!!

三.变换类别的关系

变换线性仿射可逆等角正交刚体等长等面积行列式
线性YY
仿射Y
可逆Y≠0
等角YYY
正交YYY ±1
刚体YYYYYYY
平移YYYYYYY
旋转YYYYYYYY1
均匀缩放YYYY KN
非均匀缩放YYY
正交投影YY0
镜像YYYYYY-1
切变YYYY1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值