当前位置: 首页 > news >正文

【图形学】TA之路-矩阵

在 Unity 中,矩阵广泛用于处理各种图形变换,例如平移、旋转、缩放等。矩阵的使用不仅限于三维空间,还可以应用于二维空间的操作。了解矩阵及其运算对于游戏开发和计算机图形学非常重要。Unity 中使用的是行向量不是列向量,这个要注意!

1. 什么是矩阵?

矩阵是一个二维数组,用于存储数字。通常矩阵以行和列的形式组织,其中每个元素都对应一个数字。最常见的矩阵是 4x4 矩阵,用于 3D 图形变换。

例如,一个 4x4 的矩阵可以表示为:

2. Unity 中的矩阵类型

在 Unity 中,Matrix4x4 是最常用的矩阵类型。它是一个 4x4 的矩阵,常用于表示三维变换,例如物体的旋转、缩放和平移。以下是 Matrix4x4 的一些常用属性和方法:

  • Matrix4x4.identity: 返回单位矩阵,即对物体没有任何变换影响。
  • Matrix4x4.Translate(Vector3 position): 创建一个表示平移的矩阵。
  • Matrix4x4.Rotate(Quaternion rotation): 创建一个表示旋转的矩阵。
  • Matrix4x4.Scale(Vector3 scale): 创建一个表示缩放的矩阵。

3. 矩阵运算

矩阵运算在变换计算中扮演了关键角色。主要包括矩阵相乘、矩阵与向量相乘等操作。

矩阵相乘

矩阵相乘是通过将一个矩阵与另一个矩阵的对应元素进行乘法和加法操作来得到的。特别地,在 3D 变换中,多个矩阵可以连乘来表示复杂的变换组合,例如先缩放、再旋转、最后平移。

对于两个 4x4 的矩阵 AAA 和 BBB,矩阵乘法的结果 C=A×BC = A \times BC=A×B 计算如下:

矩阵与向量相乘

矩阵与向量的乘法常用于变换一个点的位置。例如,一个向量 vvv 乘以变换矩阵 MMM,得到的新向量 v′v'v′ 表示应用变换后的结果:

在 Unity 中,可以通过 Matrix4x4.MultiplyPoint(Vector3 point)Matrix4x4.MultiplyVector(Vector3 vector) 方法来实现这种操作。

4. 矩阵在 Unity 中的应用

在 Unity 中,矩阵主要用于以下几个方面:

  • 模型变换:将物体从模型坐标系转换到世界坐标系。
  • 摄像机变换:将物体从世界坐标系转换到摄像机坐标系。
  • 投影变换:将三维坐标转换到二维屏幕坐标。

Unity 中的 Transform 组件背后实际是通过矩阵进行变换的。当你对物体进行旋转、缩放或平移时,Unity 实际上在操作一个 4x4 变换矩阵。

Unity封装了很多方法,不用你去做,只需要调用就行
Camera:该类封装了透视投影变换(3转2)所需要一切

属性:

projectionMatrix:投影矩阵
worldToCameraMatrix/cameraToWorldMatrix:视图变换矩阵/逆
pixeIRect:屏幕宽高
方法:
WorldToViewportPoint/ScreenToViewportPoint:世界到/从视口WorldToScreenPoint/ScreenToWorldPoint:世界到/从屏幕ViewportPointToScreen/ScreenToViewportPoint:视口到/从屏幕
源码解析
1.矩阵相加:两个矩阵相加时,对应位置的元素相加即可。矩阵的维度必须相同

public static Matrix4x4 operator +(Matrix4x4 a, Matrix4x4 b)
{Matrix4x4 result = new Matrix4x4();for (int row = 0; row < 4; row++){for (int col = 0; col < 4; col++){result[row, col] = a[row, col] + b[row, col];}}return result;
}

 2,矩阵相减:两个矩阵相减时,对应位置的元素相减。矩阵的维度必须相同。

public static Matrix4x4 operator -(Matrix4x4 a, Matrix4x4 b)
{Matrix4x4 result = new Matrix4x4();for (int row = 0; row < 4; row++){for (int col = 0; col < 4; col++){result[row, col] = a[row, col] - b[row, col];}}return result;
}

 3.矩阵相乘:矩阵乘法是将第一个矩阵的行与第二个矩阵的列对应元素相乘并相加。注意,两个矩阵的乘法要求第一个矩阵的列数等于第二个矩阵的行数。

public static Matrix4x4 operator *(Matrix4x4 a, Matrix4x4 b)
{Matrix4x4 result = new Matrix4x4();for (int row = 0; row < 4; row++){for (int col = 0; col < 4; col++){result[row, col] = a[row, 0] * b[0, col] + a[row, 1] * b[1, col] +a[row, 2] * b[2, col] + a[row, 3] * b[3, col];}}return result;
}

 

 4.矩形的转换:矩阵转置是将矩阵的行和列互换。

