首页 > 其他分享 >3D游戏开发中的数学知识矩阵详解

3D游戏开发中的数学知识矩阵详解

时间:2023-10-19 11:44:51浏览次数:54  
标签:平移 缩放 ya xa 矩阵 变换 详解 数学知识 3D

矩阵很多同学没有接触过,所以感觉很难,很复杂,其实只要学过矩阵的同学都知道,矩阵运算并不难。今天我们给大家讲讲游戏开发中的矩阵的运算。

1:矩阵是什么?

矩阵是描述线性变换的一种数学工具,线性变换指的是使用一次函数从一个空间变换到另外一个空间。

例如在空间A中的一个2维向量(xa, ya)变换到空间B,使用一次线性函数变换后得(xb, yb)。

xb = A*xa + B*ya + C;

yb = M*xa + N*ya + D;

 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

上述变换中,xb 是由xa, ya 经过线性运算而得到得。如果xb = A*xa^2 + B*ya + C,这样就不是线性变换了。

数学前辈们为了描述上面的线性变换,发明了矩阵,把上面的变换标记为:

上面的变换,(xa, ya)通过矩阵变换到(xb, yb),用矩阵是如何变换的呢?我们实际就是把(xa, ya)*矩阵 = (xb, yb)。

 

2: 向量与矩阵, 矩阵与矩阵的乘法;

向量与矩阵乘法:

按照上述的例子我们一起来计算一下,空间Va的向量(xa, ya), 变换到空间Vb的向量(xb, yb)

(1): 扩展向量的维度为3维, (xa, ya)变成了(xa, ya, 1)

(2): 计算(xa, ya, 1) * 矩阵

总结一下向量与矩阵的乘法规则:

新向量的第i个元素,等于原来向量的每个元素与第i列矩阵的每个对应数据相乘后相加。由这个规则,我们可以得到向量与矩阵相乘向量的维度必须和矩阵的行数一样。

 

很多同学马上就会有疑问了,矩阵既然最后还是要结合元素计算,我干嘛还要用矩阵呢?直接算不就可以么?接下来矩阵得第二个妙处就在于每个线性变化都对应一个矩阵,我们可以把多次线性变换叠加起来,这样就可以减少运算的次数。比如我要把100个点,由V1空间,变换到v2空间,再变换到v3空间。V1到v2对应一个矩阵,v2到v3对应一个矩阵,我们可以把这两个矩阵变换叠加起来变成一个矩阵。100个点,每个点计算一次矩阵乘法即可得到新的点,而不用每个点计算2次矩阵乘法得到新的点。

如何把多个矩阵对应的多次线性变换叠加起来呢?这个就是矩阵与矩阵的乘法。例如

 

根据上面的规律,新矩阵的对应第i行第j列元素,我们叫做元素ij。矩阵变化的叠加就是矩阵乘法,矩阵乘法的计算规则如下:

A矩阵*B矩阵=C矩阵, Cij = Ai0*Bj0 + Ai1*Bj1 + ….. ;即Cij为A的第i行与B的第j列的每项数据相乘后的和(即dot(Ai, Bj))。根据上面的规则,我们发现两个矩阵要能相乘必须要满足一个条件,就是左边矩阵的列数等于右边矩阵的行数,否者两个矩阵是无法相乘的。

 

3: 游戏开发中的缩放,旋转平移矩阵;

游戏开发中常用的线性变换有缩放,平移, 旋转, 这个我们通常叫做transform。而这些变换叠加在一起,就是我们在游戏世界中摆放游戏物体,我们可以把每个物体的线性变换,叠加在一起,形成一个矩阵,然后我们再来做坐标变换。

先来看平移矩阵,我们以2D为例, 向量(x, y)平移变换到新的空间,平移就是把x, y都加上一个常量。那么平移变换矩阵为

 

 

缩放矩阵: 向量(x, y)通过缩放,到新的空间

 

我们叠加在一起运算一下, 先缩放还是先平移,得到的结果不一样,先平移后缩放的结果是 (x, y, 1) 先平移dx, dy, 后缩放3倍,(3x+3*dx, 3y + 3*dy, 1), 先缩放后平移, 得到的结果是(3x+dx, 3y + dy, 1)。

我们反应到矩阵,先平移后缩放,平移矩阵*缩放矩阵,如下:

同理,如果是先缩放后平移,缩放矩阵*平移矩阵,如下:

同样是两个矩阵,乘法的位置不一样,得到的结果可能不一样。

 

4: 3D游戏中的旋转矩阵,单位矩阵, 逆矩阵;

平移缩放,大家都好理解了,旋转矩阵不那么直观,特别是3D的。我们以大家熟悉的欧拉旋转为例。

