然而,有些人在玩的时候不禁会想,游戏中的物理过程怎么如此逼真,比如水中的涟漪、雪地里的行进痕迹等等,这些是如何实现的呢?为什么会出现这些有趣的现象呢?这些现象对物理学本身有什么启发?让我们一起走进游戏的物理世界吧。
碰撞检测,虚拟中的“硬物”
经典物理世界中最常见的事件就是碰撞,所以如果你想让游戏足够真实,碰撞一定是第一个需要考虑的过程。
我们先来看看经典世界的碰撞是如何发生的。
F 是物体上的合力,m 是物体的质量,a 是加速度。通过计算物体在每一时刻的合力和力矩,我们就可以得到物体在现实生活中的物理状态。同样,回到我们的游戏世界,物理引擎可以使用此方法来更新其速度和位置。
在 Unity 3D 中模拟碰撞
在计算机中,这通常是通过数值积分方法来实现的,例如欧拉方法、龙格-库塔方法或更稳定和先进的半隐式积分器。在游戏中,通常会优先考虑计算效率和稳定性,以保证每帧刷新都能快速获得近似准确的物体位置和状态。
但由于我们都知道现实世界是经典连续的,但是游戏世界的模拟需要根据每个对象的状态逐帧更新每个对象的位置。用于物理模拟的帧速率越高,计算结果肯定会越准确。
例如,我们计算两个小球的碰撞。当碰撞发生时,根据两个小球的速度、速度方向、材质、碰撞深度计算碰撞结果,同时更新两个小球的状态。然而,两个刚性物体在现实世界中不会“重叠”。真正的碰撞发生在两个球接触的瞬间或者从接触到变形到碰撞结束的整个过程。
游戏中重叠引起的碰撞示例
但由于物理引擎是逐帧更新位置并计算碰撞结果的,因此无法保证碰撞的时间点恰好在某一帧上,也无法真正完全动态地模拟两个过程中的每一个细微变化。小球从接触到离开。 ,两帧之间的碰撞信息实际上丢失了,这导致了许多更复杂的碰撞,有时看起来非常违反直觉。
许多现代游戏引擎通过将游戏的计算帧速率与其实际帧速率分开来避免这个问题。但影响碰撞的不仅仅是帧速率。
实际游戏过程中为了美观,建模非常复杂。一般来说,模型有数千个三角形。然而,当物理引擎计算这些原始模型的碰撞时,计算量会呈几何级数增长,或者由于奇怪的建模角度,碰撞计算会给出与现实相差较大的结果。所以我们需要简化物体的物理形状,也就是我们在游戏中常说的碰撞体积。
此外,碰撞中还需要考虑材质、摩擦力、空气阻力、挤压现象等问题。
限制:自由受到限制
除了刚体的碰撞之外,游戏中自然也少不了很多部件的连接和旋转。这是幕后起作用的约束的物理概念。例如,游戏中的小人想要抓取一个物体,就相当于对手与物体的接触面进行了约束。
在物理引擎中,约束用于限制物体的运动范围和相对位置。它们在游戏和模拟中有着广泛的应用,比如角色骨骼动画、机械臂、轮子等。在模拟过程中,如果约束做得不好,你可能会得到一个非常奇怪的游戏画面。
在经典力学中游戏引擎,约束是描述系统中对象之间或对象之间关系的条件。约束理论是研究如何考虑多体系统中运动约束的分支。根据自由度的不同,物体之间的相对运动受到不同类型的限制。
在物理引擎中,约束通常用数学方程来描述,并基于经典力学中的拉格朗日力学和牛顿力学来求解。
物体之间的相对运动是由施加在物体上的约束力(Constraint Forces)决定的。这些约束力使物体遵循约定的运动轨迹,并防止它们以不符合物理定律的方式移动。具体来说,约束力通过改变物体的加速度来限制物体的自由度,从而确保其运动不违反约束。
角色的关节是一种约束形式,称为铰链关节,它允许两个对象绕轴旋转,同时限制其他自由度。其物理原理可以追溯到惯性矩和角动量守恒。
在实际游戏中,约束也存在限制计算量的问题,而计算量需要简化,因此游戏通常会预设通用约束3D素材,例如以下
PhysX 中的关节示例
布料和流体模拟:
物体的变形和流动
游戏中通过软体、布料和流体的模拟来呈现物体的变形和流动行为。这些行为不仅遵循经典物理定律,而且依赖数值计算方法来实现。通过这些模拟,游戏可以展示更加细腻、真实的物理效果,比如角色在水中奔跑时产生的涟漪,以及挥舞武器时吹动附近植被的效果。
软体是指在外力作用下能够发生形变的物体。与刚体相比,它们不再是完全不可变形的。软体模拟的核心目标是准确描述物体受力时的变形行为。
柔性体的变形与物理学中的应力和应变密切相关。应力描述了物体在外力作用下内力的分布情况,通常用应力张量来表示。应变描述了由于外力引起的物体形状或体积的变化。
应力与应变的关系:弹性体在应力作用下会产生线性或非线性应变。最常用的模型是胡克定律,它描述了材料在小变形下的线弹性行为:
粒子模型示意图
粒子模型是计算简单软体最常用的方法之一。在该模型中游戏引擎,物体被离散成多个质点氛围,每个质点通过弹簧相互连接,以模拟材料的弹性行为。每个粒子的运动方程由牛顿第二定律给出。
Bullet引擎显示的布料效果
对于更复杂的物体变形,我们可以使用有限元方法。它通过将对象划分为许多小单元(例如三角形或四面体)并求解每个单元的应力和应变来模拟对象的整体行为。该方法通常用于模拟更精细的物体变形,可以处理非线性和大变形。
流体模拟是物理引擎中最具挑战性的任务之一,特别是在真实性方面。流体行为深受连续介质力学的影响,特别是流体动力学和热力学。
流体的运动遵循纳维-斯托克斯方程,这是描述粘性流体流动的基本方程:
方程左边是惯性项,描述流体动量的变化;右边第一项是压力项,描述压力梯度产生的力,流体从高压区流向低压区;第二项是粘度项,描述了流体流动时的内摩擦(粘度)效应,这部分与流体速度场的梯度有关;第三项是体积粘度项,这部分是考虑流体的体积粘度;最后一项是外力。
对于不可压缩流体:
那么我们可以忽略体积粘度项。在游戏中,我们甚至可以忽略粘度项,只考虑二维情况,得到一组非常简化的方程,大大减少了计算量:
然而,所得的流体模拟相对简单。例如,我们在游戏中很难看到水面上长距离的波纹,相当于忽略了长波长的流体波动。
《黑神话》打斗时水面泛起的涟漪
游戏模拟与科学研究的区别
无论是在游戏开发领域还是科学研究领域,都需要模拟物体的运动和交互。但游戏中的刚体模拟与科学研究中的刚体模拟在目标、精度、计算方法、约束条件和求解策略等方面存在明显差异。
游戏中的模拟主要关注实时交互性和视觉真实感。尽管游戏中的物体根据牛顿力学原理运动,但为了实现更好的用户体验和更快的计算速度,模拟的准确性和细节往往被简化。模拟结果更多地用于增强玩家的沉浸感,而不是精确的物理预测。
科学研究中刚体仿真的目标通常是精确建模和性能评估,用于分析物体的力学行为、设计优化或实验验证。模拟的目的是为实际应用、理论研究或物理现象的验证提供可靠的结果。
尽管游戏中的模拟和科学研究中的模拟都基于相同的物理原理,但游戏中的模拟通常会被大大简化,以确保可以在每一帧中有效地计算物体的运动。
不知道大家对于游戏中的物理原理有没有更深入的了解呢?最后,这是《黑神话》的游戏画面。你可以想一下这里面涉及到多少个物理模拟过程。
参考
[1] 埃伯利,D. (2003)。 “游戏物理学”。摩根·考夫曼。[2]威特金,A. 和巴拉夫,D. (2001)。 “基于物理的建模:原则与实践。” SIGGRAPH 课程笔记。[ 3][4]
[5]
策划及制作