矩阵变换和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博客