public static Matrix4x4 Transpose(Matrix4x4 m)
{Matrix4x4 result = new Matrix4x4();for (int row = 0; row < 4; row++){for (int col = 0; col < 4; col++){result[row, col] = m[col, row];}}return result;
}

5.矩阵的行列式:行列式是矩阵的一个标量值,用于判断矩阵是否可逆。对于 4x4 矩阵,计算较为复杂。

6.矩阵的逆:矩阵的逆是与原矩阵相乘后得到单位矩阵的矩阵。只有行列式非零的矩阵才有逆矩阵。

public static Matrix4x4 Inverse(Matrix4x4 m)
{return Matrix4x4.Inverse(m);
}


7.单位矩阵:单位矩阵是对角线上元素为1,其他元素为0的矩阵。矩阵乘以单位矩阵后结果不变。

Matrix4x4 identity = Matrix4x4.identity;



8.矩阵与向量相乘:矩阵与向量相乘会改变向量的方向和大小。通常用于3D变换,如平移、旋转和缩放。

public static Vector4 Multiply(Matrix4x4 m, Vector4 v)
{return m * v;
}


 

相关文章:

【图形学】TA之路-矩阵

在 Unity 中&#xff0c;矩阵广泛用于处理各种图形变换&#xff0c;例如平移、旋转、缩放等。矩阵的使用不仅限于三维空间&#xff0c;还可以应用于二维空间的操作。了解矩阵及其运算对于游戏开发和计算机图形学非常重要。Unity 中使用的是行向量不是列向量&#xff0c;这个要注…...

LAMM: Label Alignment for Multi-Modal Prompt Learning

系列论文研读目录 文章目录 系列论文研读目录文章题目含义AbstractIntroductionRelated WorkVision Language ModelsPrompt Learning MethodologyPreliminaries of CLIPLabel AlignmentHierarchical Loss 分层损失Parameter Space 参数空间Feature Space 特征空间Logits Space …...

mac编译opencv 通用架构库的记录

