游戏引擎中的物理系统

news2024/11/27 4:24:40

一、物理对象与形状

1.1 对象 Actor

一般来说,游戏中的对象(Actor)分为以下四类:

  • 静态对象 Static Actor
  • 动态对象 Dynamic Actor ---- 可能受到力/扭矩/冲量的影响
  • 检测器 Trigger
  • Kinematic Actor 运动学对象 ---- 忽略物理法则,由游戏逻辑直接控制(可能表现的反物理)

1.2 形状 Shape

由于真实世界中很多物体形状极其复杂,所以游戏中会先设定较为简单的对象。常见的物理对象的形状有如下:
在这里插入图片描述
每一种形状都有常用的实际游戏对象,比如Height Fields用来做地形等。
在这里插入图片描述

当我们利用这些对象去组成实际需要的物体对象时,有两个原则:

  1. 形状接近就好,不一定要完美
  2. 简单性。要尽量用简单的对象去拼接(比如尽量少用三角网格),且越少越好。

此外,一些比较重要的物理概念:

  • 质量和密度 Mass and Density
  • 质心(做载具时很重要)Center of Mass
  • 摩擦和恢复(弹性) Friction & Restitution

二、 力与运动

2.1 力 Forces

一般我们把力分成两种:

  • Force 可以理解为直接的重力、拉力、摩擦力等
  • Impulse 冲量,比如说爆炸导致的冲击力等(虽然其实冲量就是力x时间(恒力条件下))

2.2 运动 Movement

经典的定理(游戏中需要用数学表示):

牛顿第一定律 无外力 —> 匀速直线运动
在这里插入图片描述
牛顿第二定律 F = ma (质量的本质是改变物体物理状态的倾向性)
在这里插入图片描述
当这个力是恒力时:
在这里插入图片描述
当这个力是变力时:
在这里插入图片描述
其中上图中 v ( t ′ )中的 t 是二次积分(位移和时间关系公式就是二次的)

具体以圆周运动为例,如果简单去模拟物体随时间变化,并不是很困难。

但实际游戏中时间不是连续的,而是由一帧帧实现的,所以通常需要解决的问题是在已知当前物体位置和速度的前提下获取之后某时刻的物体位置和速度信息。
在这里插入图片描述

2.2.1 显示欧拉法 Explicit (Forward) Euler’s Method

最简单的估计方法,假设在这个时间片里力是恒定的

每一时刻仍按照传统的牛顿力学方法去计算:
在这里插入图片描述
这种方法下,由于实际游戏中的时间片Δt不可能和现实中一样小,所以会导致能量不守恒(变多)(如图中右侧所示,实际位移是偏多的),误差越来越大,物体逐渐甩出去。
在这里插入图片描述

2.2.2 隐式欧拉法 Implicit (Backward) Euler’s Method

与显示近似,不过将力的值和速度的值以未来(终点)为参考,如下图:
在这里插入图片描述
其中未来的值是假设能够通过解析解强行算出来的。
和显示方法类似,该方法的问题是能量会衰减,但由于这个衰减相对较慢,所以用户可能会认为是摩擦力、空气阻力等其他力的影响导致,从而使得这个衰减在游戏实际中相对不明显。
从另一个角度来说,我们在游戏引擎中设计中认为衰减肯定是好过增多的,前者顶多最后停下来,但后者会不可控会爆炸。
在这里插入图片描述

通过一系列复杂计算可以证明这种隐式方法是无条件稳定的。

但其缺点是:

  • 计算成本高(计算未来值)
  • 运动非线性时难以计算
  • 能量衰减。
2.2.3 半隐式欧拉法 Semi-implicit Euler’s Method

综合前两者的特点:
在这里插入图片描述
计算未来速度时用当前的力,计算未来位移时用未来的速度。
在这里插入图片描述

前提假设:力是不变的(很危险的假设,因为实际上力跟物体位置是相关的)。
优点是:

  • 条件性稳定
  • 计算简单有效
  • 随着时间的推移能够保存能量

缺点是:

  • 做一些sin cos等运动时,积分出来的周期会比正确值长一点点,所以在相位上会有偏移差。

三、 刚体动力学

