【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));//位移
}
}
打印数据如下:
参考:
智能推荐
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 因为...
