【图形学】TA之路-矩阵

news2025/1/4 5:49:05

在 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 变换矩阵。
源码解析
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;
}


 

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

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

相关文章

中职物联网实训室

一、中职物联网实训室建设背景 在当今科技日新月异的浪潮中&#xff0c;物联网技术以其迅猛的发展势头&#xff0c;成为了撬动数字化转型的关键杠杆&#xff0c;深刻地重塑着经济社会的面貌。面对这一变革&#xff0c;社会对精通物联网技术的应用型人才需求激增。鉴于此&#x…

高等数学:每日一题1/判断极值点和驻点数目

函数 ( ) A. 1个驻点&#xff0c;1一个极值点 B. 1个驻点&#xff0c;2一个极值点 C. 2个驻点&#xff0c;1一个极值点 D. 2个驻点&#xff0c;2一个极值点 知识点&#xff1a; 1.驻点与极值点的定义 2.极值点的充分条件与必要条件 本题的解题思路是对上述函数进行分段&#…

公网kafka消费者账号密码spring项目对接

公网kafka消费者带有账号密码方式的spring项目对接 最近接到一个对接的活&#xff0c;对方公司给出的是公网kafka模式&#xff0c;就是不断给你配置的消费者推送消息&#xff0c;并且是带有指定的账号密码方式。下面就给大家具体说一说我是怎么配置的和我配置过程中遇到的问题。…

【git】将本地文件上传到github

安装git 选择一个文件夹作为git仓库&#xff0c;cd到文件夹输入 git init文件夹出现.git文件夹&#xff0c;该文件夹默认为隐藏文件夹&#xff0c;设置为不隐藏 在cmd中输入 ssh-keygen -t rsa -C "xxxxxx.com"该邮箱为github邮箱&#xff0c;然后一路enter出现以…

并查集-应用方向以及衍生汇总+代码实现(c++)-学习一个数据结构就会做三类大题!

并查集的核心功能&#xff0c;合并集合&#xff0c;查找元素&#xff0c;这两个最基本的功能相关题目本文不列举了&#xff0c;主要是一些和图相关的&#xff1a; 并查集的核心母题 一、连通性检测&#xff1a; 问题&#xff1a;判断在一个图中&#xff0c;任意两点是否连通。…

《Python爬虫逆向实战》绕过debugger的方法汇总

禁用断点 打开控制台&#xff0c;点击右边的禁用断点按钮。 点击之后再刷新下&#xff0c;就会发现debugger失效了。 注&#xff1a;这种方法有个 弊端&#xff0c;就是我们在代码中下的断点也都将失效。 Add script to ignore list 在代码文件中任意位置右键&#xff0c;然…

SpringBoot读取resources下文件,不区分window和Linux系统

起因 每次发布读取项目下的文件总是要区分系统环境&#xff0c;烦人。 解决 log.info("读取excel开始");//获取文件路径ClassLoader classLoader getClass().getClassLoader();//获取文件流InputStream stream classLoader.getResourceAsStream("1.xlsx&qu…

PHP西陆多城市多门店多端健身系统小程序源码

&#x1f3cb;️‍♀️全国畅练无阻&#xff01;探索“多城市多门店多端健身系统”的无限可能&#x1f3c3;‍♂️ &#x1f30d; 开篇&#xff1a;跨越地域的健身自由 你是否曾因工作调动、旅行或是居住地变化而烦恼健身计划的中断&#xff1f;别担心&#xff0c;“多城市多…

数字化营销:以数据为笔,绘品牌与消费者的未来画卷

数据在数字化营销中的重要性简直超乎想象&#xff01;它能让企业精准洞察消费者的需求。就像电商平台&#xff0c;根据咱们的浏览和购买记录&#xff0c;就能推荐个性化的商品&#xff0c;是不是感觉特贴心&#xff0c;购买意愿也瞬间提高了&#xff1f;而且数据还能帮企业优化…

