Unity矩阵平移旋转缩放Matrix4x4

Unity矩阵平移旋转缩放Matrix4x4

  • Unity中的矩阵(Matrix4x4)
  • 创建自定义模型
  • 平移矩阵
  • 缩放矩阵
  • 旋转矩阵

Unity中的矩阵(Matrix4x4)

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

创建自定义模型

在这里插入图片描述
参数可以参考我上图的参数,这里注意三个顶点是一个面,这里我上述的模型是一个三角形的面。

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矩阵
在这里插入图片描述
上图Tx,Ty,Tz为平邑的方向向量

这里可以自己做个测试,将transform的初始位置修改如下所示
在这里插入图片描述
代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MyTransform : MonoBehaviour
{public Matrix4x4 matrix;// Start is called before the first frame updatevoid Start(){matrix.SetTRS(transform.position,transform.rotation,transform.localScale);}// Update is called once per framevoid 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);}
}

缩放矩阵

在这里插入图片描述
这个就是缩放矩阵,其中“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 updatevoid Start(){matrix.SetTRS(transform.position,transform.rotation,transform.localScale);}// Update is called once per framevoid 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);}
}

旋转矩阵

在这里插入图片描述
测试的话可以根据平移矩阵的测试方式修改Rotation来查看矩阵点对应值得变化

