国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity矩陣平移旋轉(zhuǎn)縮放Matrix4x4

這篇具有很好參考價值的文章主要介紹了Unity矩陣平移旋轉(zhuǎn)縮放Matrix4x4。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Unity中的矩陣(Matrix4x4)

最近在研究幀同步定點數(shù)物理系統(tǒng)中需要自定義定點數(shù)矩陣,所以在這里分享下基礎(chǔ)的矩陣案例旋轉(zhuǎn)、平移、縮放。(注意這里本文中的transform組件式基于unity浮點數(shù)的教程并非幀同步定點數(shù))參考原文

創(chuàng)建自定義模型

Unity矩陣平移旋轉(zhuǎn)縮放Matrix4x4,Unity,unity,矩陣,unity矩陣,Matrix4x4
參數(shù)可以參考我上圖的參數(shù),這里注意三個頂點是一個面,這里我上述的模型是一個三角形的面。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Triangle : MonoBehaviour
{
    /// <summary>
    /// 網(wǎng)格
    /// </summary>
    Mesh mesh;
    
    /// <summary>
    /// 三角形頂點
    /// </summary>
    public Vector3[] vertices;

    /// <summary>
    /// 分配三角形頂點索引
    /// </summary>
    public int[] triangle;

    /// <summary>
    /// 材質(zhì)球
    /// </summary>
    public Material mat;

    private void Start()
    {
        //實例化網(wǎng)格
        mesh = new Mesh();

        //分配頂點
        mesh.vertices = vertices;

        //分配三角形頂點索引
        mesh.triangles = triangle;

        //添加網(wǎng)格過濾器
        MeshFilter mf = gameObject.AddComponent<MeshFilter>();

        //網(wǎng)格賦值
        mf.mesh = mesh;
        
        //添加網(wǎng)格渲染器
        MeshRenderer mr = gameObject.AddComponent<MeshRenderer>();
        
        //材質(zhì)賦值
        mr.materials[0] = mat;
    }
}

創(chuàng)建模型很簡單我就不細講了,看不懂的可以看上述的注釋即可,直接黏貼也可。

平移矩陣

要做位移先搞明白矩陣中的哪幾個索引值代表的坐標位置,如下圖所示4x4矩陣
Unity矩陣平移旋轉(zhuǎn)縮放Matrix4x4,Unity,unity,矩陣,unity矩陣,Matrix4x4
上圖Tx,Ty,Tz為平邑的方向向量

這里可以自己做個測試,將transform的初始位置修改如下所示
Unity矩陣平移旋轉(zhuǎn)縮放Matrix4x4,Unity,unity,矩陣,unity矩陣,Matrix4x4
代碼如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyTransform : MonoBehaviour
{
    public Matrix4x4 matrix;

    // Start is called before the first frame update
    void Start()
    {
        matrix.SetTRS(transform.position,transform.rotation,transform.localScale);
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Q)) 
        {
            MyTranslate(new Vector3 (Random.Range(-5,5),Random.Range(-5,5), Random.Range(-5, 5)));
        }
    }

    public Vector4 v;

    /// <summary>
    /// 平移矩陣對象
    /// </summary>
    /// <param name="pos"></param>
    public void MyTranslate(Vector3 pos) 
    {
        //按照當前位置進行位移
        //v = new Vector4(transform.position.x,transform.position.y,transform.position.z,1);

        //按照原點進行位移
        v = new Vector4(0, 0, 0, 1);
        matrix = Matrix4x4.identity;

        //X、Y、Z移動因子
        matrix.m03 = pos.x;
        matrix.m13 = pos.y;
        matrix.m23 = pos.z;

        //矩陣位移操作
        v = matrix * v;

        transform.position = new Vector3(v.x, v.y, v.z);
    }
}

縮放矩陣

Unity矩陣平移旋轉(zhuǎn)縮放Matrix4x4,Unity,unity,矩陣,unity矩陣,Matrix4x4
這個就是縮放矩陣,其中“Sx”、“Sy”、“Sz”就是各個軸上的縮放因子??s放矩陣是矩陣表現(xiàn)物體大小變換的矩陣。如果縮放因子小于1,表現(xiàn)為物體縮?。蝗绻笥?,則表現(xiàn)為物體擴大,如果等于1則不發(fā)生變化。

測試的話可以根據(jù)平移矩陣的測試方式修改scale來查看矩陣點對應(yīng)值得變化

