物理引擎如何实际模拟物理?

Jim*_*inP 18 physics-engine

这个问题可能是一个愚蠢的问题,但我真的很好奇.

在玩过像HL2,GMod或者愤怒的小鸟这样的游戏,并使用像Box2D这样的物理库之后,我开始怀疑"物理引擎如何模拟物理?"

像词法和语法分析器用于编译时理解代码,并使用光线跟踪渲染3D场景,我认为有一些概念(比碰撞检测等),它们在物理引擎来模拟物理,如计算力矩和五边形进行桶滚动的速度.

物理引擎如何实际模拟物理?使用了什么概念?网上是否有关于制作像这样的物理引擎的"教程" ,它展示了光线追踪?

key*_*rdP 20

创建(强大的)物理引擎比起初看起来要复杂得多.诀窍是尽可能假,而不是计算确切的值.作为一个起点,这篇博文有一个很好的介绍.我认为托马斯·雅各布森的这篇论文也是一本很好的读物并介绍了某些概念.这篇博客还有一些有趣的文章解释了集成商的细节以及如何管理在线游戏的物理.

浏览Box2D这样的物理引擎的源代码是一个很好的想法,看看实现,但如果你不知道他们正在做什么的理论,它可能会让人感到困惑.其原因在于,理论通常在实时游戏中实施效率太低,因此使用算法和技术在现实主义和速度之间取得平衡.

如果您要创建自己的物理引擎,因为您想在商业游戏中使用它,我建议您选择现有的解决方案.(例如,"愤怒的小鸟"使用Box2D).但是,如果你是为了体验和学习物理引擎而做的,那肯定会教你很多关于效率和智能技术的东西.


The*_*ran 11

原则上,所有物理引擎都只是牛顿第二运动定律的直接应用:

加速度=力/质量

通过随时间积分加速度,您可以获得速度.通过积分速度,您可以获得物体在空间中的位置.使用Runge-Kutta之类的东西以数字方式执行积分.

主要的并发症来自:

  • 处理旋转运动
  • 处理冲动事件,例如碰撞和爆炸
  • 检测速度极端的碰撞.在高速行驶时,在检测到碰撞之前,物体最终会穿透或甚至穿过彼此.在低速时,强有力地处理搁置在另一个物体上的物体而不会抖动或滑动是一个挑战
  • 运动连接,物体彼此部分约束(如铰链或滑块)
  • 计算复杂物体(如汽车或飞机)的力和扭矩
  • 为数百或数千个对象实时高效地完成所有这些操作

一个好的起点是模拟在重力影响下在二维盒子中弹跳的单个粒子.然后,给粒子一个半径,添加更多粒子,并计算它们之间的碰撞.那时,你有一个基本的物理引擎足以用于简单的游戏.