【问题标题】:How to implement n-body simulation with pymunk?如何用pymunk实现n体模拟?
【发布时间】:2017-10-20 08:18:39
【问题描述】:

我是 pymunk 的新手,我想实现一个像这样的 n 体模拟(二维):https://www.youtube.com/watch?v=otIGNTFJwpU&feature=youtu.be

我已经知道如何使用 pygame 创建空间、形状和渲染。我的问题:有没有办法在 pymunk 中的形状之间添加引力?

感谢您的帮助。

【问题讨论】:

  • 也许你可以展示你已经尝试过的东西,或者描述你所做的研究?你如何确定这不能由 pymunk 完成?
  • 好的,我已经做的是用身体创造空间。现在我需要在每对物体之间施加引力。我的第一个猜测是使用pymunk.constraint,它描述了两个物体如何相互作用。然而,这个类只包含["PinJoint", "SlideJoint", "PivotJoint", "GrooveJoint", "DampedSpring", "DampedRotarySpring", "RotaryLimitJoint", "RatchetJoint", "GearJoint", "SimpleMotor"],并且调整这些来重现引力似乎并不明显。
  • 请您编辑您的问题以包含您已有的代码(使用 4 个空格格式化为代码)。您可能想要使用的方法是在系统中的主体上使用双 for 循环。然后用the inverse square law算出大小,在物体中心用apply_force_at_local_point
  • 虽然它是用 C 语言编写的,但有一个名为“Planet”的 Chipmunk(Pymunk 包装)演示可能会对您有所帮助。您可以在 Chipmunk github 页面 here 找到它。

标签: python pygame physics-engine pymunk


【解决方案1】:

在 pymunk 中没有内置的方法可以直接执行此操作。最简单的可能是自己计算。循环身体并为每个身体进行空间查询以找到附近的身体。计算产生的重力并使用应用脉冲。

(可能可以用其中一种约束来模拟,例如销接头或阻尼弹簧。但这需要一些思考和实验来确定它是否可能并且看起来不错)

【讨论】:

  • 您好 Viblo,谢谢您的回答。最终,我进入了 Chipmunk 源代码并复制了 cpDampedSpring 并修改了 apply_impulse()(参见我的 fork here)。当我也更新了 python 包装器时,我现在可以在对象之间添加“引力”约束,我不需要自己做循环。它似乎运作良好,但如果您有改进的想法,请告诉我。感谢 pymunk。
  • 有趣!也许您可以针对主要的 Chipmunk 存储库 (github.com/slembcke/Chipmunk2D) 进行 PR,以防此约束对更多人有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 2018-08-08
  • 1970-01-01
  • 2022-01-22
  • 2018-01-14
  • 2017-07-07
  • 2015-04-13
相关资源
最近更新 更多