修改代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MyTransform : MonoBehaviour
{public Matrix4x4 matrix;// Start is called before the first frame updatevoid Start(){matrix.SetTRS(transform.position,transform.rotation,transform.localScale);}// Update is called once per framevoid 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);}}

原文中有对应的小工具可以参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/241384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝牙物联网在智能家居中的应用前景

物联网智能家居系统是应用物联网技术&#xff0c;在传统家居环境下将各种零散无序的电器整合成统一整体&#xff0c;实现家电的全程自动控制&#xff0c;满足用户高效管理需求的一种新型家居模式。 其主要的子系统有家居感知系统、家庭网络系统、智能家居控制管理系统等&#x…

使用教程之【SkyWant.[2304]】路由器操作系统,破解移动【Netkeeper】校园网【小白篇】

许多高校目前饱受Netkeeper认证的痛苦&#xff0c;普通路由器无法使用&#xff0c; 教你利用SkyWant的Netkeeper认证软件来使你的SkyWant路由器顺利认证上网&#xff0c;全宿舍又可以合作共赢了&#xff01; 步骤一&#xff1a;正确连接网线&#xff0c;插电开机 正确连接网…

分布式Session使用步骤

目录 1. 为什么用分布式Session2. Spring-Session使用步骤2-1. 添加依赖2-2. yml配置 1. 为什么用分布式Session 将一个项目部署到多台服务器上时&#xff0c;多台服务器的Tomcat的Session不共享。那么就有可能造成Session数据不一致情况&#xff0c;所以此时就需要使用分布式…

Gateway API

Gateway API 目录 原文链接 https://onedayxyy.cn/docs/GatewayAPI 本节实战 实战名称&#x1f6a9; 实战&#xff1a;Gateway API在istio里的安装及测试-2023.12.23(测试失败) 前言 Gateway API 是由 SIG-NETWORK 社区管理的开源项目&#xff0c;项目地址&#xff1a;http…

nodejs+vue+ElementUi洗衣店订单管理系统4691l

衣服但是找订单的时间太长&#xff0c;体验非常的差。而且对于店家这也很头疼&#xff0c;麻烦的查找订单的方式&#xff0c;让他总是重复着繁琐的步骤&#xff0c;记录的时候也很容易出问题&#xff0c;容易把衣服弄错&#xff0c;再然后就是对于收来的衣服也很麻烦&#xff0…

初识QT(上篇):What Qt

初识QT&#xff08;上篇&#xff09;&#xff1a;What Qt 前言 & 说明前言说明 初识QT1.1 QT的what1. 介绍2. 发展历程3. QT架构的主要内容4.QT的常用模块 1.2 QT的 why1. QT的核心机制 下篇笔记链接 前言 & 说明 前言 前言&#xff1a; 之前说要share的qt相关知识&am…

【AI提示词人物篇】创新艺术未来,让科技改变想象空间

AI 绘画学习难度和练习技巧 学习绘画的技巧 学习能难度&#xff1a; 外貌特征&#xff1a;AI需要学习识别和理解各种外貌特征&#xff0c;如发型、肤色、眼睛颜色等。这可能需要大量的训练数据和复杂的模型架构。 镜头提示&#xff1a;AI需要学习理解不同镜头提示的含义&…

论文笔记--Learning Political Polarization on Social Media Using Neural Networks

论文笔记--Learning Political Polarization on Social Media Using Neural Networks 1. 文章简介2. 文章概括3. 相关工作4. 文章重点技术4.1 Collection of posts4.1.1 数据下载4.1.2 数据预处理4.1.3 统计显著性分析 4.2 Classification of Posts4.3 Polarization of users 5…

SpringMVC:Ajax、拦截器、文件上传、文件下载

文章目录 SpringMVC - 06一、Ajax1. 概述2. Ajax 异步加载数据1. 单个数据2. 对象 3. 实践4. 总结 二、拦截器1. 概述2. 实现3. 实践4. 总结 三、文件上传&#xff1a;Upload1. 准备工作2. 步骤3. 效果 四、文件下载&#xff1a;Download1. 步骤2. 效果3. 总结 注意&#xff1a…

mac m1芯片 pytorch安装及gpu性能测试

pytorch 使用mac的m1芯片进行模型训练。 #小结&#xff1a;在数据量小和模型参数少&#xff0c;batch_size小时&#xff0c;cpu训练更快&#xff08;原因&#xff1a;每次训练时数据需要放入GPU中&#xff0c;由于batch_size小。数据放入gpu比模型计算时间还长&#xff09; 在…

【SPI和API有什么区别】

✅什么是SPI&#xff0c;和API有什么区别 ✅典型解析&#x1f7e2;拓展知识仓&#x1f7e2;如何定义一个SPI&#x1f7e2;SPI的实现原理 ✅SPI的应用场景SpringDubbo ✅典型解析 Java 中区分 API和 SPI&#xff0c;通俗的进: API和 SPI 都是相对的概念&#xff0c;他们的差别只…

优化模型:MATLAB整数规划

一、整数规划介绍 1.1 整数规划的定义 若规划模型的所有决策变量只能取整数时&#xff0c;称为整数规划。若在线性规划模型中&#xff0c;变量限制为整数&#xff0c;则称为整数线性规划。 1.2 整数规划的分类 整数规划模型大致可分为两类&#xff1a; &#xff08;1&…

SQL进阶理论篇(二十):什么是SQL注入

文章目录 简介SQL注入的原理SQL注入的实例搭建sqli-labs注入环境实例一&#xff1a;猜测where条件判断查询语句的字段数获取当前数据库和用户信息获取MySQL中的所有数据库名称查询wucai数据库中的所有数据表查询heros数据表中的所有字段参考文献 简介 这节是纯兴趣篇了。 web…

less 查看文本时,提示may be a binary file.See it anyway?

解决办法 首先使用echo $LESSCHARSET查看less的编码 看情况设置less的编码格式(我的服务器上使用utf-8查看中文) 还要特别注意一下&#xff0c;Linux中存在的文本文件的编码一定要是utf - 8;&#xff08;这一步很关键&#xff09; 例如&#xff1a;要保证windows上传到Linux的…

Linux Shell 001-Bash简介

Linux Shell 001-Bash简介 本节关键字&#xff1a;Linux、Bash Shell、shell分类 相关指令&#xff1a;bash、sh、cat Shell的介绍 计算机只能认识&#xff08;识别&#xff09;机器语言(0和1)&#xff0c;如&#xff08;11000000 这种&#xff09;。但是&#xff0c;我们的…

力扣(leetcode)1148和1179题(MySQL)

1148.文章浏览I 题目链接&#xff1a;1148.文章浏览I 解答 # Write your MySQL query statement below select distinct author_id as id from Views where author_idviewer_id order by id;1179.重新格式化部门表 题目链接&#xff1a;1179.重新格式化部门表 解答 …

线程池构造方法的认识

线程池中构造方法的认识 文章目录 线程池中构造方法的认识corePoolSize (核心线程数)maximumPoolSize&#xff08;最大线程数&#xff09;keepAliveTime(非核心线程的空闲超时时间)TimeUnitworkQueuethreadFactoryRejectedExecutionHandler拒绝策略 标准库中提供了一个ThreadPo…

uniapp自定义头部导航怎么实现?

一、在pages.json文件里边写上自定义属性 "navigationStyle": "custom" 二、在对应的index页面写上以下&#xff1a; <view :style"{ height: headheight px, backgroundColor: #24B7FF, zIndex: 99, position: fixed, top: 0px, width: 100% …

RocketMQ实践:确保消息不丢失与顺序性的高效策略

一、使用RocketMQ如何保证消息不丢失&#xff1f; 这个是在面试时&#xff0c;关于MQ&#xff0c;面试官最喜欢问的问题。这个问题是所有MQ都需要面对的一个共性问 题。大致的解决思路都是一致的&#xff0c;但是针对不同的MQ产品又有不同的解决方案。分析这个问题要从以 下几…