前面所说的所有内容都是把物体看作一个质点的前提,然而事实上真实世界中大部分物体是有形状的。
一般来说,我们在引入旋转时大都针对刚体(因为柔体太难了),因为刚体就是假设物体的所有粒子之间绑定相对不动。
所以我们在刚体动力学中常常会比普通的线性计算(图中右侧)多一些概念,同一行概念有对应性:
在这里插入图片描述
具体相关概念建议看视频或讲义。

动量守恒:在宇宙中任意一个位置做实验的得到的结果是一样的–空间一致性
角动量守恒:在一个位置的任意一个方向做的实验得到的结果是一样的–朝向一致性
课外拓展:诺特定理

四、 碰撞检测

碰撞检测一般分为两个阶段:

  • Broad phase 初筛 – 利用AABB等找到刚体有没有相交
  • Narrow phase – 获取进一步信息(碰撞点、方向、深度等)

4.1 Broad Phase

一般常见的有两种方法:

BVH Tree – 更新成本低,适合动态场景。
在这里插入图片描述
在这里插入图片描述

Sort and Sweep – 先排序再逐个扫描,效率高,更符合大部分为静态物体小部分为动态物体的现实。更好。
在这里插入图片描述
在这里插入图片描述

4.2 Narrow Phase

4.2.1 Basic Shape Intersection Test

比较简单,把所有物体看作球或胶囊状去判断相交即可。

4.2.2 Minkowski Difference-based Methods

首先需要知道minkowski Sum(闵可夫斯基和)的概念,以两个三角形各自围成的点集为例,两个点集相加的结果是指所有A点集的点加上所有B点集的点,几何表示如下:
在这里插入图片描述
拓展到两个凸包也是一样道理。

然后同理,还有minkowski Difference(闵可夫斯基差)
在这里插入图片描述
简单讲就是化A-B为A+(-B)。而-B是利用对原点的对称获得。
这样一来就获得了一个很重要的结论(方法):
如果两个凸包有重叠,则它们的闵可夫斯基差必定包含原点
我们把闵可夫斯基差这些点形成的形状叫slmplex(单纯形)

由此问题转换为了如何判断两个凸包的闵可夫斯基差包含原点。
具体可查看我的文章:多边形碰撞检测算法

4.2.3 Separating Axis Theorem

如果两个物体分离,则肯定能找到空间中一根轴把它们分隔开,不然就是相交。
简单做法是把凸包A的每条边和凸包B的每条边当分隔线试试,比如对凸包A的边a,把所有顶点投影到这条边上去进行判断有没有重叠。如果所有边做分隔线都有重叠,那就是两个凸包相交。
在这个基础上,优化方法是取凸包A的某条边a做轴时,直接将凸包B的所有顶点投影到a的垂线上,因为这样可以保证凸包A的所有顶点都在垂线上a的一侧,所以只需要判断凸包B上所有顶点在垂线上的投影是否在另一侧就行。
延伸到3D空间,需要多加步骤:
在这里插入图片描述
简单讲就是如果只判断面的法线作为分隔线的可行性的话,会出现图中下面前两种情况,并误以为是两个物体相交,所以需要再加上一个检测来判断第三种情况。

五、碰撞解决

如果两个物体发生了碰撞,并且相交了怎么办?
在这里插入图片描述
最简单的早期是方法是加一个与重叠反方向的penalty force,但是会导致物体突然分隔开,很假。
现在比较合适流行的方法是利用拉格朗日力学中对速度的约束的方法。简单讲大概类似于给碰撞物体加个冲量从而影响下速度,看是不是还碰撞,不断重复直到可以接受。或者迭代次数过多不管了。
在这里插入图片描述

六、 场景请求

6.1 Raycast

通过发射一条光来判断场景中的某个点能否直接看到/射击到。

当这束光有多个撞击点时,有三种处理方式:

  • 都进行计算处理、
  • 只处理最近的、
  • any hits(不管哪个,反正有撞击就行)

6.2 Sweep

比如判断人有没有被挡住时是把人的整个胶囊体进行扫描判断的,只要有一部分被挡住就是被挡住了。

6.3 Overlap

