Unity矩阵平移旋转缩放Matrix4x4

这篇具有很好参考价值的文章主要介绍了Unity矩阵平移旋转缩放Matrix4x4。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity中的矩阵(Matrix4x4)

最近在研究帧同步定点数物理系统中需要自定义定点数矩阵,所以在这里分享下基础的矩阵案例旋转、平移、缩放。(注意这里本文中的transform组件式基于unity浮点数的教程并非帧同步定点数)参考原文

创建自定义模型

Unity矩阵平移旋转缩放Matrix4x4,Unity,unity,矩阵,unity矩阵,Matrix4x4
参数可以参考我上图的参数,这里注意三个顶点是一个面,这里我上述的模型是一个三角形的面。

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

public class Triangle : MonoBehaviour
{
    /// <summary>
    /// 网格
    /// </summary>
    Mesh mesh;
    
    /// <summary>
    /// 三角形顶点
    /// </summary>
    public Vector3[] vertices;

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

    /// <summary>
    /// 材质球
    /// </summary>
    public Material mat;

    private void Start()
    {
        //实例化网格
        mesh = new Mesh();

        //分配顶点
        mesh.vertices = vertices;

        //分配三角形顶点索引
        mesh.triangles = triangle;

        //添加网格过滤器
        MeshFilter mf = gameObject.AddComponent<MeshFilter>();

        //网格赋值
        mf.mesh = mesh;
        
        //添加网格渲染器
        MeshRenderer mr = gameObject.AddComponent<MeshRenderer>();
        
        //材质赋值
        mr.materials[0] = mat;
    }
}

创建模型很简单我就不细讲了,看不懂的可以看上述的注释即可,直接黏贴也可。

平移矩阵

要做位移先搞明白矩阵中的哪几个索引值代表的坐标位置,如下图所示4x4矩阵
Unity矩阵平移旋转缩放Matrix4x4,Unity,unity,矩阵,unity矩阵,Matrix4x4
上图Tx,Ty,Tz为平邑的方向向量

这里可以自己做个测试,将transform的初始位置修改如下所示
Unity矩阵平移旋转缩放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矩阵平移旋转缩放Matrix4x4,Unity,unity,矩阵,unity矩阵,Matrix4x4
这个就是缩放矩阵,其中“Sx”、“Sy”、“Sz”就是各个轴上的缩放因子。缩放矩阵是矩阵表现物体大小变换的矩阵。如果缩放因子小于1,表现为物体缩小;如果大于1,则表现为物体扩大,如果等于1则不发生变化。

测试的话可以根据平移矩阵的测试方式修改scale来查看矩阵点对应值得变化

修改代码如下

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) 
    {
        //设置当前对象大小
        //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);
    }
}

旋转矩阵

Unity矩阵平移旋转缩放Matrix4x4,Unity,unity,矩阵,unity矩阵,Matrix4x4
测试的话可以根据平移矩阵的测试方式修改Rotation来查看矩阵点对应值得变化

修改代码如下

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) 
    {
        //设置当前对象大小
        //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;

        //对应 X、Y、Z的旋转
        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);
    }

}

原文中有对应的小工具可以参考文章来源地址https://www.toymoban.com/news/detail-796722.html

