首页 > 代码库 > Unity API 解析(6)—— Matrix4x4 类

Unity API 解析(6)—— Matrix4x4 类

通常用在如摄像机的非标准投影变换等

 

MultiplyPoint 方法 —— 投影矩阵变换

对点v进行投影矩阵变换

主要用于Camera的投影变换,对于一般物体的矩阵变换用MultiplyPoint3x4方法,不涉及投影变换,计算速度更快

MultiplyPoint3x4 —— 矩阵变换

MultiplyVector 方法 —— 矩阵变换

对方向向量v进行矩阵变换

using UnityEngine;using System.Collections;public class MultiplyVector_ts : MonoBehaviour{    public Transform tr;    Matrix4x4 mv0 = Matrix4x4.identity;    Matrix4x4 mv1 = Matrix4x4.identity;    void Start()    {        //分别设置变换矩阵mv0和mv1的位置变换和角度变换都不为0        mv0.SetTRS(Vector3.one * 10.0f, Quaternion.Euler(new Vector3(0.0f, 30.0f, 0.0f)), Vector3.one);        mv1.SetTRS(Vector3.one * 10.0f, Quaternion.Euler(new Vector3(0.0f, 0.6f, 0.0f)), Vector3.one);    }    void Update()    {        //用tr来定位变换后的向量        tr.position = mv1.MultiplyVector(tr.position);    }    void OnGUI()    {        if (GUI.Button(new Rect(10.0f, 10.0f, 120.0f, 45.0f), "方向旋转30度"))        {            Vector3 v = mv0.MultiplyVector(new Vector3(10.0f, 0.0f, 0.0f));            //打印旋转后的向量,其方向发生了旋转            Debug.Log("变换后向量:"+v);            //打印旋转后向量的长度,            //尽管mv0的位置变换不为0,但变换后向量的长度应与变换前相同            Debug.Log("变换后向量模长:" + v.magnitude);        }    }}

SetTRS 方法 —— 重设Matrx4x4变换矩阵

pos 为位置向量,q为旋转角度,参数s为缩放向量

 

 

using UnityEngine;using System.Collections;public class SetTRS_ts : MonoBehaviour{    Vector3 v1 = Vector3.one;    Vector3 v2 = Vector3.zero;    void Start()    {        Matrix4x4 m1 = Matrix4x4.identity;        //Position 沿y轴增加5个单位,绕y轴旋转45度,缩放2倍        m1.SetTRS(Vector3.up * 5, Quaternion.Euler(Vector3.up * 45.0f), Vector3.one * 2.0f);        // 也可以使用如下静态方法设置m1变换        //m1 = Matrix4x4.TRS(Vector3.up * 5, Quaternion.Euler(Vector3.up * 45.0f), Vector3.one * 2.0f);        v2 = m1.MultiplyPoint3x4(v1);        Debug.Log("v1的值o" + v1);        Debug.Log("v2的值o" + v2);    }    void FixedUpdate()    {        Debug.DrawLine(Vector3.zero, v1, Color.green);        Debug.DrawLine(Vector3.zero, v2, Color.red);    }}

Ortho —— 创建正交投影矩阵

Perspective —— 创建透视投影矩阵

using UnityEngine;using System.Collections;public class OrthoAndPerspective_ts : MonoBehaviour{    Matrix4x4 Perspective = Matrix4x4.identity;//透视投影变量    Matrix4x4 ortho = Matrix4x4.identity;//正交投影变量    //声明变量,用于记录正交视口的左,右,下,上的值    float l, r, b, t;    void Start()    {        //设置透视投影矩阵        Perspective = Matrix4x4.Perspective(65.0f, 1.5f, 0.1f, 500.0f);        t = 10.0f;        b = -t;        //为防止视图变形需要与 Camera.main.aspect 相乘        l = b * Camera.main.aspect;        r = t * Camera.main.aspect;        //设置正交投影矩阵        ortho = Matrix4x4.Ortho(l, r, b, t, 0.1f, 100.0f);    }    void OnGUI()    {        // 使用默认正交投影        if (GUI.Button(new Rect(10.0f, 8.0f, 150.0f, 20.0f), "Reset Ortho"))        {            Camera.main.orthographic = true;            Camera.main.ResetProjectionMatrix();            Camera.main.orthographicSize = 5.1f;        }        // 使用自定义正交投影        if (GUI.Button(new Rect(10.0f, 38.0f, 150.0f, 20.0f), "use Ortho"))        {            ortho = Matrix4x4.Ortho(l, r, b, t, 0.1f, 100.0f);            Camera.main.orthographic = true;            Camera.main.ResetProjectionMatrix();            Camera.main.projectionMatrix = ortho;            Camera.main.orthographicSize = 5.1f;        }        // 使用自定义透视投影        if (GUI.Button(new Rect(10.0f, 68.0f, 150.0f, 20.0f), "use Perspective"))        {            Camera.main.orthographic = false;            Camera.main.projectionMatrix = Perspective;        }        // 恢复系统默认透视投影        if (GUI.Button(new Rect(10.0f, 98.0f, 150.0f, 20.0f), "Reset  Perspective"))        {            Camera.main.orthographic = false;            Camera.main.ResetProjectionMatrix();        }    }}

Unity API 解析(6)—— Matrix4x4 类