比如判断手雷爆炸时能炸到哪些人。
在这里插入图片描述

七、 效率、准确性与确定性

  • Sleeping
    物理引擎中常把场景的不同物品或部分分成所谓不同的island,而引擎设计中很重要的一部分是让没有变化或不需要参与计算的island进入sleep,所以如何让更多island进入sleep从而减少计算量是一个关键问题。
  • Continuous Collision Detection(CCD)
    当一个快速运动的对象碰撞一个比较薄的物体时容易发生错误直接穿过去(因为前后两次计算时发现都没有碰撞,但其实不可以)
    一种比较质朴的方法就是把墙等物体做的厚一点。
    更规范的做法就是CCD:先计算一个安全时间(在这个时间内两个物体不会碰撞),然后开始一点点详细计算会不会碰撞,知道它们的距离小于一定阈值。
  • Deterministic 确定性
    游戏引擎设计时需要保证确定性,即同样的代码操作下跑起来是要尽可能一样的,而不会受那么多复杂计算和浮点问题的影响导致不同(从而在Online Gaming)中出现两方不一样的问题。

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

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

相关文章

go: go.mod file not found in current directory or any parent directory.如何解决?

这个错误表明你正在执行 go get 命令&#xff0c;但是当前目录或任何父目录中都找不到 go.mod 文件。这可能是因为你的项目还没有使用 Go Modules 进行管理。 要解决这个问题&#xff0c;有几种方法&#xff1a; go mod init <module-name> 其中 <module-name>…

【力扣】11. 盛最多水的容器

11. 盛最多水的容器 题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&…

Python | Leetcode Python题解之第7题整数反转

题目&#xff1a; 题解&#xff1a; def reverse_better(self, x: int) -> int:y, res abs(x), 0# 则其数值范围为 [−2^31, 2^31 − 1]boundry (1<<31) -1 if x>0 else 1<<31while y ! 0:res res*10 y%10if res > boundry :return 0y //10return re…

数字化赋能农业:数字乡村促进农业现代化

随着信息技术的迅猛发展&#xff0c;数字化浪潮正以前所未有的速度席卷各行各业&#xff0c;农业领域也不例外。数字乡村战略作为推动农业现代化的重要手段&#xff0c;通过数字化技术的深度应用&#xff0c;为农业生产带来了革命性的变革。本文旨在探讨数字化如何赋能农业&…

用于HUD平视显示器的控制芯片:S2D13V40

一款利用汽车抬头显示技术用于HUD平视显示器的控制芯片:S2D13V40。HUD的全称是Head Up Display&#xff0c;即平视显示器&#xff0c;以前应用于军用飞机上&#xff0c;旨在降低飞行员需要低头查看仪表的频率。起初&#xff0c;HUD通过光学原理&#xff0c;将驾驶相关的信息投射…

隐私计算实训营第七讲-隐语SCQL的架构详细拆解

隐私计算实训营第七讲-隐语SCQL的架构详细拆解 文章目录 隐私计算实训营第七讲-隐语SCQL的架构详细拆解1.SCQL Overview1.1 多方数据分析场景1.2 多方数据分析技术路线1.2.1 TEE SQL方案1.2.2 MPC SQL方案 1.3 Secure Collaborative Query Language(SCQL)1.3.1 SCQL 系统组件1.…

C++ 2024-4-2 作业

1.模板类实现顺序栈 #include <iostream> #define MAX 8 using namespace std; template<typename T> class stack {T data[MAX];int top; public:stack():top(-1){}bool empty_stack();bool full_stack();void push_stack(T data);void pop_stack();void show();…

用于AGV物流机器人的爱普生陀螺仪传感器XV7000系列

适用于AGV物流机器人的爱普生陀螺仪传感器XV7000系列:XV7001BB&#xff0c;XV7011BB。以前我们都知道XV7001BB&#xff0c;XV7011BB适用于扫地机器人&#xff0c;其实对于AGV物流机器人来说&#xff0c;XV7000系列生陀螺仪传感器也是其中重要一环。AGV机器人又叫做AGV搬运机器人…

刷题DAY41 | LeetCode 343-整数拆分 96-不同的二叉搜索树

