Как сделать сложные фигуры в pymunk?

Как сказано в заголовке, как я могу соединить/связать 2 тела/формы пиманка, чтобы они не действовали как один объект??
Например, в этом случае у меня есть крикетная бита, состоящая из 2 отдельные тела и полигоны.
Я хочу соединить "ручку" летучей мыши с "лезвием" моей летучей мыши, чтобы получить объект, похожий на летучую мышь.

Мой код:

### BAT n Co. ###
# body format: [vertices, offset, position, mass]
bat_bodies_v = [
# bat
    [[[0, 34], [4, 34], [4, 0], [0, 0]],(-2,-20),(103,190),20], # handle
    [[[6, 90] , [0, 32] , [0, 17], [6, 0] , [10, 0], [10, 90]],(-5,-20),(100,100),1100] # blade
]

bat_bodies = []
for vertices, offset, pos, mass in bat_bodies_v:
    moment = pm.moment_for_poly(mass,vertices,offset)
    b = pm.Body(mass,moment)
    b.position = pos

    poly = pm.Poly(b, vertices,offset)
    poly.friction = 0.9

    bat_bodies.append(poly)
    space.add(b,poly)

# the closest I got.
j1 = pm.constraint.PinJoint(bat_bodies[0].body,bat_bodies[1].body)
j2 = pm.constraint.RotaryLimitJoint(bat_bodies[0].body,bat_bodies[1].body,0,0)
space.add(j1,j2)

Это ============= становится ================> Это ПускEnd
У меня есть функция, рисующая зеленые круги в местах расположения тела


person pradyunsg    schedule 17.03.2013    source источник


Ответы (1)


Лучший способ построить сложную форму в pymunk — просто прикрепить формы к одному и тому же телу. Поэтому, если у вас нет веских причин, почему вы хотите, чтобы они были разделены, я предлагаю вам попробовать добавить обе формы в одно и то же тело.

Однако иногда вы можете захотеть сделать что-то еще, например, разбить объекты. Я сам ничего не реализовал, но Скотт (из Chipmunk) пишет в этом посте http://chipmunk-physics.net/forum/viewtopic.php?f=1&t=2420&p=10644&hilit=breakable#p10644, что использование PivotJoint и GearJoint может быть хорошей идеей для держать два тела вместе.

person viblo    schedule 18.03.2013
comment
Спасибо еще раз. Но если мне нужно сделать 2 формы с отдельными телами, что мне делать? Как, например, хрупкая доска, которая сломается, если на соединение будет больше x силы, что дает мне 2 отдельные формы. Как это можно реализовать? - person pradyunsg; 19.03.2013
comment
Я тоже об этом думал. Я хотел разрушаемые объекты. Вы можете обрабатывать столкновение для каждой формы отдельно, и если вы считаете, что эта форма сломана, вы определяете ее центр. удалите старую и добавьте ту же форму на новое тело. - person Kaliber64; 31.07.2013
comment
Нужно ли пересчитывать момент после добавления двух фигур к телу или Pymunk делает это автоматически? - person skrx; 03.05.2017
comment
@skrx Он пересчитывает это. Обратите внимание, однако, что их нужно добавить в пробел, иначе он не будет выполнять никаких вычислений. Вы можете попробовать сами, создать пространство, тело с нулевой массой/моментом и две фигуры на теле. Добавьте тело и фигуры в пространство, а затем измените массу одной из фигур, а затем убедитесь, что body.mass / body.moment изменились. - person viblo; 04.05.2017
comment
Спасибо. Не могли бы вы добавить пример короткого кода в ответ? Я не уверен, правильно ли я это делаю. Я думаю, что в последний раз, когда я пытался создать тело с нулевой массой, я получил сообщение об ошибке. - person skrx; 04.05.2017
comment
Я только что создал его с помощью self.body = pm.Body(0, 0). И получил следующую трассировку: Файл C:\Users\Name\AppData\Local\Programs\Python\Python35\lib\site-packages\pymunk\body.py, строка 85, в init assert mass != 0 и момент != 0, динамическое тело с нулевой массой и/или моментом AssertionError: динамическое тело с нулевой массой и/или моментом - person skrx; 04.05.2017
comment
Вы используете последнюю версию pymunk? Если нет, то в этом проблема, вычисление массы/момента по формам было добавлено совсем недавно. - person viblo; 04.05.2017
comment
(Возможно, это следует выделить в отдельный вопрос. Тогда я смогу дать полный ответ, это поле для комментариев немного ограничено) - person viblo; 04.05.2017