MultiplyVector方法

该方法的功能是用来对方向向量v进行矩阵变换,当矩阵与v进行变换时,只是对v的方向进行转换。那么系统就会对参与变换的Matrix4x4矩阵M进行特殊处理。

例如:经过系统处理后就变为

其中n002 + n102 + n202 = 1,n012 + n112 + n212 = 1,n022 + n122 + n222 = 1。此处以DirectX为例。在DirectX中向量的变换时v.M,而在OpenGL中向量的变换形式是M.v。

看下面的例子

using UnityEngine;
using System.Collections;

public class MultiplyVector_ts : MonoBehaviour {

    public Transform tr;
    Matrix4x4 mv0 = Matrix4x4.identity;
    Matrix4x4 mv1 = Matrix4x4.identity;
    // Use this for initialization
    void Start () {

        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);
    }
    
    // Update is called once per frame
    void Update () {

  
    }

    void OnGUI()
    {
        if(GUI.Button(new Rect(10.0f,10.0f,120.0f,45.0f),"方向旋转30度"))
        {
            tr.position = mv1.MultiplyPoint(tr.position);
            Vector3 tmp = new Vector3(10.0f, 0.0f, 0.0f);
            Vector3 v = mv0.MultiplyVector(tmp);
            Debug.Log("变换前的模长: " + tmp.magnitude);
            Debug.Log("变换后的向量: " + v);
            Debug.Log("变换后的模长: " + v.magnitude);
        }
    }
}

运行结果

从上面的例子中我们可以证明,使用MultiplyVector方法只是改变了向量的方向,但其模的大小并未改变。

关于代码中出现的SetTRS方法说明一下,该方法的功能是可以重设Matrix4x4矩阵。

函数原型为

//pos为位置向量,q为旋转角,s为放缩向量
public void SetTRS(Vector3 pos,Quaternion q,Vector3 s);

例如

Matrix4x4 m1 = Matrix4x4.identity;
m1.SetTRS(pos,q,s);
Vector3 v2 = m1.MultiplyPoint3x4(v1);

则v2的值等同于将v1的position增加pos,rotation旋转q,scale放缩s后的值。

原文地址:https://www.cnblogs.com/tgycoder/p/5101790.html