比如我们在3D里面先绕x轴旋转 a度,再绕y轴旋转b度,再绕z轴旋转c度。这个其实就是3个空间的变换,每次变换,都对应一个旋转矩阵,然后我们按照顺序把这三个矩阵叠加起来 Rx * Ry * Rz = R旋转。根据我们上面的分析,矩阵的位置不一样,得到的结果会不一样,所以每个游戏引擎的欧拉角旋转都会有一个固定的顺序来计算, 最终就得到一个旋转矩阵。

最后说几个比较特殊的矩阵,单位矩阵,就是乘以这个矩阵后不会发生任何改变,相当于没有变化。

逆矩阵: 矩阵A的反向矩阵叫A的逆矩阵即: A矩阵*A的逆矩阵=单位矩阵, 两个互为逆矩阵的叠加在一起,相当于没有变化。

 

今天的矩阵就讲解到这里,关注我, 在我们公开课中可以免费获得矩阵的视频讲解的课程。

标签:平移,缩放,ya,xa,矩阵,变换,详解,数学知识,3D
From: https://www.cnblogs.com/bycw/p/17774368.html

相关文章

  • LSTM-CRF模型详解和Pytorch代码实现
    在快速发展的自然语言处理领域,Transformers已经成为主导模型,在广泛的序列建模任务中表现出卓越的性能,包括词性标记、命名实体识别和分块。在Transformers之前,条件随机场(CRFs)是序列建模的首选工具,特别是线性链CRFs,它将序列建模为有向图,而CRFs更普遍地可以用于任意图。本文中crf......
  • javascript之分片上传,断点续传的实际项目实现详解
    首先,我们需要了解什么是分片上传和断点续传。分片上传是将大文件分成多个小块进行上传,每个小块可以独立上传,从而提高上传速度和稳定性。而断点续传是指在上传大文件时,当上传过程中因断网或其他原因中断,再次上传时可以不用重头开始,而是从中断的地方继续上传。接下来是分片上传和......
  • Python入门进阶:68 个 Python 内置函数详解
    内置函数就是Python给你提供的,拿来直接用的函数,比如print.,input等。截止到python版本3.6.2,python一共提供了68个内置函数,具体如下abs()dict()help()min()setattr()all()dir()hex()next()slice()any()divmod()id()object()sorted()ascii()enumerate()input()......
  • Windows下VC++编译器32位memcpy、memmove函数汇编代码详解
    整理者:赤勇玄心行天道QQ号:280604597微信号:qq280604597QQ群:511046632博客:www.cnblogs.com/gaoyaguo  blog.csdn.net/cyz7758520?type=blog大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的!你可以随意转载,无需注明出处!写文档实属不易,我希望大家能支......
  • elasticsearch 8.7.0的Java API详解教程(一)
    最近作者做一个es的搜索,之前采用的是7.12.1,本来接口都已经基本上写好了,后面es要升级到8.7.0,一升级就连接不上es8.7.0了,后面才发现原来es8是默认采用了HTTPS协议,需要配置认证证书,这个问题搞了好久好久,最后终于搞成功了,在此写一篇博客记录一下。一、pom文件<?xmlversion="1.0"encod......
  • 【ORCAL】oracle 数据库中case when 语句的用法详解
     今天向大家介绍oracle数据库中casewhen语句的用法详解,主要包括它的用法详解、使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值。CASEWHEN表达式有两种形式1--简单Case函数23CASEsex4WHEN'1'THEN'男'5WHEN'2'THEN......
  • 【Unity3D】UI Toolkit简介
    1前言​UIToolkit是一种基于Web技术的GUI框架,是为了解决UGUI效率问题而设计的新一代UI系统(UGUI的介绍详见→UGUI概述)。与UGUI不同,UIToolkit没有采用GameObject的方式,而是参考了Web技术的XML和CSS方案。这意味着它只保存变化的数据,而不是整个界面状态......
  • 【Unity3D】UI Toolkit容器
    1前言​UIToolkit简介中介绍了UIBuilder、样式属性、UQuery、Debugger,UIToolkit元素中介绍了Label、Button、TextField、Toggle、RadioButton、Slider、ProgressBar、Dropdown、Foldout等元素,UIToolkit样式选择器中介绍了简单选择器、复杂选择器、伪类选择器等......
  • Go 布道者框架beego的Router 功能详解
    Beego是一个用于构建Web应用程序和后端服务的Go语言框架。它提供了一整套功能,包括路由、模型、视图、会话管理等。0go框架beego现在被淘汰了吗?2016年提出的这个问题,由于当时自己刚入门学习go,就想找一个快速入门的框架学习使用,所以提出了这个很无脑的问题,在此,也向框架作者表......
  • CF73D FreeDiv
    首先先把原图中的连通信息求一下,不妨设其中有\(tot\)个连通块,每个连通块的大小为\(sz_i\)考虑第二步操作时我们需要连\(tot-1\)条边使得图连通,而每个连通块中只有\(\min(sz_i,k)\)个点可以参与连边因此如果\(\sum_{i=1}^{tot}\min(sz_i,k)\ge2\times(tot-1)\)的话此时的局面......