Ошибка Box2d RopeJoint — исправление или альтернативное решение?

То, что я пытаюсь сделать, это создать веревочную игру. Ниже вы можете найти фильм, как это выглядит сейчас.

https://youtu.be/QTULCGNF70I

Я использую RopeJoint и уменьшаю maxLength в каждом кадре, чтобы иметь возможность ускоряться. Вроде бы все хорошо, но проблема возникает из-за пузырчатого шара. Я понял, что укорачивание веревки не увеличивает скорость мячей. Например, если я бросаю веревку полностью вертикально, и единственная «сила» исходит от укорачивания веревки, скорость равна 0,0. Кажется, движение тела не моделируется?

После того, как я отпускаю веревку, импульс теряется. Пузырь может летать, но фактор укорочения веревки игнорируется.

Я не знаю, понимаете ли вы, что я имею в виду. Фильм должен прояснить это лучше.

Временные решения, которые я пробовал:

  • Хорошая идея состояла в том, чтобы использовать prismaticJoint, но вращение фиксировано, поэтому оно не работает. я не мог качаться
  • Другая идея состояла в том, чтобы использовать wheelJoint и использовать его частотный параметр. Однако здесь есть проблема, что веревка становится резиновой. Ощущение замаха плохое, когда он может растянуться больше, чем начальная длина, он всегда должен только укорачиваться.

Решения есть, но они недоступны

  • RopeJoint, который удерживает импульс тела от укорочения веревки
  • PrismaticJoint без фиксированного вращения
  • WheelJoint с возможностью установить максимальную длину или создать веревку с максимальной длиной, а не с исходным положением.

person Mateusz Gaweł    schedule 07.04.2020    source источник


Ответы (1)


Я хочу поделиться с вами, как я справился с этим, наконец.

  1. Я стреляю «веревочной пулей», которая представляет собой маленькое круглое тело box2d, устанавливая его скорость и угол. Я рисую веревку между пулей и мячом.
  2. Когда пуля достигает стены, я получаю от contactListener точку попадания
  3. Я соединяю пулю и стену с помощью revoluteJoint, основываясь на центре пули и точке контакта. Благодаря такому решению пуля может вращаться и возможно раскачивание на веревке.
  4. На другом конце веревки я создал «ротор», похожий на круглое тело. Он все время соединен с телом шара другим вращающимся соединением с двумя центрами. Это позволяет мячу свободно вращаться.
  5. Теперь я соединяю веревочную пулю и ротор с помощью prismaticJoint. Ось я задаю, вычисляя вектор между ними и нормализуя его.
  6. Я установил пределы призматического соединения, скорость двигателя и максимальное усилие в соответствии со своими потребностями.
  7. К мячу прикасается сила притяжения мира, поэтому мне пришлось сделать еще один трюк, чтобы он был удовлетворительным. Я описал проблему и трюк на reddit box2d, поэтому я ссылаюсь на него: ://www.reddit.com/r/box2d/comments/gpdmoc/prismatic_joint_behaves_like_rubber/
person Mateusz Gaweł    schedule 25.05.2020