Почему объекты начинают вращаться после столкновения с полом в Python Arcade/Pymunk?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему объекты начинают вращаться после столкновения с полом в Python Arcade/Pymunk?

Сообщение Anonymous »

Почему прямоугольный объект без вращения начинает вращаться после столкновения с плоской стеной в Python Arcade/Pymunk? Как решить эту задачу?
Пусть прямоугольный объект имеет угловую скорость 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»