343 整数拆分&#xff08;medium&#xff09; 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 思路&#xff1a;动态规划 动规五部曲&#xff0c;分析…

Penpad Season 2 质押突破350ETH,还有望获Scroll生态空投

Scroll 是被 Vitalik Buterin 给予高度评价的 zk Rollup Layer2 项目&#xff0c;也一直是市场长期关注的重点。自 10 月 17 日宣布主网上线后&#xff0c;Scroll 的热度节节攀升&#xff0c;目前其 TVL 达到 1.5 亿美元&#xff0c;是众多 Layer2 生态中 TVL 数据增长最快的生…

九河云:在AWS上实现跨region VPC互联

如何跨region实现不同VPC之间的对等链接&#xff1f;九河云为您介绍AWS跨region连接方案。 说明&#xff1a;VPC-A位于弗吉尼亚region&#xff0c;VPC-B位于俄勒冈region 本文将在同一账户的弗吉尼亚和俄勒冈VPC中各启用一台EC2&#xff08;本文已提前创建好VPC、EC2等资源&am…

非线性SVM模型

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个非线性SVM模型程序,最后打印5个条件分别的影响力。 示例一 在非线性支持向量机&#xff08;SVM&#xff09;模型中…

OpenCV 4.9基本绘图

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV使用通用内部函数对代码进行矢量化 下一篇&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; ​目标 在本教程中&#xff0c;您将学习如何&am…

【云呐】固定资产盘点报告表怎么填

报告表以表述清晰为主,避免繁琐,重要数据及问题使用表格形式展示。通过签字对报告负责认同度。内容应全面反映本次盘点,提供参考依据。一、标题 包含单位名称、报告期间等基本信息二、前言 概括本次盘点的目的和任务签署三、盘点范围与时间 明确盘点的固定资产项目和时…

代码签名证书OV跟EV的区别

代码签名证书中的OV和EV分别代表“Organization Validation”&#xff08;组织验证&#xff09;和“Extended Validation”&#xff08;增强验证&#xff09;。这两种类型的代码签名证书均用于对软件或应用程序进行数字签名&#xff0c;确保用户下载的代码来自于经过验证的真实…

git源码泄露

Git 源码泄露 开发人员会使用 git 进行版本控制&#xff0c;对站点自动部署。但如果配置不当&#xff0c;可能会将 .git 文件夹直接部署到线上环境&#xff0c;这就引起了 git 泄露漏洞&#xff0c;我们可以利用这个漏洞直接获得网页源码。 确定是否存在泄漏 &#xff08;1&…

开发必备8套工具都有哪些你知道嘛?

经过多年的使用&#xff0c;收集。我发现大部分的人员都在使用上面的某一种工具来开发。 认识了解上面开发环境工具&#xff0c;有利于你更快的写出高效的代码。没有看错上面是全部的8套 我把他们捆绑在一起。目的就是为了更好的让大家。学习。不管你是java的。.net语言的。p…

目标检测、识别和语义分割的标注工具安装

计算机视觉 图像分类&#xff08;目标检测&#xff09;&#xff1a;一张图像中是否含某种物体物体定位&#xff08;目标检测与目标识别&#xff09;&#xff1a;确定目标位置和所属类别。语义分割&#xff08;目标分割和目标分类&#xff09;&#xff1a;对图像进行像素级分类…

酷开科技不断深耕智能电视领域,用酷开系统带给消费者更多可能性

在这个网络快速发展的时代&#xff0c;电视行业也发生了巨大变革。与以往单纯的“看”电视不同&#xff0c;人们不再满足于现有的状态&#xff0c;消费者对电视娱乐的追求更加丰富&#xff0c;这也就带给智能电视产业无限的发展可能。酷开科技瞄准这一产业趋势&#xff0c;不断…

Android adb ime 调试输入法

目录 前言列出所有输入法仅列出输入法 id列出所有输入法的所有信息 启用/禁用 输入法启用输入法禁用输入法 切换输入法还原输入法 前言 安装多个输入法后&#xff0c;可以在设置里进行切换。 既然是开发&#xff0c;能用命令就就命令~ ime 帮助说明&#xff1a; ime <c…