首页 > 解决方案 > 使用 Pymunk 提升、拖动或浮力

问题描述

我是 Pymunk 的新手。多亏了一些很好的教程,我设法很容易地完成了我的第一个模拟。我现在想知道是否可以轻松模拟空气阻力和/或浮力。有什么例子吗?

标签: dragliftpymunk

解决方案


目前没有内置的方法来做到这一点(从 Pymunk 5.6 开始)。

空间物体具有阻尼特性。但这是非常基本的,所以不确定它是否涵盖您的用例。

否则你需要自己实现一些东西。你可以从这些中得到一些启发:

Pymunk 中的 arrows.py 示例中有一个拖动示例:https ://github.com/viblo/pymunk/blob/08fb141b81c0240513fc16e276d5ade5b0506512/examples/arrows.py#L139

drag_constant = 0.0002

pointing_direction = Vec2d(1,0).rotated(flying_arrow.angle)
flight_direction = Vec2d(flying_arrow.velocity)
flight_speed = flight_direction.normalize_return_length()
dot = flight_direction.dot(pointing_direction)
# (1-abs(dot)) can be replaced with (1-dot) to make arrows turn 
# around even when fired straight up. Might not be as accurate, but 
# maybe look better.
drag_force_magnitude = (1-abs(dot)) * flight_speed **2 * drag_constant * flying_arrow.mass
arrow_tail_position = Vec2d(-50, 0).rotated(flying_arrow.angle)
flying_arrow.apply_impulse_at_world_point(drag_force_magnitude * -flight_direction, arrow_tail_position)

flying_arrow.angular_velocity *= 0.5

Chipmunk github repo 包含一个完整的Bouyancy示例,在这里:https ://github.com/slembcke/Chipmunk2D/blob/master/demo/Buoyancy.c 此代码是c,使用Chipmunk(Pymunk用来做的ac库实际的物理计算)。如果您是一位经验丰富的程序员,通常很容易将 Chipmunk 示例转换为 Python/Pymunk。


推荐阅读