本人第一次写博文,不足的地方请大家指出来,我不会详解它的计算是什么样的,因为同类文章有很多,这个如果读者感兴趣可以自己学习一下相关的手册和知识。
简单的说,矩阵就是一个4*4的二维数组,在Unity中为结构体,Matrix4x4就是Unity中的矩阵,你可以通过这个结构体来申请一个矩阵,当然这是个三维矩阵。
1.矩阵每一列的意义:
如果是一个单位正交矩阵,那么在Unity中他就是这样的
如果这是一个游戏物体的变换矩阵,那么就可以得出以下信息,
1.该游戏物体的X,Y,Z,轴的方向与世界坐标系的X,Y,Z轴的方向保持一致,简单的来说,该物体相对于世界坐标系没有发生任何旋转;
2.该物体的在世界坐标系中的坐标为(0, 0, 0)。
矩阵的作用:
接下来介绍Matrix4x4结构体(当然我不会把所有的方法和变量都讲出来,我会说一些我们可能会经常用到的方法或者变量):
1.变量:
Rotation:这里的Rotation是对应Transform组件里的Rotation的,也就是说,你可以通过重构旋转矩阵来得到一个Rotation并且运用到任意一个游戏物体上;
lossyScale:你可以通过这个值来得到一个矩阵所代表物体的尺寸大小;
inverse:倒置,你可以用这个变量来获取一个矩阵的倒置矩阵。
2.函数:
public Matrix4x4(Vector4 column0, Vector4 column1, Vector4 column2, Vector4 column3) :通过该构造函数来构造出一个自己的矩阵;
public static Matrix4x4 Inverse(Matrix4x4 m) : 获取一个矩阵的倒置矩阵。
我之前说过,矩阵矩阵中每一列的含义,接下来我会在Unity中证明这些含义的真确性:
1.前三列的意义:
如果把矩阵的前三列拿出来,每一列数据都可以组成一个Vector3变量,这三个变量分别代表了,物体的X,Y,Z轴的方向,也就是物体的自身坐标系;
这是我重构了一个物体的矩阵后,再将该矩阵的前三列值取出,组成三个单位向量,再使用Debug.DrawRay进行绘制而得到的,你可以很清楚的看的根据前三列值所构建出的方向向量会和物体的坐标轴朝向保持一致。
下面是代码:
matrix = new Matrix4x4(this.transform.right, this.transform.up, this.transform.forward, new Vector4(0, 0, 0, 1));
Debug.DrawRay(Vector3.zero, new Vector3(matrix[0, 0], matrix[1, 0], matrix[2, 0]).normalized, Color.red);
Debug.DrawRay(Vector3.zero, new Vector3(matrix[0, 1], matrix[1, 1], matrix[2, 1]).normalized, Color.green);
Debug.DrawRay(Vector3.zero, new Vector3(matrix[0, 2], matrix[1, 2], matrix[2, 2]).normalized, Color.blue);
构建矩阵的原则:
1. Matrix4x4结构体的构造方法会接收4个Vector4的值,把他们对应到物体,这4个值分别代表物体的·
X,Y,Z轴的方向向量(Vector3会隐式转化为Vector4变量),且前三个向量必须为标准正交基向量,以及一个位置信息,完成上述操作你就可以获取当前的Rotation值,当然是通过你构建的这个矩阵。
注意:Matrix4x4构造函数的第四个变量是一个Vector4变量,且必须是它,因为要保持矩阵的对角线上的值不为0,否则在进行矩阵计算时会出现错误,导致不能得到正确的结果。
2. 填入的向量必须是一组标准正交基。
注意:也许你会说,我做的是一个废操作,因为矩阵在初始化是就会把对应的值填入,所以即使不用矩阵去做,直接用自身的三个方向作为方向输出结果还是一样的,其实这是不同的,如果你明白了这矩阵前三列代表的意义,你就可以随时构建一个任意方向的变换。这也与我文章的主题相符合。
这是我第一篇文章,这篇文章写的是我对矩阵的理解与运用,重在运用上,希望可以帮读者加快对矩阵的理解,我翻阅了一下网上的文章,大多数文章讲的都太过繁琐,因为毕竟不是每个人的数学水平都很好,所以我在文中没有写一段数学计算,以我自己的经验看,摆出数学公式,不仅不会对自己的理解有帮助,反而会增加自己的疑虑,所以我选择了一个简单粗暴的方式,直接拿出值去试,事实证明是有效果的。如果有写得不够好的地方请尽管提出,但是如果你说我误导人的话,那我就会骂你祖宗十八代的,因为以我实践效果看是没有问题的。可能有不合适的一些话,我会积极改正。