修改代碼如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyTransform : MonoBehaviour
{
    public Matrix4x4 matrix;

    // Start is called before the first frame update
    void Start()
    {
        matrix.SetTRS(transform.position,transform.rotation,transform.localScale);
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Q)) 
        {
            MyTranslate(new Vector3 (Random.Range(-5,5),Random.Range(-5,5), Random.Range(-5, 5)));
        }
        if (Input.GetKeyDown(KeyCode.W)) 
        {
            int scale = Random.Range(-5,5);
            MyScale(new Vector3 (scale, scale, scale));
        }
    }

    public Vector4 v;

    /// <summary>
    /// 平移矩陣對象
    /// </summary>
    /// <param name="pos"></param>
    public void MyTranslate(Vector3 pos) 
    {
        //按照當前位置進行位移
        //v = new Vector4(transform.position.x,transform.position.y,transform.position.z,1);

        //按照原點進行位移
        v = new Vector4(0, 0, 0, 1);
        matrix = Matrix4x4.identity;

        //X、Y、Z移動因子
        matrix.m03 = pos.x;
        matrix.m13 = pos.y;
        matrix.m23 = pos.z;

        //矩陣位移操作
        v = matrix * v;

        transform.position = new Vector3(v.x, v.y, v.z);
    }

    /// <summary>
    /// 縮放矩陣對象
    /// </summary>
    /// <param name="scale"></param>
    public void MyScale(Vector3 scale) 
    {
        //設(shè)置當前對象大小
        //v = new Vector4(transform.localScale.x, transform.localScale.y, transform.localScale.z, 1);

        //按照原點進行位移
        v = new Vector4(1, 1, 1, 1);

        matrix = Matrix4x4.identity;

        //X、Y、Z縮放因子
        matrix.m00 = scale.x;
        matrix.m11 = scale.y;
        matrix.m22 = scale.z;

        //矩陣縮放操作
        v = matrix * v;

        transform.localScale = new Vector3(v.x, v.y, v.z);
    }
}

旋轉(zhuǎn)矩陣

Unity矩陣平移旋轉(zhuǎn)縮放Matrix4x4,Unity,unity,矩陣,unity矩陣,Matrix4x4
測試的話可以根據(jù)平移矩陣的測試方式修改Rotation來查看矩陣點對應(yīng)值得變化

修改代碼如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyTransform : MonoBehaviour
{
    public Matrix4x4 matrix;

    // Start is called before the first frame update
    void Start()
    {
        matrix.SetTRS(transform.position,transform.rotation,transform.localScale);
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Q)) 
        {
            MyTranslate(new Vector3 (Random.Range(-5,5),Random.Range(-5,5), Random.Range(-5, 5)));
        }
        if (Input.GetKeyDown(KeyCode.W)) 
        {
            int scale = Random.Range(-5,5);
            MyScale(new Vector3 (scale, scale, scale));
        }
        if (Input.GetKeyDown(KeyCode.A)) 
        {
            MyRotation( Axle.X,10f);
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            MyRotation(Axle.Y, 10f);
        }
        if (Input.GetKeyDown(KeyCode.D))
        {
            MyRotation(Axle.Z, 10f);
        }
    }

    public Vector4 v;

    /// <summary>
    /// 平移矩陣對象
    /// </summary>
    /// <param name="pos"></param>
    public void MyTranslate(Vector3 pos) 
    {
        //按照當前位置進行位移
        //v = new Vector4(transform.position.x,transform.position.y,transform.position.z,1);

        //按照原點進行位移
        v = new Vector4(0, 0, 0, 1);
        matrix = Matrix4x4.identity;

        //X、Y、Z移動因子
        matrix.m03 = pos.x;
        matrix.m13 = pos.y;
        matrix.m23 = pos.z;

        //矩陣位移操作
        v = matrix * v;

        transform.position = new Vector3(v.x, v.y, v.z);
    }

    /// <summary>
    /// 縮放矩陣對象
    /// </summary>
    /// <param name="scale"></param>
    public void MyScale(Vector3 scale) 
    {
        //設(shè)置當前對象大小
        //v = new Vector4(transform.localScale.x, transform.localScale.y, transform.localScale.z, 1);

        //按照原點進行位移
        v = new Vector4(1, 1, 1, 1);

        matrix = Matrix4x4.identity;

        //X、Y、Z縮放因子
        matrix.m00 = scale.x;
        matrix.m11 = scale.y;
        matrix.m22 = scale.z;

        //矩陣縮放操作
        v = matrix * v;

        transform.localScale = new Vector3(v.x, v.y, v.z);
    }

    public enum Axle { X, Y, Z}

    public void MyRotation(Axle axle,float angle) 
    {
        matrix = Matrix4x4.identity;

        //對應(yīng) X、Y、Z的旋轉(zhuǎn)
        switch (axle)
        {
            case Axle.X:
                matrix.m11 = Mathf.Cos(angle * Mathf.Deg2Rad);
                matrix.m12 = -Mathf.Sin(angle * Mathf.Deg2Rad);
                matrix.m21 = Mathf.Sin(angle * Mathf.Deg2Rad);
                matrix.m22 = Mathf.Cos(angle * Mathf.Deg2Rad);
                break;
            case Axle.Y:
                matrix.m00 = Mathf.Cos(angle * Mathf.Deg2Rad);
                matrix.m02 = Mathf.Sin(angle * Mathf.Deg2Rad);
                matrix.m20 = -Mathf.Sin(angle * Mathf.Deg2Rad);
                matrix.m22 = Mathf.Cos(angle * Mathf.Deg2Rad);
                break;
            case Axle.Z:
                matrix.m00 = Mathf.Cos(angle * Mathf.Deg2Rad);
                matrix.m01 = -Mathf.Sin(angle * Mathf.Deg2Rad);
                matrix.m10 = Mathf.Sin(angle * Mathf.Deg2Rad);
                matrix.m11 = Mathf.Cos(angle * Mathf.Deg2Rad);
                break;
            default:
                break;
        }

        float qw = Mathf.Sqrt(1f + matrix.m00 + matrix.m11 + matrix.m22) / 2;
        float w = 4 * qw;
        float qx = (matrix.m21 - matrix.m12) / w;
        float qy = (matrix.m02 - matrix.m20) / w;
        float qz = (matrix.m10 - matrix.m01) / w;

        transform.rotation = new Quaternion(qx, qy, qz, qw);
    }

}

