Pymunk / Chipmunk2d - динамические тела, сталкивающиеся со статическими телами, генерирующими импульсы столкновения

простой вопрос, но не нашел ответа:

Могут ли статические тела применять импульсы столкновения к динамическим телам?

вот небольшая запись того, что делает мой код

Как видите, два динамических треугольника сталкиваются друг с другом и останавливаются статической линией. однако поведение не то, что я хочу. Если бы у меня был только один треугольник, он бы скользил по уступу только на одной вершине -> статическое тело не вызывает никакого крутящего момента или противодействующих сил (я не физик) на треугольники.

Означает ли это, что я должен просто использовать динамические тела в качестве препятствий с действительно большой массой? Мое довод в пользу использования статических состоит в том, что я планирую столкнуться с множеством препятствий в моем симе, в которые будут врезаться динамические тела. Возможно ли построить всю среду, используя динамические тела? Что мне не хватает?

Я использую pymunk и pygame для этого, кстати. Ценю любую помощь, которую я могу получить????

import pygame
import pymunk
import pymunk.pygame_util

pygame.init()
screen = pygame.display.set_mode((1000, 500))

space = pymunk.Space()
space.gravity = 0, -0.07

# triangle creation func, takes position arguments
def create_tri(x, y):
    pos = pygame.math.Vector2(x, y)
    points = (0, 0), (50, 0), (25, 50)

    moment = pymunk.moment_for_poly(1, points)
    body = pymunk.Body(1, moment)
    body.position = pos

    shape = pymunk.Poly(body, points)
    return body, shape

# creating 2 triangles
tri2 = create_tri(100, 400)
space.add(tri2[0], tri2[1])

# temporary obstacle setup
line_moment = pymunk.moment_for_segment(0, (0, 0), (600, -300), 10)
line_body = pymunk.Body(10, line_moment, body_type=pymunk.Body.STATIC)
line_body.position = (0, 300)

line_shape = pymunk.Segment(line_body, (0, 0), (600, -300), 10)
space.add(line_shape)

# Main loop
game_running = True
while game_running:
   ev = pygame.event.poll()
   if ev.type == pygame.QUIT:
       pygame.quit()
   screen.fill((255, 255, 255))
   draw_options = pymunk.pygame_util.DrawOptions(screen)
   space.debug_draw(draw_options)
   space.step(0.02)
   pygame.display.flip()



person Paul Straberger    schedule 26.10.2019    source источник
comment
Можете ли вы повторить пробежку всего с одним треугольником, чтобы увидеть, как он себя ведет? И можете ли вы добавить небольшой пример кода для его воспроизведения, тогда будет легче понять, что не так и как / если это исправить.   -  person viblo    schedule 29.10.2019
comment
@viblo, круто, спасибо, что ответили! Вот короткое видео о том, что происходит только с одним треугольником, и я отредактировал весь код в сообщении.   -  person Paul Straberger    schedule 30.10.2019


Ответы (1)


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

Один из способов исправить это - отрегулировать так, чтобы (0,0) находилась в середине треугольника:

points = (-25, -25), (25, -25), (0, 25)

Другой способ - преобразовать вершины треугольника при создании формы, переведя их на -25 в каждом направлении:

shape = pymunk.Poly(body, points, pymunk.Transform(tx=-25,ty=-25))

person viblo    schedule 30.10.2019
comment
Вау, это сработало, ха-ха. Большое вам спасибо, я бы не подумал об этом ... Если бы я сначала тестировал это с салазками, повернутыми в другую сторону, я, возможно, получил бы подсказку. И еще один последний вопрос, опять же, я не очень разбираюсь в физике, но разве тело не должно упасть с вершиной центра тяжести вниз? Как бы то ни было, вы решили мой вопрос, так что это чисто теоретический вопрос. Отличный ответ! - person Paul Straberger; 31.10.2019
comment
Я думаю, что он не вращается в воздухе, потому что у пимунка нет воздушного трения. Даже легкий и тяжелый предметы будут падать в вакууме с одинаковой скоростью, из-за сопротивления воздуха перо падает медленнее, чем камень. - person viblo; 31.10.2019