如何制作一个2D软体物理引擎?

30
在 Box2d 中,刚体的定义是:

一块物质,它的强度非常高,以至于块上任意两点之间的距离完全保持不变。

这正是我所不想要的,因为我希望制作出二维(也许最终会是三维)、有弹性、可变形、可破碎,甚至有粘性的物体。
我希望从这个社区得到的资源可以教给我物体弯曲、断裂和相互作用背后的数学原理。我不关心这些物体的分子或化学性质,但当我尝试搜索如何计算一个木头、金属、橡胶、黏液、液体、有机材料等物体在受到力作用后看起来像什么时,通常这些都是我能找到的。
此外,我是一个很视觉化的人,因此图解之类的东西对我非常有帮助。
================================================================================ 请忽略这些问题,它们已经过时了,我只是将它们放在这里作为背景 1.是否存在像这样的简单的 2D 软体物理引擎?最好是免费或开源的吗?
2.如果没有,是否有可能在不花费多年时间的情况下自己制作一个?
3.我可以使用现有的引擎(如 Bullet 和 Box2d )作为起点,并简单转换它们的代码,还是这会导致更多的问题,考虑到我的 1 年编程经验和 Bullet 是 3D 的?
4.最后,如果我要改变另一个库,将改变 Box2D 的已经是 2D 的代码、Bullet 的已经是软体的代码,还是混合两者的源代码会是最好的选择?
谢谢!

我不相信会有一个“简单”的物理引擎能够完成您所要求的功能。正如布鲁斯所提到的,一个通用的非刚体物理引擎将会非常复杂。然而,实现一些特殊情况可能是一个很好的练习。例如,您可以使用由弹簧连接的节点网格来模拟一张橡胶片。 - tskuzzy
我知道编写自己的物理引擎需要很长时间,甚至需要数年。然而,一旦所需技术变得更加熟知,所需时间就会减少。即使解决“点”运动所需的方程也需要范畴论和拉回,因此通常被认为并不容易。 - tp1
投票关闭为过于宽泛。 - Ciro Santilli OurBigBook.com
5个回答

17

(1) Bullet和PhysX都支持某种方式的可变形对象。Bullet是开源的,而PhysX可以免费使用。它们都有适用于Windows、Mac、Linux以及所有主要游戏机的端口。

(2) 如果你确实知道自己在做什么,也许可以拼凑一些东西,甚至可能会起作用。然而,除非你真的非常了解Box2D的顺序冲量约束求解器的工作原理以及保持系统稳定所需的措施类型,否则可能会出现漏洞。话虽如此,在类似于游戏的环境中,还有许多方法可以使可变形对象能够在最小的麻烦下工作。第一种选择是采用二次(或更高阶)近似变形。这样,您可以像处理刚性运动一样处理变形,只不过现在有一些额外的自由度。例如,可以参考以下论文:

http://www.matthiasmueller.info/publications/MeshlessDeformations_SIG05.pdf

第二种方法是压力软体,基本上将物体建模为一组具有一些距离约束和压力力的粒子。这就是PhysX和Bullet所做的,这是一种相当标准的技术(例如,Gish就使用了它):

http://citeseerx.ist.psu.edu%2Fviewdoc%2Fdownload%3Fdoi%3D10.1.1.4.2828%26rep%3Drep1%26type%3Dpdf

如果你在谷歌上搜索,你会找到很多有关实现它的教程,但我不能保证它们的质量。最近,有一个更加前沿的趋势,尝试使用真实的弹性模型和有限元方法来做可变形物体。这仍然是一个活跃研究领域,不适合心理承受能力较低的人。例如,你可以看看今年SIGGRAPH论文集中的任何一篇文章:http://kesen.realtimerendering.com/sig2011.html

(3)可能不行。虽然有些2D风格的游戏可以利用3D物理引擎(例如从上往下的游戏类型)进行特效制作。

(4) 根据我刚才所说的,你应该已经知道答案了。如果你具有冒险精神,有时间和意愿去学习,那么我建议你去尝试!当然,一开始会很困难,但像任何事情一样,随着时间推移,它会变得容易。此外,学习新东西是非常有趣的!

另一方面,如果你只是想要立即获得结果,那么不要这么做。它会花费很多时间,而且你可能会经常失败。如果你只想制作游戏,那么坚持使用现有的库,并在提供给你的任何抽象基础上构建。


关于2D物理引擎,我需要一个适用于子弹级别的引擎,但是要设计用于2D实现。 - Griffin
1
嗯,我不知道有哪些好的2D软体模拟器。我认为人们目前采取的方法是自己开发。话虽如此,2D比3D容易处理得多,所以如果你想尝试一下,这可能是一个很好的学习经验。如果你真的很想做这个,我建议你在谷歌上搜索一下并研究一下压力软体。 - Mikola
你能否看一下我新修改的第三个问题?它问我是否可以将一个3D物理API转换为2D。 - Griffin
我已经更新了,但答案是它可能不会很顺利。要做2D,你需要添加一堆约束条件,而且系统会变得非常不稳定/慢。 - Mikola

5

快速而部分的回答:

  • 刚体由于其属性易于建模(您可以使用物理工具,例如“Torseur+(维基百科上的法文链接,英文等效指向螺旋理论)”来建模作用于元素任何点的力。
  • 相比之下,非固体元素从几乎固体(想象一下非常硬的橡胶:它可以移动但几乎是固体)到几乎液态(想象一下非常柔软的橡胶,乳胶)。这种对象适用的动态属性更加复杂,并且取决于对象的性质。
  • 以弹簧为例:单独建模很容易(f=k.x),但创建一个能够模拟该特定情况的通用工具则是一场噩梦(特别是如果考虑到边角情况:伸展不是无限的,压缩达到较低点,材料是非线性的...)
  • 据我所知,在处理“弹性”材料时,人们会为自己的特定目的进行建模(通用模型不存在)

现在回答:

  1. 可能没有,至少我不知道
  2. 不容易,见上述原因
  3. 除非您具有弹性材料的高级背景,否则我担心这将是痛苦的

希望这有所帮助。


你能否看一下我新修改的第三个问题?它问我是否可以将一个3D物理API转换为2D。 - Griffin
另一个答案的文档比我的好得多,我要点赞他。 - Bruce

4

2

根据您所需的可变形物体的复杂程度,您可以使用box2d来模拟它们,并使用关节或弹簧约束刚性物体。我曾经在过去使用了一个xna的box2d克隆版(farseer)并且效果很好。希望这能帮到您。


1

你的问题可以分为两个不同的主题:

  1. 非弹性碰撞:这里的数学很简单,你可以自己写一个相当不错的库来处理二维点/球,只需要付出一些努力。 (如果更加努力,你还可以学习扩展体的物理学)。
  2. 材料的弯曲和断裂:这将是困难的。通常情况下,你将不得不模拟机械工程中的许多主题:
    1. 连续介质力学
    2. 结构分析
    3. 失效分析
    4. 应力分析
    5. 应变分析

我并不是在轻率地说话。建模材料的弯曲和破裂通常是一个非常详细和多样化的主题。这需要很长时间。而且成功的唯一方法就是要充分理解科学,以便在游戏中限制你需要建模的科学范围时可以做出聪明的捷径。

然而,你问题的另一半(建模非弹性碰撞)是一个更可实现的目标。

祝好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接