到了这里,关于Unity矩阵平移旋转缩放Matrix4x4的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 3d角色展示脚本(旋转 平移 缩放)展示界面

    不考虑性能 很简陋的一个功能,主要是用于角色渲染的观察用,比simplecontroller要好用一点

    2024年02月11日
    浏览(52)
  • 2D坐标系下的点的转换矩阵(平移、缩放、旋转、错切)

    1. 平移 (Translation) 在2D空间中,我们经常需要将一个点平移到另一个位置。假设空间中的一点 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 ​ , 假设平移后点的坐标为 ( x ′ , y ′ ) (x\\\',y\\\') ( x ′ , y ′ ) ,则上述点的平移操作可以归纳为

    2024年02月15日
    浏览(37)
  • 三维变换矩阵实战——三维点云的旋转、缩放、镜像、错切、平移、正交投影

    旋转矩阵:右边矩阵是点云的原始坐标,左边的是旋转矩阵     可视化:绕x轴旋转90度 代码: 旋转矩阵:    可视化:绕y轴旋转180度 代码: 旋转矩阵:    可视化:绕z轴旋转90度 代码: 旋转矩阵:  线绕哪个轴转,xyz矩阵就和哪和轴的旋转矩阵先计算      可视化:先

    2024年02月04日
    浏览(88)
  • Web3D数学基础(平移、旋转、缩放矩阵)—WebGL、WebGPU、Threejs

    参考资料:threejs中文网 threejs qq交流群:814702116 本下节课给大家介绍下矩阵的概念,以及用于几何变换的矩阵,比如平移矩阵、缩放矩阵、旋转矩阵。 如果你对这些几何变换的矩阵概念比较熟悉,可以跳过本节课。 线性代数、图形学 如果你有《线性代数》、《计算机图形学

    2024年02月03日
    浏览(49)
  • Three.js矩阵`Matrix4` 简介

    参考资料:threejs中文网 threejs qq交流群:814702116 前面两节课,给大家介绍了模型矩阵的数学基础理论,下面给大家介绍Three.js的一个矩阵相关类 Matrix4 (4x4矩阵),并用 Matrix4 创建平移矩阵、旋转矩阵、缩放矩阵。 查看4x4矩阵 Matrix4 文档,你可以看到很多相关矩阵相关的数学几

    2024年04月25日
    浏览(37)
  • C#使用Matrix类对Dicom图像的旋转、平移、翻转

    使用Matrix对图像的旋转、平移、翻转,代码如下: Matrix类的操作内容可参考: C# Drawing.Drawing2D.Matrix类,二维矩阵几何变换的3x3仿射矩阵类_wangnaisheng的博客-CSDN博客

    2024年02月11日
    浏览(41)
  • GLSL——旋转、平移和缩放

    hello 兄弟们,好久不见撒,我又回来啦!,今天主要讲解如何在顶点着色器中进行旋转、平移和缩放,涉及到矩阵和向量方面的知识哦,忘记的可以翻一下高中数学啦,在讲之前,先回顾一下矩阵和向量点积的知识,矩阵点乘向量,等于矩阵的每一行分别和向量相乘的和,如

    2024年02月16日
    浏览(41)
  • Matlab图像的平移,旋转,缩放,裁剪

    %%------------------------Matlab图像的平移,旋转,缩放,裁剪------------------------------- %-------------------头文件----------------------------- clc ; %清屏幕 clear ; %删除所有的变量 close all ; %将所有打开的图片关掉 %--------------------图像平移 imtranslate-------------------------- A = imread(\\\'1.jpg\\\') ; subplot(

    2024年02月04日
    浏览(42)
  • 【OpenCV】图像变换(缩放、平移、旋转、仿射)

    图像变换是指通过对图像进行缩放、平移、旋转、仿射、透视等变换来改变图像的形状和大小。在本篇博客中,我们将详细介绍OpenCV中的图像变换函数,并提供示例代码以帮助读者更好地理解这些函数的使用方法。 缩放变换是指通过改变图像的大小来改变图像的形状。在Op

    2024年02月07日
    浏览(57)
  • 二维坐标基本变换(平移、旋转、缩放、镜像、阵列)

    诸如图像、模型等的基本变换,实际上都是点坐标的变换,通过矩阵,可以非常方便的达到这个目的。在下文仅介绍二维坐标变换原理。 首先,定义点类如下: 注意,为了形式统一,变换矩阵应统一为3*3阶,同理,对于三维坐标变换矩阵应是4*4阶。关于矩阵的表示,实际上

    2024年02月04日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包