矩阵的线性变换可以分为:旋转,缩放,投影,镜像,切变等。每一种线性变换对应着相应的矩阵。
旋转
- 2D旋转:a为行向量,M为变换矩阵,b为变换后的向量。
aM=b
可以看见x轴的单位向量p(1,0)旋转了θ角度以后变成了(cosθ,sinθ),y轴的单位向量q(0,1)旋转了θ角度以后变为了(-sinθ,cosθ)。
那我们现在可以开始构建我们的旋转矩阵(2D):
第一行控制x轴的单位向量的旋转(cosθ,sinθ)
第二行控制y轴的单位向量的旋转(-sinθ,cosθ)
如果是3D的旋转呢?
这时我们就要区分是左手坐标系,还是右手坐标系了,因为不是的坐标系旋转的方向不是不同的,通过左手法则来判断旋转方向。(我们一般都是围绕坐标轴进行旋转)
这时我们如果要进行旋转就要先判别是绕着哪一个坐标系进行旋转。
绕x轴进行3D旋转
绕y轴进行3D旋转
绕z轴进行3D旋转
当然你也可以绕任意轴旋转(但计算量会相当的复杂,计算机中最能理解的旋转还是需要欧拉角进行旋转)
我们为什么在程序设计中会使用坐标轴旋转而不使用任意轴旋转呢?:
以这个机器人为例,这个机器人由无数个点组成,当我们需要旋转它的时,如果每一个点都需要用这么复杂的公式来计算的话会非常的慢。
编程的实现:
- 首先在头文件中类的成员方法里定义一个方法代表旋转的线性变换。
- 接着在源文件中进行实现
- 由于会频繁的使用到sin和cos我们这里在MathUtil头文件中将它封装好在进行使用。