Подтвердить что ты не робот

Переместить тело в определенную позицию - Box2D

У меня есть b2Body, который я хотел бы переместить в определенную целевую позицию. Я не хочу использовать функцию SetPosition. Как я могу достичь этого, используя:

  • Изменение линейных скоростей.
  • Использование mouseJoint. (Позиция цели фиксирована. Мышь не участвует.)

Я использую Box2DAS3 2.1a. Помощь на любом другом языке также будет оценена.

4b9b3361

Ответ 1

Самый простой способ - использовать SetPosition/SetTransform(position,angle). Например:

body->SetTransform(b2Vec2(0,0),body->GetAngle())

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

Учитывая, что вы не хотите использовать SetPosition (что эквивалентно приведенному выше коду), тогда ApplyLinearImpulse с соответствующей силой (основанной на массе и текущей скорости тела) сделает трюк, и является более правильным с точки зрения моделирования, но, вероятно, будет более проблематичным с учетом потенциальных побочных эффектов и т.д.

В любом случае iforce2d охватывает SetLinearVelocity..., и я бы добавил, что соединение с мышью очень полезно, даже если "мышь" не задействована.

Ответ 2

Самый простой способ - установить линейную скорость тела так, чтобы он покрывал необходимое расстояние за один шаг времени. например. если организму нужно переместить (2,3) единицы, чтобы добраться до нужного места, а ваш timestep - 60 Гц, вы можете SetLinearVelocity (120, 180) за один раз. На следующем шаге вы, конечно, должны были бы установить скорость обратно к нулю, чтобы остановить ее пролетел на расстояние. Результат этого не сильно отличается от того, если вы использовали SetTransform, за исключением того, что CCD будет работать, и если что-то будет в порядке, оно будет удалено.

Если вы не хотите, чтобы тело приходилось за один раз, просто ограничьте максимальную скорость, которую он может иметь.

Если вы предпочитаете использовать ApplyForce/ApplyLinearImpulse, вы можете сделать что-то подобное, но вам нужно также учитывать текущую скорость тела. Вы можете найти эту страницу полезной, она объясняет версию вращения, но принцип тот же: http://www.iforce2d.net/b2dtut/rotate-to-angle