【Unity矩阵知识】之Matrix4x4矩阵变换详细实例

标题 ##博主最近研究矩阵的成果,简单的封装了一下,可直接当成工具类调用:

MatrixUtils工具类

internal  static class MatrixUtils 
{
    public static void Matrix4x4(this Transform transfrom,Matrix4x4 matrix4X4)
    {
        transfrom.localScale = matrix4X4.GetScale();
        transfrom.rotation = matrix4X4.GetRotation();
        transfrom.position = matrix4X4.GetPostion();
    }

    public static Quaternion GetRotation(this Matrix4x4 matrix4X4)
    {
        float qw = Mathf.Sqrt(1f + matrix4X4.m00 + matrix4X4.m11 + matrix4X4.m22)/2;
        float w = 4*qw;
        float qx = (matrix4X4.m21 - matrix4X4.m12)/w;
        float qy = (matrix4X4.m02 - matrix4X4.m20)/w;
        float qz = (matrix4X4.m10 - matrix4X4.m01)/w;
        return new Quaternion(qx, qy, qz, qw);
    }

    public static Vector3 GetPostion(this Matrix4x4 matrix4X4)
    {
        var x = matrix4X4.m03;
        var y = matrix4X4.m13;
        var z = matrix4X4.m23;
        return new Vector3(x,y,z);
    }

    public static Vector3 GetScale(this Matrix4x4 m)
    {
        var x = Mathf.Sqrt(m.m00*m.m00 + m.m01*m.m01 + m.m02*m.m02);
        var y = Mathf.Sqrt(m.m10*m.m10 + m.m11*m.m11 + m.m12*m.m12);
        var z = Mathf.Sqrt(m.m20*m.m20 + m.m21*m.m21 + m.m22*m.m22);
        return new Vector3(x,y,z);
    }
}

Matrix封装类

internal static class Matrix
{
    private static Matrix4x4 matrix;
    public static void Matrix4x4_Transfrom(this Transform transform, Vector3 targetPos)
    {
        matrix = Matrix4x4.identity;
        Vector4 v = new Vector4(transform.position.x, transform.position.y, transform.position.z, 1);

        matrix.m03 = targetPos.x;
        matrix.m13 = targetPos.y;
        matrix.m23 = targetPos.z;

        v = matrix * v;

        transform.Matrix4x4(matrix);
    }

    public static void Matrix4x4_Rotation(this Transform transform, EnemyManager.Axle axle, float angle)
    {
        matrix = Matrix4x4.identity;

        if (axle == EnemyManager.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);

        }
        else if (axle == EnemyManager.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);
        }
        else
        {
            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);
        }

        transform.Matrix4x4(matrix);
    }

    public static void Matrix4x4_Scale(this Transform transform, Vector3 targetScale)
    {
        matrix = Matrix4x4.identity;
        Vector4 v = new Vector4(transform.localScale.x, transform.localScale.y, transform.localScale.z, 1);

        matrix.m00 = targetScale.x;
        matrix.m11 = targetScale.y;
        matrix.m22 = targetScale.z;
        v = matrix * v;
        transform.Matrix4x4(matrix);
    }
}

测试调用(直接挂载对象):

public  class Test :MonoBehaviour
{
    void Start()
    {
        transform.Matrix4x4_Rotation(EnemyManager.Axle.X, 90f);//旋转
        transform.Matrix4x4_Scale(new Vector3(2,2,2));//缩放
        transform.Matrix4x4_Transfrom(new Vector3(6,6,6));//位移
    }

}

打印数据如下:
缩放矩阵
位移矩阵
旋转矩阵
参考:
这里写图片描述

版权声明:本文为aaa583004321原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aaa583004321/article/details/81948780

智能推荐

4*4矩阵 ---- 学习笔记

一、矩阵按键的由来 按键矩阵是由一个个独立按键连接在一起,每一行引出一个管脚,每一列也引出。   二、矩阵按键的扫描原理 逐行扫描:通过高四位轮流输出低电平来对矩阵键盘逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,通过接收到的数据是哪一位为0来判断是那一个按键被按下。 行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全位高电平时,说明...

