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

Godot主要架构:坐标系变换数学基本原理1:Transform坐标系矩阵

前言: 本篇文章是 针对Godot(2D)游戏架构的研究_godot(2d)最佳架构-CSDN博客 中架构细分系列3 Godot(2D)架构细分3: 四大坐标系重点内容解释与使用_godot坐标系-CSDN博客 中对矩阵数学基本知识的具体解释。本篇文章将会从与Transform矩阵有关的线性代数的基础知识开始讲起,到证明完坐标系转换公式

本文章中所使用的Godot内容都在主架构研究中的架构细化系列中解释过,可以返回主架构文章浏览

解释顺序

1. 矩阵坐标系的构建

2. 坐标系转化的公式以及证明

1. 矩阵坐标系的构建

1. 前提基本理论

在数学坐标系中,最普通二维的坐标系有X,Y轴,如图

这里先使用向右为X轴正半轴,向上为Y轴正半轴

在 Godot 的 Transform 体系中,我们始终需要一个固定不变的坐标参考系,所以我们现在要做的事情是,将一个没有经历任何变换的普通二维坐标系,作为我们的参考坐标系,我这里叫它绝对坐标系 。

而Godot中任何节点的局部坐标系,本质都是在绝对坐标系的基础上经过旋转,偏移,缩放而来的新坐标系

这时候我们需要知道这些概念:

1. 向量(Vector) :向量是既有大小又有方向的量。二维的有两个值XY,长度是对两个值使用勾股定理(a² + b² = c²)后得到的量。如果向量出发点在(0, 0),则方向是从 (0, 0) 指向 (X, Y)的方向。

以下向量都将使用VectorA(X, Y)表示,其中A是维度,比如二维向量为Vector2(X, Y)

2. 单位向量:长度为1的向量

3. 方向向量 :方向向量是一个与直线平行的非零向量,用于表示空间中某个特定方向。比如从Vector2(0, 0)出发的向量Vector(1, 0)代表绝对坐标系的正半轴(X轴)。下文的各个坐标系的轴的表示,均使用单位方向向量,用来表示纯方向。

4. 三角函数的几何意义: 三角函数是数学中一类关于角度的函数,在几何意义上是:在单位圆中,且以原点为圆心、以 X 轴正半轴为始边的角 θ 的射线与单位圆的交点坐标,可以直接由三角函数给出: (cosθ, sinθ),其中 cosθ 对应交点的 x 坐标,sinθ 对应交点的 y 坐标。

如图,可以看到,我们使用了30度的旋转角,使用三角函数表示出了它的坐标。

三角函数其他角度的值可以通过网上查阅或者计算机计算获得。

2. 构建矩阵坐标系

构建矩阵坐标系(局部),本质上是使用绝对坐标系来表示局部坐标系的 X轴 和 Y轴的坐标。比如绝对坐标系本身的X轴,可以使用Vector2(1, 0)来表示,而Y轴,可以使用 Vector2(0, 1) 来表示。

这也就是说,绝对坐标系本身的X轴,它的方向是 Vector2( cos0°, sin0° ) = Vector2( 1 , 0 )

绝对坐标系本身的Y轴,它的方向是 Vector2( cos90° , sin90° ) = Vector2( 0 , 1 )

那么局部坐标系的构建就很好理解了,比如我将原点与绝对坐标系重合的局部坐标系的轴,相对绝对坐标系逆时针旋转 45°,则由以绝对坐标系原点为圆心的单位圆上表示的 X轴 和 Y轴 的坐标就为

1.X = Vector2( cos( 0° + 45° ) , sin( 0° + 45° ) )

2.Y = Vector2( cos( 90° + 45° ) , sin( 90° + 45° ) )

如图,可以看到,局部坐标系的X,Y轴,都被绝对坐标系用三角函数给表示出来了。

现在我们将局部坐标系的旋转角度变为θ,则同上,局部坐标系在绝对坐标系中的表示为:

1. X = Vector2( cos( 0° + θ ) , sin( 0° + θ ) )

2. Y = Vector2( cos( 90° + θ ) , sin( 90° + θ ) )

注意:以下角度将使用弧度制单位,其中π 等价于 180°

此时为了方便使用 θ 来统一表示,我们对局部坐标系的Y轴的坐标的X和Y使用诱导公式:

cos( π/2 + α ) =-sinαsin( π/2 + α ) = cosα(诱导公式)

得到:

1.X = Vector2( cosθ, sinθ )

2.Y = Vector2( -sinθ , cosθ )

