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);}}

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

Unity矩阵平移旋转缩放Matrix4x4相关推荐

  1. 三维坐标要建一个4*4的矩阵?平移 旋转 缩放

    移植不知道三维物体的旋转平移缩放和矩阵的关系.找到这篇文章借鉴一下. 转自:https://blog.csdn.net/ALLENJIAO/article/details/80348362 怎么平移一 ...

  2. Unity 触屏手势控制Camera平移旋转缩放

    Unity 触屏手势控制Camera平移旋转缩放 实现思路 单点触屏,位移增量控制相机平移: 两点触屏,两点位移控制相机前后移动(缩放):两点中一点不位移控制相机绕点旋转: 实现需要的API Touc ...

  3. 三维坐标 偏转_三维坐标变换原理-平移, 旋转, 缩放

    给定一个二维点(x, y),那么形如(kx, ky, k)的所有三元组就都是等价的,它们就是这个点的齐次坐标(homogeneous).齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示,是指 ...

  4. 三维空间中的几何变换-平移旋转缩放

    前言 前段时间由于项目需要,深入学习了下图形几何变换,主要是绕任意轴旋转部分(其他的已有一定基础),现记录学习笔记. 文章内容部分引用并参考了下面的博客: http://netclass.csu.ed ...

  5. Cesium变换3DTiles的位置(平移旋转缩放)

    function add3DTilesetDataTrans(url) {             //viewer1.scene.globe.depthTestAgainstTerrain = tr ...

  6. WebGL编程指南-24 同时使用漫反射光和环境反射光、立方体平移旋转缩放变换时漫反射光和环境反射光处理

    1.demo效果 此效果是上一章绘制的立方体基础上,向Y轴方向平移一个单位,然后绕Z轴旋转30度. 如上图,归纳一下物体坐标变换法向量变化的规律如下 平移变换, 法向量不会改变 旋转变换, 大多数情况 ...

  7. flutter Transform 矩阵变换(平移旋转缩放)

    Transform其子Widget绘制时外面包着矩阵变换(transformation),通过它可以实现各种矩阵操作. 1.widget平移 效果图 2.旋转(rotate) 效果图: 3.缩放 Tr ...

  8. OpenGL中的平移旋转缩放

    1.opengl中缩放使用的函数是glScalef 其原型为void glScalef(GLfloat  x,  GLfloat  y,  GLfloat  z); 该函数表示模型在各轴上进行扩大和缩 ...

  9. osg中使用MatrixTransform来实现模型的平移/旋转/缩放

    MatrixTransform是从Transform - Group继承而来,因此可以在它的下面挂接Node对象. 通过设置其矩阵,来实现其下子节点的模型变换. -- 用局部坐标系来理解(局部坐标系又 ...

最新文章

  1. 删除sybase里面的锁_一起来学习分布式锁
  2. 电脑编程教学_梁溪区在线少儿编程哪个机构比较靠谱
  3. 项目经理之项目经理的基本特征
  4. Java中的<T>是什么?
  5. python做前端可视化_Python数据可视化的四种简易方法
  6. Android App列表之游标ListView(索引ListView)
  7. Adam是RmsProp和momentum算法的结合(列表比较)
  8. redis常用操作-键的生存时间
  9. java代码实现顺序队列
  10. 卸载symantec 找不到vpshellres.dll 解决方案
  11. 计算机视觉 --基于opencv实现证件照换底色、翻转
  12. VMware安装及使用详细教程
  13. RC522(RFID)读写驱动
  14. python文件seek_Python文件读取中:f.seek(0)和f.seek(0,0)有什么区别?
  15. 牙齿变色怎么办?如何清洁牙齿?
  16. 一个人花8块钱买了一只鸡,9块钱卖掉了,然后他觉得不划算,花10块钱又买回来了,11块卖给另外一个人。问他赚了多少?
  17. Blurring the Lines between Blockchains andDatabase Systems: the Case of Hyperledger Fabric(翻译)
  18. 自从用了这款黑科技工具,妈妈再也不用担心我的c盘文件爆满了
  19. electron对接dll
  20. create与oncreate的区别

热门文章

  1. Classical wave-optics analogy of quantum-information processing
  2. 南京工业大学研究生计算机,南京工业大学计算机研究生每年录取要多少分
  3. 罗永浩到底有没有恰烂钱?
  4. 一个码农去日本做牛郎 ,然后...
  5. 《Adobe Illustrator CS5中文版经典教程》目录—导读
  6. 服务治理在猫眼娱乐的演进之路
  7. Kafka入门教程 Golang实现Kafka消息发送、接收
  8. 好消息轮询_在大流行中寻找数据科学工作而不是好消息
  9. HTTP常见数字含义
  10. HDL的综合和c语言的编译区别,Verilog HDL与C语言的比较