Java运行原理

1.Java运行原理       我们可通过文本编辑板生成Java源代码(.java)经过dos窗口由Java编译器(javac.exe)生成字节码文件(.class),字节码可由Java虚拟机转化为机器码供计算机读取处理。由于Java可以生成字节码可供虚拟机转译所以可跨平台运行。运行过程如下: 所以相对于C语言还需要转化为exe文件才能运行的权限,Java具有跨平台...

Python由放弃到入门,基础篇七(类)下

类的实例化 有感于现在python教程多如牛毛,且大多高不可攀,多次拜读而不得其门道,遂由入门到放弃。偶有机缘,得一不错教程,得以入门,现博客分享,想要获取完整教程,ff17328081445。 通过对比可以看到,实例化后再使用的格式,①是空着的,意思是这里不再需要@classmethod的声明,并且在第②处,把cls替换成了self。同时,实例化后再使用的格式,需要先赋值然后再调用(第③处): ...

pytorch CNN手写字体识别

数据整体训练一次,对于accuracy都是0的问题,由于刚开始学,有些代码的细节我也没看懂,不过整体结果是对的,可能是由于pytorch版本的更新,导致accuracy的计算方式有所改变 内容转载自:https://www.bilibili.com/video/av15997678/?p=19...

linux后台运行命令总结

linux后台运行命令总结 问题: 我们有时候需要登录远程服务器跑运行时间非常长的脚本,这个时候你要让脚本后台运行,不然占着终端窗口看着不舒服。但万一网络不好,(比如我这儿的破校园网,高峰时几秒钟断一次),终端突然和服务器之间的连接断了,那脚本就会自动停了(因为运行test.sh进程的父进程就是当前的shell终端进程,关闭当前shell终端时,父进程退出,会发送hangup信号给所有子进程,子进...

猜你喜欢

类对象模型和this指针

关于类/对象大小的计算 类只是一种类型定义,它本身是没有大小可言的。 我们这里指的类的大小,其实指的是类的对象所占的大小。因此,如果用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。 首先,类大小的计算遵循结构体的对齐原则 类的大小与普通数据成员有关,与成员函数和静态成员无关。即普通成员函数,静态成员函数,静态数据成员,静态常量数据成员均对类的大小无影响 虚函数对类的大小有影响,...

3D人脸重建——PRNet网络输出的理解

前言 之前有款换脸软件不是叫ZAO么,分析了一下,它的实现原理绝对是3D人脸重建,而非deepfake方法,找了一篇3D重建的论文和源码看看。这里对源码中的部分函数做了自己的理解和改写。 国际惯例,参考博客: 什么是uv贴图? PRNet论文 PRNet代码 本博客主要是对PRNet的输出进行理解。 理论简介 这篇博客比较系统的介绍了3D人脸重建的方法,就我个人浅显的理解,分为两个流派:1.通过算...

javascript简单的正则表达式入门

内容来自百度前端学院javascript入门课程 基本的HTML: 样式: javascript: document.write和innerHTML有什么区别 前者是直接将内容写入文档流,如果写入之前没有调用document.open,那么回自动调用document.open(每打开一次文档流都会清除之前的所有内容包括变量)。每次写完关闭后重新调用该函数的话,会导致页面重写。 innerHTML是...

微信小程序一个你可能需要的功能

根据工作需要。需要做一个图片选中部分区域的效果。百度了很久,都没有见有。于是就自己写了个,需要的可以借鉴下,还有很多需要改善的地方 现在先看看效果 效果图 那这个有什么用呢。。需求是选中图片的某个区域然后给它添加注释。还可以有其他用处。那这个是怎么做到的呢 。。首先我说下基本的思路 ——-> 图片作为一个背景。然后上面是一层canvas 以及最上面生成的view 因为...