文章目录
前言
近期由于项目需求,研究了一下通过矩阵来转换不同坐标系,接下来就简单记录一下。
一、矩阵 Matrix4x4?
UnityEngine.Matrix4x4 是 Unity 提供的方便矩阵计算而封装的一个结构体,提供了很多相对便于日常开发的函数。除了 官方API 之外,相信网上有很多关于这个矩阵的定义的解释了,这里就不介绍了,给个 友情链接 吧。
这里我们结合一个具体例子来看吧:我们想知道一只蚂蚁在一个很大的球上的可视范围(别和我纠结蚂蚁的视力问题啊!)。
二、应用过程
1、案例分析
首先,我们能确定的是,蚂蚁在球面上是相对于球面有一个偏转的。所以,蚂蚁自身是有一个 “模型空间坐标系”的,同时,不可避免的,蚂蚁也处于另外的一个“Unity世界空间坐标系”中。在Unity中,蚂蚁的位置是相对世界空间坐标系来说的。
我们想知道蚂蚁的可视范围,可以想到的方式有,以蚂蚁为圆心,向四周打一圈射线,判断碰撞,得出可视范围,可以此绘制出Mesh。
2、函数介绍
Matrix4x4.TRS
该函数可用于构建旋转矩阵。三个参数分别为位置、旋转与缩放。上述案例中,世界空间坐标系为标准三维空间坐标系,而模型空间坐标系可以用蚂蚁的位置与旋转来表示。
Matrix4x4.MultiplyVector
上述旋转矩阵中,该函数可用于转换世界空间坐标系中的向量至模型空间坐标系。
Matrix4x4.MultiplyPoint
上述旋转矩阵中,该函数可用于转换世界空间坐标系中的坐标点至模型空间坐标系。
Matrix4X4.inverse
矩阵的逆。可获取该矩阵的逆矩阵。结合上面两个函数,我们就可转换模型空间坐标系中的信息至世界空间。
Matrix4X4.rotation
用于获取该旋转矩阵中的旋转四元数。可以乘以另一个四元数以获取它在另一个坐标系下的表示。
public bool isPoint;
public bool inverse;
public Transform orgCoor; // 原始坐标系
public Transform newCoor; // 新坐标系
public Transform tranOrg; // 原始位置
public Transform tranNew; // 转换后的位置
/// <summary>
/// 转点
/// </summary>
private void MultiplyPoint()
{
Matrix4x4 matrix4X4 = Matrix4x4.TRS(newCoor.position, newCoor.rotation, newCoor.localScale);
if (!inverse)
tranNew.position = matrix4X4.MultiplyPoint(tranOrg.position);
else
tranNew.position = matrix4X4.inverse.MultiplyPoint(tranOrg.position); // 这里的 position 依然是相对于世界空间坐标系(orgCoor)来说的
//Vector4 a = matrix4X4.inverse * (tranOrg.position);
}