2017-10-20 37 views
1

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

我已经知道如何创造空间,形状与pygame的渲染。我的问题:有没有一种方法可以在宝石形状之间添加引力?

感谢您的帮助。

+0

也许你可以展示你所尝试过的东西,或者描述你所做的研究?你如何确定这不能由pymunk完成? – barny

+0

好,所以我已经做的是与身体创造空间。现在我需要在每对身体之间实施引力。我的第一个猜测是使用'pymunk.constraint',它描述了两个物体如何相互作用。然而这个类只包含'[“PinJoint”,“SlideJoint”,“PivotJoint”,“GrooveJoint”,“DampedSpring”,“DampedRotarySpring”,“RotaryLimitJoint”,“RatchetJoint”,“GearJoint”,“SimpleMotor”对于调整这些来重现万有引力并不明显。 – rronan

+0

请你可以编辑你的问题,包括你已有的代码(使用4个空格格式化为代码)。您可能想要使用的方法是对系统中的身体进行双重循环。然后使用[平方反比法](https://en.wikipedia.org/wiki/Gravity#Newton.27s_theory_of_gravitation)计算出重要程度并使用[apply_force_at_local_point](http://www.pymunk.org/en/) latest/pymunk.html#pymunk.Body.apply_force_at_local_point)放在对象的中心。 – cdo256

回答

1

没有内置的方式直接在pymunk中完成它。最简单的可能是自己计算一下。循环身体,并为每个身体进行空间查询以查找附近的身体。计算产生的重力并使用冲量。

(可能还有其可能的制约因素之一emualte,例如销接头或阻尼弹簧..但是,这将需要一些思考和试验,以找出是否可能和看起来不错)

+0

嗨Viblo,谢谢你的回答。最后,我进入Chipmunk源代码,并创建了'cpDampedSpring'的副本,我修改了'apply_impulse()'(参见我的fork [here](https://github.com/rronan/pymunk/blob/master/chipmunk_src/) SRC/cpGravitation.c))。 当我更新python包装,我现在可以在对象之间添加“引力”约束,我不需要自己做循环。 它似乎工作得很好,但如果你有想法让它变得更好,请让我知道。 并感谢pymunk。 – rronan

+0

有趣!也许你可以针对主要的Chipmunk repo(https://github.com/slembcke/Chipmunk2D)制作一个PR,以防止这个限制对更多人有用。 – viblo