平常在开发中,我们通过Transform组件进行坐标的变换。但是有时候我们需要自己通过计算来变换坐标。这个时候我们就要会使用Unity中关于变换矩阵的构建。

比如,我们需要把局部坐标变换成世界坐标。这样我们就能把计算放在ComputerShader中进行计算。那么,如何构建这个变换的坐标系统呢。

首先,我们需要自动位移,旋转,缩放这几个变换矩阵的公式,我们可以在网上直接找到这几个公式,我们拿来直接使用。

位移矩阵

旋转矩阵

缩放矩阵

变换矩阵 = 位移 x 旋转 x 缩放。

我们需要注意矩阵的阅读是从右到左,所以是先缩放变换,再旋转变换,再位移变换,这个顺序很重要。

Vector3 dir = (d - transform.position).normalized;
        if(dir != Vector3.zero)
        {
           float cos = Vector3.Dot(Vector3.forward , dir);
           Vector3 sd = Vector3.Cross(Vector3.forward, dir).normalized;
           float xxx = sd.normalized.y;
           float sin = (xxx / Mathf.Abs(xxx))*Mathf.Sin(Mathf.Acos(cos));

           Matrix4x4 mat = new Matrix4x4();
           mat.m00 = cos;
           mat.m01 = 0;
           mat.m02 = sin;
           mat.m03 = 0;

           mat.m10 = 0;
           mat.m11 = 1;
           mat.m12 = 0;
           mat.m13 = 0;

           mat.m20 = -sin;
           mat.m21 = 0;
           mat.m22 = cos;
           mat.m23 = 0;

           mat.m30 = 0;
           mat.m31 = 0;
           mat.m32 = 0;
           mat.m33 = 1;

           transform.localRotation = Quaternion.LookRotation(dir);
           Matrix4x4 mat2 = new Matrix4x4(new Vector4(1,0,0,0), new Vector4(0, 1, 0, 0), new Vector4(0, 0, 1, 0), new Vector4(transform.position.x, transform.position.y, transform.position.z,1));
           Matrix4x4 mat3 = mat2 * mat;
           Vector3 f = mat3.MultiplyPoint(transform.GetChild(1).transform.localPosition);
           Debug.Log("AAAAAA:"+f);
           Debug.Log("BBBBBB:"+transform.GetChild(1).transform.position);

这里只用了Y旋转,然后验证是否变换能得到正确的值,可能我们再某些时候能用到,这里先记录一笔,免得以后再测试这个组装顺序。