1,通用架构 (x86_64;arm64&#xff09;要设置的配置项&#xff1a; CPU_BASELINE CPU_DISPATCH 上面这两个我设置成SSE_3&#xff0c;其他选项未尝试&#xff0c;比如不设置。 CMAKE_OSX_ARCHITECTURES:x86_64;arm64 WITH_IPP:不勾选 2,contrib库的添加&#xff1a; 第一次…...

Python 向IP地址发送字符串

Python 向IP地址发送字符串 在网络编程中&#xff0c;使得不同设备间能够进行数据传输是一项基本任务。Python提供了强大的库&#xff0c;帮助开发者轻松地实现这种通信。本文将介绍如何使用Python通过UDP协议向特定的IP地址发送字符串信息。 UDP协议简介 UDP&#xff08;用…...

上升响应式Web设计:纯HTML和CSS的实现技巧-1

响应式Web设计&#xff08;Responsive Web Design, RWD&#xff09;是一种旨在确保网站在不同设备和屏幕尺寸下都能良好运行的网页设计策略。通过纯HTML和CSS实现响应式设计&#xff0c;主要依赖于媒体查询&#xff08;Media Queries&#xff09;、灵活的布局、可伸缩的图片和字…...

利用java结合python实现gis在线绘图,主要技术java+python+matlab+idw+Kriging

主要技术javapythonmatlabidwKriging** GIS中的等值面和等高线绘图主要用于表达连续空间数据的分布情况&#xff0c;特别适用于需要展示三维空间中某个变量随位置变化的应用场景。 具体来说&#xff0c;以下是一些适合使用GIS等值面和等高线绘图的场景&#xff1a; 地形与地貌…...

Android全面解析之context机制(三): 从源码角度分析context创建流程(下)

前言 前面已经讲了什么是context以及从源码角度分析context创建流程&#xff08;上&#xff09;。限于篇幅把四大组件中的广播和内容提供器的context获取流程放在了这篇文章。广播和内容提供器并不是context家族里的一员&#xff0c;所以他们本身并不是context&#xff0c;因而…...

执行docker compose命令出现 Additional property include is not allowed

问题背景 在由docker-compose.yml的文件目录下执行命令 docker compose up -d 出现错误 Additional ininoperty include is not allowed 原因 我的docker-compose.yml 文件中出现了include标签旧版本的docker-compose 不支持此标签 解决办法 下载支持的docker-compose 解决…...

STM32通过I2C硬件读写MPU6050

目录 STM32通过I2C硬件读写MPU6050 1. STM32的I2C外设简介 2. STM32的I2C基本框图 3. STIM32硬件I2C主机发送流程 10位地址与7位地址的区别 7位主机发送的时序流程 7位主机接收的时序流程 4. STM32硬件与软件的波形对比 5. STM32配置硬件I2C外设流程 6. STM32的I2C.h…...

ubuntu2204-中文输入法-pycharm-python-django开发环境搭建

文章目录 1.系统常用设置1.1.安装中文输入法1.2.配置输入法1.3.卸载输入法1.4.配置镜像源2.java安装3.pycharm安装与启动4.卸载ubuntu2204默认版本5.安装Anaconda5.1.安装软件依赖包5.2.安装命令5.3.激活安装5.4.常用命令5.5.修改默认启动源6.安装mysql6.1.离线安装mysql6.2.在…...

【学习笔记】Matlab和python双语言的学习(一元线性回归)

文章目录 前言一、一元线性回归回归分析的一般步骤一元线性回归的基本形式回归方程参数的最小二乘法估计对回归方程的各种检验估计标准误差的计算回归直线的拟合优度判定系数显著性检验 二、示例三、代码实现----Matlab四、代码实现----python回归系数的置信区间公式残差的置信…...

LeetCode //C - 316. Remove Duplicate Letters

316. Remove Duplicate Letters Given a string s, remove duplicate letters so that every letter appears once and only once. You must make sure your result is the smallest in lexicographical order among all possible results. Example 1: Input: s “bcabc”…...

【ARM+Codesys 客户案例 】RK3568/A40i/STM32+CODESYS在工厂自动化中的应用:PCB板焊接机

现代化生产中&#xff0c;电子元件通常会使用自动化设备来进行生产&#xff0c;例如像PCB&#xff08;印刷电路板&#xff09;的组装。但是生产过程中也会面临一些问题&#xff0c;类似于如何解决在PCB板上牢固、精准地安装各种组件呢&#xff1f;IBL Lttechnik GmbH公司的CM80…...

【二分查找】--- 初阶题目赏析

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Joureny 上篇我们讲解了关于二分的朴素模板和边界模板&#xff0c;本篇博客我们试着运用这些模板。 &#x1f3e0; 搜索插入位置 &#x1f4cc; 题目…...

【PostgreSQL003】PostgreSQL数据表空间膨胀,磁盘爆满,应用宕机(经验总结,已更新)

1.一直以来想写下基于PostgreSQL的系列文章&#xff0c;作为较火的数据ETL工具&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下PostgreSQL数据库相关知识体系。空间膨胀&#xff08;主键、外键、…...

C语言第20天笔记

文件操作 概述 什么是 文件 文件时保存在外存储器上&#xff08;一般代指磁盘&#xff0c;也可以是U盘、移动硬盘等&#xff09;的数据的集合。 文件操作体现在哪几个方面 1. 文件内容的读取 2. 文件内容的写入 数据的读取和写入可被视为针对文件进行输入和输出的操作&a…...

为什么穷大方

为什么有些人明明很穷&#xff0c;却非常的大方呢&#xff1f; 因为他们认知太低&#xff0c;根本不懂钱的重要性&#xff0c;总是想着及时享乐&#xff0c;所以一年到头也存不了什么钱。等到家人孩子需要用钱的时候&#xff0c;什么也拿不出来&#xff0c;还到处去求人。 而真…...

HiveSQL实战——大数据开发面试高频SQL题

查询每个区域的男女用户数 0 问题描述 每个区域内男生、女生分别有多少个 1 数据准备 use wxthive; create table t1_stu_table (id int,name string,class string,sex string ); insert overwrite table t1_stu_table values(4,张文华,二区,男),(3,李思雨,一区,女),(1…...

RabbitMQ集群 - 普通集群搭建、宕机情况

文章目录 RabbitMQ 普通集群概述集群搭建数据准备启动容器宕机情况 RabbitMQ 普通集群 概述 1&#xff09;普通模式中所有节点没有主从之分&#xff0c;所有节点的元数据&#xff08;交换机、队列、绑定等&#xff09;都是一致的. 例如只要有任意一个节点上面 新增交换机&…...

xssDOM型练习

文章目录 例1要求 例2代码解析方法 例3例4例5例6例7例8 例1 本题通过get接收并传递参数&#xff0c;所有参数不经过过滤直接放入h2标签里面。 要求 1.需要页面弹出1337 2.不能与用户交互 官方认为innerHTML中script标签不安全&#xff0c;所以将其禁用&#xff0c;但只禁用了…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...