矩阵变换和Matrix4x4

平移

var m = Matrix4x4.Translate(new Vector3(10, 20, 30));
Debug.Log($"{m}");

 

 

缩放

var m = Matrix4x4.Scale(new Vector3(1, 2, 3));
Debug.Log($"{m}");

 

 

旋转

只有x轴

var m = Matrix4x4.Rotate(Quaternion.Euler(30, 0, 0));
Debug.Log($"{m}");

 

只有y轴

var m = Matrix4x4.Rotate(Quaternion.Euler(0, 30, 0));
Debug.Log($"{m}");

 

x+y轴

var m = Matrix4x4.Rotate(Quaternion.Euler(30, 30, 0));
Debug.Log($"{m}");

 

只有z轴

var m = Matrix4x4.Rotate(Quaternion.Euler(0, 0, 30));
Debug.Log($"{m}");

 

 

复合变换

变换的顺序是scale -> rotate -> translate,先在原点缩放,再在原点旋转,最后再平移。因为Matrix4x4.Scale, Matrix4x4.Rotate都是针对原点进行变换的,如果平移放在最前面,得到的结果就不对了。

写成TRS是因为Unity中的矩阵都是左乘来叠加变换,即越早的变换越在右。

var m = Matrix4x4.TRS(new Vector3(10, 20, 30), Quaternion.Euler(0, 90, 0), new Vector3(1, 2, 3));
Debug.Log($"{m}");

关于为啥是TRS这个顺序:读书笔记---MVP矩阵之M矩阵 - 简书 (jianshu.com)

 

localToWorldMatrix的计算原理

unity中变换矩阵是左乘来叠加效果的,对于向量也是向量在右、矩阵在左。

public static Matrix4x4 MyLocalToWorldMatrix(Transform tf)
{
    var m = Matrix4x4.TRS(tf.localPosition, tf.localRotation, tf.localScale);
    var tmpTransform = tf.parent;
    while (null != tmpTransform)
    {
        m = Matrix4x4.TRS(tmpTransform.localPosition, tmpTransform.localRotation, tmpTransform.localScale) * m; //矩阵左乘叠加
        tmpTransform = tmpTransform.parent;
    }
    return m;
}

 

 

参考 

UnityShader笔记第三课-MVP矩阵原理-M矩阵_啊基米德的博客-CSDN博客

图形学知识基础:变换与矩阵的关系,齐次坐标_王王王渣渣的博客-CSDN博客 

unity中Transform.LocalToWorldMatrix的计算与验证_一个渣渣的世界的博客-CSDN博客

posted @ 2023-02-23 00:41  yanghui01  阅读(309)  评论(0编辑  收藏  举报