Pymunk - установка позиции в каждый момент времени и отсутствие столкновений - PullRequest
0 голосов
/ 23 октября 2018

Я использую пимунка для симуляции движущихся тел.Поскольку я хочу, чтобы тела двигались определенным образом, я устанавливаю их положение каждый момент времени (я знаю, что это не рекомендуется для бурундука / пирунка).Это дает мне хорошие результаты для перемещения отдельных тел, но проблема в том, что когда я делаю это, кажется, что тела больше не могут обнаруживать столкновения, и они просто проходят друг через друга, а не сталкиваются.Я пытался уменьшить временной шаг, но это, похоже, не помогает.У кого-нибудь есть какие-либо советы, как я могу это исправить, или это неизбежно, если я устанавливаю позиции каждый момент времени?

Спасибо.

Отредактировано, чтобы показать пример кода:

Итак, я устанавливаю положение и угол, как каждый раз, шаг:

body.position = (body.position[0] + speed*cos(body.angle)*dt + (random term), \
                body.position[1] + speed*sin(body.angle)*dt + (random term))
body.angle = body.angle + body.angular_velocity*dt + (random term)

Я хочу сделать это, потому что у меня есть прямоугольные тела, и этот код позволяет прямоугольникам двигаться вдоль их длинныхосей, и это прекрасно работает только для одного тела, но когда у меня есть несколько тел, я также хочу, чтобы столкновения работали, и это, кажется, заставляет их вообще не работать (или если они работают, они работают очень плохо).

1 Ответ

0 голосов
/ 26 октября 2018

Итак, если вы установите положение тела, оно мгновенно переместится точно в это положение, как если бы вы телепортировали его туда.Если там уже есть какой-то другой объект, то этот объект следует оттолкнуть в течение следующих нескольких временных шагов.Вы также сможете получать данные о коллизиях, например, с помощью коллбека, например, как в этом примере

import pymunk

s = p.Space()
b1 = p.Body(1, 1)
c1 = p.Circle(b1, 10)
b2 = p.Body(1, 1)
c2 = p.Circle(b2, 10)
s.add(b1, c1, b2, c2)

self.hits = 0
def begin(space, arb, data):
    self.hits += h.data["test"]
    return True

h = s.add_collision_handler(0, 0)
h.data["test"] = 1
h.begin = begin

for x in range(10):
    s.step(0.1)

print(self.hits)
...