Переместить тело в определенное положение-Box2D


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

  1. изменение линейных скоростей.
  2. Использование mouseJoint. (Целевое положение фиксировано. Мышь тут ни при чем.)

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

2 21

2 ответа:

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

body->SetTransform(b2Vec2(0,0),body->GetAngle())
Очевидно, мгновенный прыжок означает, что вы подрываете физическую симуляцию, но это самый простой и прямой способ установить положение тела.

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

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

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

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

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