2013-11-12 3 views
0

У меня есть два корпуса box2d, один из них статичен, а другой - динамический. Теперь я присоединился к статическому телу с динамическим телом через b2revoluteJoint. Поэтому мой вопрос:Drag Box2d Bodies on Touch

1) Как перемещать динамический корпус на touchMoved вместе со статическим корпусом, который крепится в том же положении на динамическом теле.

2) Как переместить более двух тел. Предположим, что у меня есть человеческое тело, а ноги и руки соединены с b2RevoluteJoint. Теперь, как я могу перемещать все тела вместе, чтобы создать естественный вид.

Я совершенно новый в box2d, поэтому с некоторыми трудностями. Любой, пожалуйста, помогите мне в этом вопросе. Спасибо!

ответ

1

1) Для перетаскивания объектов в box2d используется mouseJoint. В touchBegan вы создаете суставы мыши с объектом, который хотите переместить, и любое статическое тело, например groundBody, но в этом суставе это может быть любое статическое тело. В touchMoved вы меняете положение mouseJoint. В touchEnded уничтожить сустав :)

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

2

Вы можете использовать MouseJoint для перемещения динамического тела, но движение может выглядеть неестественно.

Вы можете использовать поведение «Seek» для перемещения одного тела к точке касания. Вам нужно будет установить ограничения на то, как быстро вы хотите, чтобы тело двигалось, а также трансформировать точку касания на экране в точку в пространстве пространства box2d. Как только вы это сделаете, вы можете использовать функцию, подобную приведенной ниже, для перемещения тела к точке касания. Вызовите эту операцию на вашей сущности каждый цикл обновления физики.

void MoveToTarget() 
    { 
     // Get the distance to the target. 
     Vec2 toTarget = GetTargetPos() - GetBody()->GetWorldCenter(); 
     toTarget.Normalize(); 
     Vec2 desiredVel = GetMaxSpeed()*toTarget; 
     Vec2 currentVel = GetBody()->GetLinearVelocity(); 
     Vec2 thrust = desiredVel - currentVel; 
     GetBody()->ApplyForceToCenter(GetMaxLinearAcceleration()*thrust); 
    } 

Я использовал это успешно для ракет и движущихся вещей с некоторым успехом (see blog post here). Исходный код также доступен на сайте.

Вы можете соединять несколько тел и перемещать их, используя их в чистой физике. Но это ДЕЙСТВИТЕЛЬНО трудно. У меня была аналогичная проблема создания пауков для другого проекта, и было установлено, что лучше всего использовать двумерный инструмент скелетной анимации (Spine), а затем просто заложить разумную форму (пауки - действительно большие капли, так что сфера хорошо справляется с ней) по телу в box2d, чтобы обрабатывать перемещение и обнаружение конфликтов.

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

Было ли это полезно?