Переместить тело в определенную позицию - Box2D - PullRequest
23 голосов
/ 30 мая 2011

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

  1. Изменение линейных скоростей.
  2. Использование mouseJoint.(Целевая позиция зафиксирована. Мышь НЕ задействована.)

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

Ответы [ 2 ]

48 голосов
/ 21 декабря 2011

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

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

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

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

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

20 голосов
/ 16 июня 2011

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

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

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

...