物理引擎到底是什么?


57

一个程序应该接受输入,对其进行处理并给出输出。那么,物理引擎究竟将什么作为输入并作为输出提供呢?


36
人们用很多术语质疑。无需仅仅因为基本问题就可以否决基本问题。
MichaelHouse

16
将程序描述为“应该接受输入,对其进行处理并提供输出”的描述是如此荒谬的简化和简化主义的思考方式,认为它是无用的。想一想您将如何回答“程序应该接受输入,对其进行处理并提供输出。那么,游戏究竟将什么作为输入并作为输出提供呢?”,您可以回答这个问题,但这不是思考问题的有用方法。游戏。
杰克·艾德利

10
@JackAidley我明白您的意思,但实际上,游戏非常像这样:输入:击键和鼠标/操纵杆运动,输出:有趣的屏幕上的图像和有趣的扬声器声音。是的,它很简单,但是可以帮助理解什么是“游戏”在计算上,以我的经验,这也是思考代码体系结构,资产设计,项目管理等的一种极其有用的方法(当然不是唯一的方法)。
wjl

Answers:


58

物理引擎负责模拟对象的运动和反应,就像它们在现实世界(或类似于现实世界)物理的约束下一样。我应该指出,它通常不是独立的程序,而是更大,更有趣的程序(例如游戏)的组成部分。

物理模拟的输入通常是对象(“物体”)的集合,这些对象具有属性(例如,它们是刚性的还是柔软的,它们的质量,形状等)以及作用在这些物体上的力的集合。

根据该输入,引擎将模拟车身的更新位置和方向,并应用(“输出”)它们。通常,当对象发生碰撞或重叠时,该模拟步骤将以回调的形式包含在模拟步骤的输出中,客户端代码可以将其插入以处理与碰撞有关的特定游戏逻辑。


6

输入速度,质量和时间,输出为新速度。有时旋转/角动量也是输入和输出。

本质上,物理引擎试图模拟重力和碰撞的影响。对于更好的物理引擎而言,这意味着它们既包括对象的永久变形也包括临时变形,包括将对象分解为多个对象以及对象的角动量。理想情况下,他们还可以模拟压力,例如,多少辆卡车可以越过这座桥直到倒塌,但这很少见。诸如空气阻力之类的其他模拟变量也可以算作物理引擎,但据我所知,这些还没有进入任何游戏。

大多数物理引擎在某种程度上都是专门化的,并将模拟物理到游戏必需的程度。汽车游戏的物理引擎通常与3D射击游戏的物理引擎完全不同。高尔夫游戏的物理引擎可能对高尔夫球和各个草叶之间的相互作用进行了过多的计算,而完全忽略了高速碰撞和汽车变形的处理(以防被高尔夫球击中) 。


1
我想指出的是,空气阻力实际上是物理引擎的一个普遍特征。任何将终极速度应用于掉落物体的游戏都在模拟空气阻力。
Patrick Roberts

@PatrickRoberts终端速度并不是我提到空气阻力时所想的。这就像说Pong拥有一个模拟动力学影响的物理引擎。
彼得

12
公平地说,从广义上讲,确实如此。它可以在失重的环境中模拟完美的弹性碰撞。我知道模型可以简单化,但这就是为什么将它们称为模型的原因,因为它们是我们在现实中遇到的现象的实际近似。
帕特里克·罗伯茨

4

通常,物理引擎用于使游戏中的对象相对于其环境以逼真的方式表现,而不必为每种可能的场景设计特定的动画。

具体来说,物理引擎将采用具有一组属性(质量,关节等)的模型,并根据一组参数在游戏中进行渲染。

早期的例子是raggdoll引擎(例如,在虚幻引擎中),该引擎模拟了li脚身体掉下台阶的方式等。

在当前技术中,物理引擎通常会与AI,游戏内UI,过场动画等紧密集成在整个游戏设计包中。

