一、为什么学习变换
-
模型变换:
-
translation 移动
-
scale 缩放
-
rotation 旋转
-
-
光栅化成像,从三维空间到二维平面——投影。
二、 2D 变换
2.1 Scale 缩放
2.2 Reflection 反转
2.3 Shear 切变
观察可知,y值不变,x可根据相似三角形推出x'=a*y
- x'=x+ay
- y'=y
2.4 Rotate 旋转
- 默认原点为中心,逆时针(CCW)旋转
- 推导过程:
- 如图所示“ABCD矩阵”为所求矩阵
- 代入特殊点,(1,0)->(cosθ,sinθ),得到A=Cosθ,C=Sinθ
- 与2同理,取特殊点(0,1)->(-sinθ,cosθ),得到B= -sinθ,D=cosθ
- 综上,将A、B、C、D代入上述矩阵,可得:
- 如图所示“ABCD矩阵”为所求矩阵
旋转的性质:
- 应用:旋转的转置等于旋转的逆,如果我们相求一个旋转操作的逆操作,即往相反方向旋转,可以求正向旋转矩阵的转置。
- 数学上,我们把逆与转置的矩阵成为正交矩阵
线性变换
Linear Transforms
定义:能够用一个矩阵乘以输入的坐标从而得到输出坐标,这种变换成为线性变换。
- x'可以写成a与b的线性组合
- y’可以写成c与d的线性组合
从而可以写成如上图的矩阵形式, 注意矩阵的维度与向量的维度相同(为后续引入齐次坐标铺垫)
前面的缩放(scale、反转(reflection)、切变(shear)、旋转(rotate),都是类似形式,属于线性变换。
2.5 Translation 平移
非线性变换
无法写成上述统一的矩阵形式,特殊处理不利于计算,因此使用齐次坐标解决。
3.齐次坐标
Homogenous Coordinates
二维变换下,点、向量增加一个维度
- 2D点扩充第三维为1。(点平移后发生变化),点减点第三维为0,刚好与向量第三位符合。
- 2D向量扩充第三维为0。( 因为向量具有平移不变性)
引入齐次坐标后,我们发现又可以将平移变换写成矩阵乘以向量的表现形式了。
point+poing结果为两点的中点,
- 因为:对于任何的点(x,y,w)可以通过整个点除以w得到(x/w,y/w,1)**,
- 所以:两个点相加:
4.仿射变换
仿射变换:线性变换+平移,可用齐次坐标表示
在齐次坐标下,abcd表示线性变换矩阵(缩放、反转、切变、旋转),tx和ty则表示平移变换(非线性变换),齐次坐标用一个矩阵统一了所有操作。
5、逆变换(逆矩阵)Inverse Transform
逆变换的数学形式表现为逆矩阵左乘向量/点:
(M^-1)*(x',y',w)
6、组合变换
目标
方法:
-
先平移后旋转(默认绕原点)
-
先旋转后平移
-
因此可知:
- 复杂的变化可以通过一系列简单变换得到。
- 变换的顺序十分重要,矩阵乘法不满足交换律。
应用变换矩阵,应从右往左计算(左乘),如下图先旋转45度得到M1,再平移得到M2
- 合成变换
矩阵具有结合律,对于一系列变换矩阵,可以先求这些矩阵相乘结果得到一个矩阵,再乘以向量,可以实现一个矩阵表示非常复杂的变换。
- 分解变换
example: 绕点C旋转
- 先把所有的点延着-c方向移动到原点
- 旋转a角度
- 把所有的点延着c方向移动
7、三维变换
由二维同理延伸
4x4矩阵表示,左上角3x3表示线性变换,tx,ty,tz表示平移。
- 顺序 :与二维一致,先应用线性变换,再平移
缩放、平移
绕轴旋转
注意:第二个矩阵,正负号不同,是因为ZxX得到Y,而不是XxZ(右手螺旋定则)
旋转分解:
- α β γ分别对应roll pitch yaw(欧拉角)
罗德里格斯旋转公式:
- 旋转轴 n 是过原点的,也就是起点在原点上,方向是n这个方向,旋转角度为α
四元数:为了方便插值计算而设计
小结:
本节课从二维变换出发,介绍了缩放、反转、切变、旋转之线性变换,以及平移之非线性变换,为了统一表示及方便计算,通过增加一维的方式,引入了齐次坐标后,可以统一使用一个变换矩阵表示线性变换以及非线性变换,线性变换和非线性变换统称为仿射变换。 三维变换可由二维变换推广得到,原理相似。
注意:
- 齐次坐标矩阵表示变换的顺序,先应用线性变换,再应用非线性变换。
- 应用齐次坐标,可以对变换进行合成与分解,并且在介绍这一过程中,引入了罗德里格斯旋转公式
另外,阐述了变换的逆操作与矩阵的逆之间的关系,对于旋转矩阵,矩阵的转置等于矩阵逆,这也是正交矩阵的性质,可以通过求矩阵的转置来求矩阵的逆,从而进行变换的逆操作。
更多
CocosCreator3.4.2原生二次开发的正确姿势——手把手教你接SDK
关于作者
我是羽毛,一名游戏研发工程师,一名野生摄影同学。我的公众号主要分享自己的一些游戏项目开发过程中的功能总结及日常开发笔记。也希望能通过平台的交流,与更多有想法的同学交流认识,共同成长。
欢迎大家在日常开发过程中,如果觉得有需要讨论解决、分享或者探讨的内容,在公众号后台或者文章留言处给我反馈,提供写作的方向,从另一个角度也尽量让写作内容更贴近大家的需求以及痛点,在此谢谢各位同学.
另外羽毛也提供付费技术咨询的服务,有需求的同学可以公众号后台私信添加微信。
今日技能你学废了吗?
更多精彩欢迎关注微信公众号“羽毛不会飞”
本文由mdnice多平台发布