原文中有對應(yīng)的小工具可以參考文章來源地址http://www.zghlxwxcb.cn/news/detail-796722.html

到了這里,關(guān)于Unity矩陣平移旋轉(zhuǎn)縮放Matrix4x4的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Unity3D】縮放、平移、旋轉(zhuǎn)場景

    【Unity3D】縮放、平移、旋轉(zhuǎn)場景

    1 前言 ? ? ? ? 場景縮放、平移、旋轉(zhuǎn)有兩種實現(xiàn)方案,一種是對場景中所有物體進行同步變換,另一種方案是對相機的位置和姿態(tài)進行變換。 ? ? ? ? 對于方案一,如果所有物體都在同一個根對象下(其子對象或?qū)O子對象),那么只需要對根對象施加變換就可以實現(xiàn)場景變

    2023年04月22日
    瀏覽(97)
  • 2D坐標系下的點的轉(zhuǎn)換矩陣(平移、縮放、旋轉(zhuǎn)、錯切)

    2D坐標系下的點的轉(zhuǎn)換矩陣(平移、縮放、旋轉(zhuǎn)、錯切)

    1. 平移 (Translation) 在2D空間中,我們經(jīng)常需要將一個點平移到另一個位置。假設(shè)空間中的一點 P ( x , y ) P(x,y) P ( x , y ) ;將其向 x , y x, y x , y 方向分別平移 t x t_x t x ? , t y t_y t y ? , 假設(shè)平移后點的坐標為 ( x ′ , y ′ ) (x\\\',y\\\') ( x ′ , y ′ ) ,則上述點的平移操作可以歸納為

    2024年02月15日
    瀏覽(21)
  • 三維變換矩陣實戰(zhàn)——三維點云的旋轉(zhuǎn)、縮放、鏡像、錯切、平移、正交投影

    三維變換矩陣實戰(zhàn)——三維點云的旋轉(zhuǎn)、縮放、鏡像、錯切、平移、正交投影

    旋轉(zhuǎn)矩陣:右邊矩陣是點云的原始坐標,左邊的是旋轉(zhuǎn)矩陣 ??? 可視化:繞x軸旋轉(zhuǎn)90度 代碼: 旋轉(zhuǎn)矩陣: ?? 可視化:繞y軸旋轉(zhuǎn)180度 代碼: 旋轉(zhuǎn)矩陣: ?? 可視化:繞z軸旋轉(zhuǎn)90度 代碼: 旋轉(zhuǎn)矩陣:? 線繞哪個軸轉(zhuǎn),xyz矩陣就和哪和軸的旋轉(zhuǎn)矩陣先計算 ???? 可視化:先

    2024年02月04日
    瀏覽(31)
  • Web3D數(shù)學基礎(chǔ)(平移、旋轉(zhuǎn)、縮放矩陣)—WebGL、WebGPU、Threejs

    Web3D數(shù)學基礎(chǔ)(平移、旋轉(zhuǎn)、縮放矩陣)—WebGL、WebGPU、Threejs

    參考資料:threejs中文網(wǎng) threejs qq交流群:814702116 本下節(jié)課給大家介紹下矩陣的概念,以及用于幾何變換的矩陣,比如平移矩陣、縮放矩陣、旋轉(zhuǎn)矩陣。 如果你對這些幾何變換的矩陣概念比較熟悉,可以跳過本節(jié)課。 線性代數(shù)、圖形學 如果你有《線性代數(shù)》、《計算機圖形學

    2024年02月03日
    瀏覽(51)
  • Three.js矩陣`Matrix4` 簡介

    Three.js矩陣`Matrix4` 簡介

    參考資料:threejs中文網(wǎng) threejs qq交流群:814702116 前面兩節(jié)課,給大家介紹了模型矩陣的數(shù)學基礎(chǔ)理論,下面給大家介紹Three.js的一個矩陣相關(guān)類 Matrix4 (4x4矩陣),并用 Matrix4 創(chuàng)建平移矩陣、旋轉(zhuǎn)矩陣、縮放矩陣。 查看4x4矩陣 Matrix4 文檔,你可以看到很多相關(guān)矩陣相關(guān)的數(shù)學幾

    2024年04月25日
    瀏覽(18)
  • C#使用Matrix類對Dicom圖像的旋轉(zhuǎn)、平移、翻轉(zhuǎn)

    使用Matrix對圖像的旋轉(zhuǎn)、平移、翻轉(zhuǎn),代碼如下: Matrix類的操作內(nèi)容可參考: C# Drawing.Drawing2D.Matrix類,二維矩陣幾何變換的3x3仿射矩陣類_wangnaisheng的博客-CSDN博客

    2024年02月11日
    瀏覽(17)
  • GLSL——旋轉(zhuǎn)、平移和縮放

    GLSL——旋轉(zhuǎn)、平移和縮放

    hello 兄弟們,好久不見撒,我又回來啦!,今天主要講解如何在頂點著色器中進行旋轉(zhuǎn)、平移和縮放,涉及到矩陣和向量方面的知識哦,忘記的可以翻一下高中數(shù)學啦,在講之前,先回顧一下矩陣和向量點積的知識,矩陣點乘向量,等于矩陣的每一行分別和向量相乘的和,如

    2024年02月16日
    瀏覽(24)
  • 【OpenCV】圖像變換(縮放、平移、旋轉(zhuǎn)、仿射)

    圖像變換是指通過對圖像進行縮放、平移、旋轉(zhuǎn)、仿射、透視等變換來改變圖像的形狀和大小。在本篇博客中,我們將詳細介紹OpenCV中的圖像變換函數(shù),并提供示例代碼以幫助讀者更好地理解這些函數(shù)的使用方法。 縮放變換是指通過改變圖像的大小來改變圖像的形狀。在Op

    2024年02月07日
    瀏覽(94)
  • Matlab圖像的平移,旋轉(zhuǎn),縮放,裁剪

    Matlab圖像的平移,旋轉(zhuǎn),縮放,裁剪

    %%------------------------Matlab圖像的平移,旋轉(zhuǎn),縮放,裁剪------------------------------- %-------------------頭文件----------------------------- clc ; %清屏幕 clear ; %刪除所有的變量 close all ; %將所有打開的圖片關(guān)掉 %--------------------圖像平移 imtranslate-------------------------- A = imread(\\\'1.jpg\\\') ; subplot(

    2024年02月04日
    瀏覽(25)
  • 二維坐標基本變換(平移、旋轉(zhuǎn)、縮放、鏡像、陣列)

    二維坐標基本變換(平移、旋轉(zhuǎn)、縮放、鏡像、陣列)

    諸如圖像、模型等的基本變換,實際上都是點坐標的變換,通過矩陣,可以非常方便的達到這個目的。在下文僅介紹二維坐標變換原理。 首先,定義點類如下: 注意,為了形式統(tǒng)一,變換矩陣應(yīng)統(tǒng)一為3*3階,同理,對于三維坐標變換矩陣應(yīng)是4*4階。關(guān)于矩陣的表示,實際上

    2024年02月04日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包