Мне действительно нравится физическая библиотека pymunk , оболочка для библиотеки физики бурундуков.
Прежде всего, библиотеку нужно инициализировать:
import pymunk
pymunk.init_pymunk()
space = pymunk.Space()
space.gravity = (0.0, -100.0)
Чтобы достичь того, чего вы просили, вам нужно создать форму Body
и Circle
для каждой частицы, которую вы хотите создать.
mass = 1
radius = 14
inertia = pymunk.moment_for_circle(mass, 0, radius, (0,0))
body = pymunk.Body(mass, inertia)
x, y = random.randint(0, 200), random.randint(0, 200)
body.position = x, 550
shape = pymunk.Circle(body, radius, (0,0))
shape.sensor = True
space.add(body, shape)
Частицы не будут сталкиваться друг с другом, поскольку флаг sensor
установлен на True
. Радиус теперь является областью влияния.
Теперь мы создаем функцию обратного вызова для частиц, которые имеют перекрывающуюся область влияния:
def near_callback(space, arbiter, *args, **kwargs):
body_i = arbiter.shapes[0].body
body_j = arbiter.shapes[1].body
# calculate the forces force_i and force_j with your formula
...
body_i.apply_force(force_i)
body_j.apply_force(force_j)
Обратный вызов устанавливается в space
:
space.set_default_collision_handler(near_callback, near_callback, None, None, None)
Конечно, space
нужно «ступить» для каждого таймфрейма:
space.step(dt)
Надеюсь, это было несколько понятно и полезно.