您当然可以争辩说物理引擎可以追溯到游戏设计的曙光,例如pong可以被认为是粗糙的物理引擎。但是,主要要点是物理引擎能够基于一组参数动态生成动画点,而不仅仅是使用来自运动捕捉或手动动画的预定动画序列。

如其他答案中所述,在某些类或游戏(如驾驶或飞行模拟)中,物理引擎可能是游戏的基础,因此将成为驱动屏幕动画的主要输入。尽管该术语通常用于通用工具,但它可以应用于各种情况,而无需开发人员非常具体地了解或分析所讨论的上下文,而不是从地面构建的非常具体的模拟器为特定的应用程序。


4

物理引擎负责模拟“世界”中物体的运动(无论在引擎环境中意味着什么)。如今,大多数物理引擎都使用牛顿力学来完成此任务,因为它们相对容易模拟,并且对于大多数用途而言“足够精确”,除非您要进行空间模拟。

从理论上讲,“纯”物理引擎将接受三个输入:

  • 截至最后“滴答声”(引擎必须建模的最后时刻)的世界状态(物体,它们的位置和速度)
  • 自上次滴答发生以来已经过去了多少时间
  • 自上次滴答以来一直作用于世界各个物体的力的清单

考虑到惯性和作用力,发动机使物体移动。物理引擎的输出只是“世界”的新状态,然后游戏可以读取并根据需要进行修改。

在实践中,物理引擎不一定如此“纯净”。需要创建和销毁对象,有时还需要按照物理引擎的法律不允许的方式来移动它们。有时可以在引擎外部完成此操作,但有时可以在引擎内部完成,为此,引擎需要更多的输入。但是上面提到的三个输入涵盖了基础知识。

例如,假设您需要使用操纵杆在游戏中移动角色。如果您不使用物理引擎,那将非常简单:当您看到用户正在移动操纵杆时,就可以相应地移动对象。使用物理引擎时,您不会直接移动对象:您要向对象施加力(对应于希望对象移动的方向),然后让引擎处理实际移动它的方向

有什么不同?即使世界上没有别的东西,物体也不可能以完全相同的方式移动,因为物理引擎将处理诸如现实加速之类的事情。但是也有可能其他力可能同时作用在物体上,惯性也可能会发生作用,发动机会考虑所有这些力。例如,如果在对象上施加了向北的力,但又有其他东西在向西施加力(或对象已经向西移动,并且没有任何减慢的速度),则引擎会将对象向西北移动。

这就是物理引擎为您提供的:它跟踪对象,它们的位置和速度以及作用在它们上的力。得益于力学定律,它甚至可以自行产生一些力来自动处理碰撞,摩擦和重力之类的事情,而游戏开发人员无需您做任何额外的工作。


1

物理引擎基本上是物理物体的模拟器。

输入项

它允许您创建一个(或多个)物体来指定其物理性质,例如质量,大小,密度等。

它还允许您定义模拟发生的物理世界的属性(例如重力)。

最后,它允许您在实体之间施加力或创建关节。

输出量

一旦定义了所有这些内容,就可以开始模拟,然后物理引擎会告诉您在下一个时间步长(通常对应于游戏中的下一帧)每个身体的放置位置。还有下一个,依此类推...

您会看到Sprites在屏幕上移动,因为游戏引擎的每一帧都会询问物理引擎

这个尸体现在在哪里?

游戏引擎会相应地更新图形表示。

注意事项

我通常喜欢将物理引擎看作是一种以声明性方式应用物理定律的工具。

实际上,不是编写代码来描述应该执行哪些计算以确定下一时间步中的物体在哪里,我只是描述设置物体(以及物理世界本身)属性的物理世界,然后让物理引擎回答这个问题对我来说。


(对我而言)您的“注意事项”部分并不十分清楚。如果您将其改进为更清晰,具体/实用(例如,提供您观察,构建的实际系统示例),那么我将给您+1。
code_dredd 16/09/12

@ray:谢谢你的建议。我会尽快修复!
卡·安吉莱蒂

完成后,请务必向我发送评论,不要着急。以后对其他人应该有用。
code_dredd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.