这时候我们就得到了局部坐标系相对于绝对坐标系用弧度(或者角度)旋转的坐标系表示。但是此时局部坐标系X和Y轴的表示是分开的,为了方便计算机统一计算,我们需要将局部坐标系的X和Y轴的表示统一到一个变量里面去,这时候可以构建2x2矩阵

首先看放进去的矩阵

注意:这里θ矩阵中打不出来,用 A 代替 θ

那么刚刚得到的坐标转化成矩阵就是

现在我们就构建了一个基础的坐标系矩阵,但是这个矩阵只能表示坐标系的旋转,或者是改变坐标系X和Y轴的夹角来控制坐标系的缩放,还不能表示位置。

这时候我们需要对该矩阵增广一列物体的相对位置(Vector2坐标),这就是Godot中的Transform(2D)的形式

第3列的值就是Godot(2D)中的origin的值,它是子节点相对父节点的位置(position),是一个二维向量(Vector2)

但是需要注意的是,Godot中transform增广矩阵的origin列不参与矩阵运算,即使数学上支持矩阵齐次运算(2x3矩阵与三维向量的相乘),Godot 也仍然会将 transform(2D) 按照 2x2 基底 + Vector2向量的运算法则分开计算。

(矩阵运算下文会解释)

2. 矩阵坐标系之间的变换证明

1. 前提基本矩阵理论

1. 方阵

矩阵中行数和列数相等的矩阵,称为方阵。

2. 行列式

行列式的原始定义:对任意行数与列数相等的方阵,按照固定的排列组合运算规则,能唯一计算出一个常数,这个常数就称为该方阵的行列式。符号表示:∣A∣

二阶行列式(2×2)用双竖线表示,内部元素按二行二列格式排列。

行列式最终运算结果只是一个数值

对于二阶行列式:

它的值为ad - bc

3. 伴随矩阵

伴随矩阵仅针对方阵定义:把方阵中每一个元素替换为对应的代数余子式,再将整体矩阵进行转置,最终得到的新矩阵就是原矩阵的伴随矩阵,记作 A∗。

对于我们即将使用的二阶方阵,有简便求解规则:主对角线元素互换位置,副对角线元素正负取反,即可直接写出伴随矩阵。

矩阵,则它的伴随矩阵为

4. 逆矩阵

逆矩阵是n阶方阵A对应的矩阵B,满足AB=BA=E(E为单位矩阵),此时A称为可逆矩阵,B为A的唯一逆矩阵,记为A⁻¹。单位矩阵的逆矩阵为其本身,零矩阵不可逆。

注:单位矩阵是方阵,其主对角线上的元素均为1,其他所有元素均为0

5. 逆矩阵与伴随矩阵公式

利用伴随矩阵和行列式,可以求解方阵的逆矩阵。

通用公式为:逆矩阵 = 行列式的倒数 乘以 伴随矩阵

记作:A⁻¹ = 1/∣A∣ 乘 ​A∗

只有当矩阵的行列式不为 0 时,矩阵才可逆,存在逆矩阵;若行列式为 0,则矩阵不可逆,无法求解逆矩阵。

2. 验证变换公式

注意: 以下的验证使用Godot中的坐标系,X轴向右为正,Y轴向下为正。

Godot中逆时针旋转局部旋转使用的是视觉上的旋转。

Y轴向下的坐标系的矩阵公式为

这里首先明确情况:

1. 有两个物体, A和B

2. A与B为兄弟节点关系(同层关系)

3. A的坐标系已经相对绝对坐标系逆时针旋转π / 4

4. B的坐标系和绝对坐标系一致,不旋转

以下是图片表示(以下矩阵内的内容为真实值,验证公式需要计算完成后使用真实值对比)

B在这里是单位矩阵

这里给出已知条件

世界坐标 = A.transform × A 局部坐标

我们需要验算将B的坐标系矩阵表示从绝对坐标系表示转化到使用A坐标系表示的转化公式

A.transform.inverse() * B.transform

其中A.transform.inverse()是 A 坐标系变换矩阵的逆矩阵,B.transform是 B 在世界坐标系下的完整变换矩阵。

1. 验证:A.transform.inverse() * B.transform

我们将通过计算公式得到的B的坐标系在A中的矩阵表示,来对比真实表示来验证等式

先求逆矩阵

A⁻¹ = 1/∣A∣ 乘 ​A∗

其中 1/∣A∣ = 1 / { cos(π/4) * cos(π/4) - [-sin(π/4)] * sin(π/4) } = 1

​A∗ =(这里因为打不了π和°,直接用数字代替,指45°)

所以A⁻¹ =

