矩阵笔记¶
Matrix4x4¶
- 在unity shader中,矩阵元素的填充是
按行优先填充的 - 在Matrix4x4中,是
按列优先填充的Matrix4x4中,
matrix.m12这个表示第一行二列,

//一个带有由所传递的平面坐标定义的视锥截面的投影矩阵
public static Matrix4x4 Frustum(float left, float right, float bottom, float top, float zNear, float zFar);
//构造正交矩阵(这个在之前的贴花着色器脚本代码中用到过)
public static Matrix4x4 Ortho(float left, float right, float bottom, float top, float zNear, float zFar);
//构造透视投影矩阵
public static Matrix4x4 Perspective(float fov, float aspect, float zNear, float zFar);
//构造旋转矩阵
public static Matrix4x4 LookAt(Vector3 from, Vector3 to, Vector3 up);
public static Matrix4x4 Rotate(Quaternion q);
//构造缩放矩阵
public static Matrix4x4 Scale(Vector3 vector);
//从位置,旋转,缩放构建矩阵
public static Matrix4x4 TRS(Vector3 pos, Quaternion q, Vector3 s);
//转置
public Matrix4x4 transpose { get; }
//是否为单位矩阵
public bool isIdentity { get; }
//行列式
public float determinant { get; }
//逆
public Matrix4x4 inverse { get; }
LookAt 实现¶
/// <summary>
/// LookAt
/// 同时也是基变换的一种矩阵
/// </summary>
/// <param name="from">eye</param>
/// <param name="to">target</param>
/// <param name="up"></param>
/// <returns></returns>
public static Matrix4x4 LookAt(Vector3 from,Vector3 to,Vector3 up)
{
// link: https://learnopengl-cn.github.io/01%20Getting%20started/09%20Camera/
Vector3 z=Vector3.Normalize(to-from); // cam dir , cam forward 前(z轴)
Vector3 x=Vector3.Normalize(GeometryTools.Cross(up,z)); // cam right dir 右(x轴)
Vector3 y=GeometryTools.Cross(z,x); // cam up dir 上(y轴)
Matrix4x4 mat=new Matrix4x4();
mat.SetColumn(0,x);
mat.SetColumn(1,y);
mat.SetColumn(2,z);
mat.SetColumn(3,new Vector4(from.x,from.y,from.z,1));
return mat;
}