大数据-84 Spark 集群 RDD创建 RDD-Transformation操作算子 详解

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

CSS 伪类和伪元素

也是选择器的一种&#xff0c;被称为伪类和伪元素。这一类选择器的数量众多&#xff0c;通常用于很明确的目的。 伪类 什么是伪类 伪类是选择器的一种&#xff0c;它用于选择处于特定状态的元素。 比如当它们是这一类型的第一个元素时&#xff08;:first-child&#xff09;&…

Sentinel入门与进阶:微服务流量控制的最佳实践 ( 六 )

8.Gateway 整合 Sentinel&#xff08;熔断、限流&#xff09; 8.1.引入依赖 在 Spring Cloud Alibaba 2.1.6之前的版本&#xff0c;引入的是 sentinel-spring-cloud-gateway-adapter 包&#xff0c;并且需要自己实现好多配置类&#xff0c;2.1.6 之后的版本内部已经帮我们实现…

php 在app中唤起微信app进行支付,并处理回调通知

<?phpnamespace app\api\controller;use think\facade\Db; use think\facade\Log;class Wxzf {

计算机网络之分组交换时延的计算

一.类型 分组交换的时延包括一下几种&#xff1a; 1.1发送时延 发送时延&#xff0c;也叫传输时延&#xff0c;结点将分组的所有比特推向链路所需要的时间&#xff0c;即从发送分组的第一个比特算起&#xff0c;到该分组的最后一个比特发送完为止。 发送时延 分组长度 / 发…

Web Image scr图片从后端API获取基本实现

因系统开发中需求&#xff0c;会有页面显示图片直接从后端获取后显示&#xff0c;代码如下&#xff1a; 后端&#xff1a; /*** 获取图片流* param response* param fileName*/RequestMapping(value"getImgStream",method RequestMethod.GET)public void getImgStr…

【JAVA】深入理解守护线程与非守护线程:概念、应用及示例

文章目录 介绍1. 线程的基础知识2. 守护线程与非守护线程2.1 什么是守护线程&#xff1f;特点&#xff1a; 2.2 什么是非守护线程&#xff1f;特点&#xff1a; 3. 为什么需要守护线程&#xff1f;示例&#xff1a;后台任务处理示例&#xff1a;日志记录 4. 非守护线程的应用场…

Scrapy 项目部署问题及解决方案

部署 Scrapy 项目时可能会遇到一些常见问题。以下是几个常见的部署问题及其解决方案&#xff1a; 1、依赖问题 问题&#xff1a;部署后爬虫运行失败&#xff0c;通常是由于缺少依赖库。 2、配置问题 问题&#xff1a;爬虫在部署环境中无法正常运行&#xff0c;可能是由于配…

stm32智能颜色送餐小车(openmv二维码识别+颜色识别+oled显示)

大家好啊&#xff0c;我是情谊&#xff0c;今天我们来介绍一下我最近设计的stm32产品&#xff0c;我们在今年七月份的时候参加了光电设计大赛&#xff0c;我们小队使用的就是stm32的智能送餐小车&#xff0c;虽然止步于省赛&#xff0c;但是还是一次成长的经验吧&#xff0c;那…

深度学习基础之反向传播算法

目录 原理与过程 1. 前向传播&#xff08;Forward Pass&#xff09; 2. 计算误差&#xff08;Error Calculation&#xff09; 3. 反向传播&#xff08;Backpropagation&#xff09; 4. 参数更新&#xff08;Parameter Update&#xff09; 应用与实例 总结 反向传播算法…

1秒出图,全球最快的开源Stable Diffusion出炉

前言 OneFlow 将 Stable Diffusion 的推理性能推向了一个全新的 SOTA。 第一辆汽车诞生之初&#xff0c;时速只有 16 公里&#xff0c;甚至不如马车跑得快&#xff0c;很长一段时间&#xff0c;汽车尴尬地像一种“很酷的玩具”。人工智能作图的出现也是如此。 AI 作图一开始的…