这里直接乘以B的坐标矩阵(单位矩阵)

可以直接得到B对A矩阵

这里我们可以发现与B真实的B对A的矩阵式一样的,但这里是单位矩阵的特例,只是一个验算,完整的证明将角度换成未知量即可

另外需要注意的是,对矩阵坐标系运算的时候,origin并不参与矩阵运算,只有前面 2x2 的非增广矩阵参与。

补充

Godot 的 Transform 包含线性矩阵和 origin 平移两部分,本文主要讨论线性部分的矩阵运算origin由引擎的affine_inverse()自动处理。

在Godot中完整的坐标系的坐标系计算是仿射变换,为

世界坐标 = 线性矩阵 × 局部坐标 + origin

反过来,从世界坐标转局部坐标时,需要先用逆矩阵抵消线性部分,再减去平移的影响:

局部坐标 = A.transform.affine_inverse().xform(世界坐标)

总结

本篇文章对 Godot(2D)架构细分3: 四大坐标系重点内容解释与使用_godot坐标系-CSDN博客 中坐标系变换的线性部分的矩阵运算进行了详细解释与推导,有助于了解Godot中四大坐标系。

同时,Godot 3D 的 Transform 变换原理,也可以套用本文同一套线性代数与坐标系构建思路去理解,具备通用参考价值。

返回总架构 针对Godot(2D)游戏架构的研究_godot(2d)最佳架构-CSDN博客

http://www.jsqmd.com/news/710225/

相关文章:

  • 【2026年版|建议收藏】大模型行业两极分化:基座应届生起薪150万,应用方向慎选!
  • 告别RSA?聊聊Curve25519和Ed25519在前后端API安全中的实战配置(附Java/Kotlin代码)
  • 3分钟掌握免费开源的鼠标键盘自动化工具KeymouseGo
  • 甜蜜点狙击:在亚马逊,如何找到“需求”与“独特性”的黄金交叉点
  • 基于i.MX6ULL平台的智能网关系统开发
  • 插件热更新失败?元数据注册崩塌?Python低代码插件化开发的12个生产级陷阱,90%团队正在踩
  • 从MATLAB到显示器:手把手教你用ZYNQ+HDMI打造一个简易的图片轮播器(附完整工程)
  • 中国环境统计年鉴(全国、地区、行业)最新整理面板数据2000-2020年
  • 第四章:TTM分析: 4.8.1 TTM Eviction 机制概述与触发流程
  • 多宇宙角色扮演基准测试:评估大型语言模型的新方法
  • 会议论文AI率高怎么救:比话降AI快速处理效果数据2026
  • 2026年武汉室内空气检测与除甲醛公司最新推荐榜:甲醛检测/除甲醛治理/CMA空气检测/母婴级除甲醛 - 海棠依旧大
  • 基于Win10 + WSL2 + Ubuntu22.04的AI探索(一)
  • 机会无处不在的具象化的庖丁解牛
  • 比亚迪 20000 座闪充站怎么建?时间表 + 建站模式 + 数量规划全解析(深度完整版)
  • 2026年4月白洋淀住宿优选指南:白洋淀望月岛10号院农家院、民宿、白洋淀周边游、京津冀周末游、白洋淀自驾游、白洋淀家庭出游、白洋淀短途旅行最新推荐 - 海棠依旧大
  • BookLib:解决AI编码助手知识过时,实现精准上下文注入的工程实践
  • Qwen Image LoRA训练:6GB显存实现高效微调
  • Pixelle-Video:3分钟实现AI短视频创作自由,打破语言障碍的终极指南
  • 中国农村统计年鉴最新整理面板数据(全国、各省)2000-2022年
  • 2026年3月料塔厂家推荐,耐腐蚀料槽/塞盘料线/养殖漏粪板/加厚不锈钢料槽/饲料储存塔/料线定制,料塔厂家口碑推荐 - 品牌推荐师
  • 企业内部通讯工具有哪些?4 款好用的内网聊天软件推荐
  • FanControl终极指南:三步打造完美的Windows风扇控制系统
  • Git仓库转纯文本工具repo2txt:原理、实现与工程实践
  • 面向对象设计的 **七大设计原则** 与 **十六种常用设计模式**(含简单工厂,严格意义上属编程习惯而非GoF23模式)
  • 拒绝“烂尾”!一文读懂泳池工程合规性、设备选型与全周期运维成本控制 - 深度智识库
  • 你的下一任同事,可能不是人
  • 2026年 - 海棠依旧大
  • 大语言模型在数学竞赛题中的表现与优化策略
  • 聊聊js中的math对象