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;插电开机 正确连接网…

SQLITE如何同时查询出第一条和最后一条两条记录

一个时间记录表&#xff0c;需要同时得到整个表或一段时间内第一条和最后一条两条记录&#xff0c;按如下方法会提示错误&#xff1a;ORDER BY clause should come after UNION not before select * from sdayXX order by op_date asc limit 1 union select * from sday…

分布式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…

Java设计模式-单例模式(Singleton)

Java中实现单例模式有几种不同的方式,每种方式都有其特点和适用场景。下面是两种常用的实现方式:懒汉式和饿汉式。 懒汉式(线程安全) 懒汉式单例是指在第一次被引用时才会创建实例。为了确保线程安全,可以使用同步方法或同步块。 public class SingletonLazy {private sta…

微信小程序生成一个天气查询的小程序

微信小程序生成一个天气查询的小程序 基本的页面结构和逻辑 页面结构&#xff1a;包括一个输入框和一个查询按钮。 页面逻辑&#xff1a;在用户输入城市名称后&#xff0c;点击查询按钮&#xff0c;跳转到天气详情页面&#xff0c;并将城市名称作为参数传递。 主要代码 index…

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…

log4j rename方法

log4j日志切割 os.rename [rootzz test]# cat a2.py import os os.rename(a.txt,b.txt); [rootzz test]# cat a.txt 111111111111111111111 222222222222222222222 [rootzz test]# ls a1.py a2.py a.txt tst.log.1 tst.log.2 [rootzz test]# python ^C [rootzz test]# s…

【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…

Microsoft Edge使用方法和心得

Microsoft Edge 是一款现代的网络浏览器&#xff0c;由微软开发&#xff0c;基于 Chromium 项目。Edge 提供了许多功能和工具&#xff0c;可以提高浏览体验。以下是使用 Microsoft Edge 的方法和一些心得&#xff1a; 基本使用方法 打开和关闭标签页: 点击窗口右上角的 “”…

5G边缘计算:解密边缘计算的魔力

引言 你是否曾想过&#xff0c;网络可以更贴心、更智能地为我们提供服务&#xff1f;5G边缘计算就像是网络的小助手&#xff0c;时刻待命在你身边&#xff0c;让数字生活变得更加便捷。 什么是5G边缘计算&#xff1f; 想象一下&#xff0c;边缘计算就像是在离你最近的一层“云…

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; 在…

Wav2Lip:准确生成一个唇语识别视频

最近小编在GitHub里面闲逛发现一个3年前的项目&#xff0c;里面的任务是AI生成唇语的&#xff0c;根据你输入的语音修改你输入的视频&#xff0c;使得你的视频能对的上你输入的语音。因为版本一直没有被维护&#xff0c;有一些python库太久无法安装&#xff0c;有一些还有冲突&…

mysql参数配置binlog

官网地址&#xff1a; MySQL :: MySQL Replication :: 2.6.4 Binary Logging Options and Variables 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. MySQL 复制 / ... / 二进制日志记录选项和变量 2.6.4 二进…

ChatGPT免费 | 8个免费使用GPT-4的方法

这篇文章为寻找免费使用GPT-4技术的读者提供了一份实用的指南。 每个推荐的平台都包括了简要的描述和链接&#xff0c;方便读者直接访问。 以下是根据你提供的内容&#xff0c;稍作整理的文章结构&#xff1a; 1. HuggingFace 描述: 提供GPT-4等多种语言模型的平台。 如何使用:…