Пусть прямоугольный объект имеет угловую скорость 0, угол 0, центр тяжести (0,0) и движется прямолинейно. После чего прямоугольный объект сталкивается с плоской стеной.
Я заметил, что прямоугольные объекты после столкновения со стенами (статическими объектами) в Аркаде начинают вращаться и сдвигаться. В зависимости от соотношения высоты и ширины скорость поворота различна. Но оно присутствует всегда.

Поскольку я использую Python Arcade и Pymunk, я вижу следующие возможные решения проблемы:
- Установите момент объекта в INF. Но тогда объект никогда не вращается, поэтому это странное решение.
- Получить все вычисления (связанные с столкновением) от Chipmunk в hit_handler через _arbiter._arbiter: pymunk._chipmunk.ffi. CData. Каким-то образом обработайте данные из CData на Python и придумайте, как исправить данные, вызывающие описанную выше ошибку. Было бы здорово, если бы кто-нибудь рассказал мне, как это сделать.
- Выполнять расчеты скорости и angular_velocity с нуля на Python . Но этот метод по сути удваивает количество вычислений.
Возможно, это ошибка в библиотеке Chipmunk2d и простого способа нет. Я очень долго боролся с этой проблемой. Заранее благодарим за любую помощь.
Arcade 2.6.17
Pymunk 6.4.0
Python 3.10.14
Это минимальный воспроизводимый пример (без Arcade для минимального кода):
import pyglet
import pymunk
import pymunk.pyglet_util
from pymunk import Vec2d
class Main(pyglet.window.Window):
def __init__(self):
pyglet.window.Window.__init__(self, vsync=False)
pyglet.clock.schedule_interval(self.update, 1 / 60.0)
self.fps_display = pyglet.window.FPSDisplay(self)
self.create_world()
self.draw_options = pymunk.pyglet_util.DrawOptions()
self.draw_options.flags = self.draw_options.DRAW_SHAPES
def create_world(self):
self.space = pymunk.Space()
self.space.gravity = Vec2d(0.0, -9.0)
self.space.sleep_time_threshold = 0.3
static_lines = [
pymunk.Segment(self.space.static_body, Vec2d(20, 55), Vec2d(600, 55), 1),
pymunk.Segment(self.space.static_body, Vec2d(550, 55), Vec2d(550, 400), 1),
]
for l in static_lines:
l.friction = 0.3
l.elasticity = 1
self.space.add(*static_lines)
size = 20
mass = 1.0
moment = pymunk.moment_for_box(mass, (size//2, size))
body = pymunk.Body(mass, moment)
body.position = Vec2d(300 + 0 * 50, 105 + 5 * (size + 0.1))
shape = pymunk.Poly.create_box(body, (size//2, size))
shape.elasticity = 1
shape.friction = 0.3
self.space.add(body, shape)
def update(self, dt):
self.space.step(dt)
def on_draw(self):
self.clear()
self.fps_display.draw()
self.space.debug_draw(self.draw_options)
def main():
main = Main()
pyglet.app.run()
if __name__ == "__main__":
main()
Подробнее здесь: https://stackoverflow.com/questions/792 ... rcade-pymu