2012-09-03 8 views
4

Я пишу двигатель анимации анимации персонажей, в котором используется Bullet Physics как механизм моделирования физики.Повторное позиционирование жесткого тела в физике пули

Последовательность начнется без модели на экране, тогда анимация будет назначена этой модели, модель будет перемещена в кадр 0 анимации, и двигатель начнет рендеринг модели с помощью анимации.

Каков правильный способ перестановки жестких тел в модели персонажа при инициализации в кадре 0?

В настоящее время я использую этот код, который вызывается сразу после анимации присваивается модель и кости перемещаются в кадре положения 0:

_world->removeRigidBody(_body); 
bool k = (_type == Kinematics); 
_body->setCollisionFlags(_body->getCollisionFlags() & ~btCollisionObject::CF_NO_CONTACT_RESPONSE); 
btTransform tr = BulletPhysics::ConvertD3DXMatrix(&(_bone->getCombinedTrans())); 
tr *= _trans; 
_body->setCenterOfMassTransform(tr); 
_body->clearForces(); 
_body->setLinearVelocity(btVector3(0,0,0)); 
_body->setAngularVelocity(btVector3(0,0,0)); 
_world->addRigidBody(_body, _groupID, _groupMask); 

Проблема в том, что иногда это работает, и другой раз нет. Например, возьмите юбку модели. Иногда он появляется в естественном положении, иногда слегка смещается, и он встает на свои места, а в других случаях он полностью вырезается через тело, как будто столкновение отключается, а какая-то сила толкает его в этом направлении. Это имеет смысл большую часть времени, потому что в тестовой анимации я использую начальную позицию модели в центре экрана, но анимация начинается с левой стороны экрана. Кто-нибудь знает, как это решить?

Я знаю, что кости на юбке не проблема, потому что я отключил физику и заставил ее вручную обновить позиции костей в каждом кадре, и все было в правильных положениях по всей анимации.

EDIT: У меня также есть ограничения, возможно, это и есть причина?

ответ

0

Я не могу сказать вам, что вызывает необычный исход при движении твердых тел, но я могу определенно сочувствовать!

Есть три вещи, которые вам нужно сделать для того, чтобы решить эту проблему:

  1. Преобразование твердых тел в кинематических
  2. Adjust мир Transform состояния движения тела и НЕ твердое тело
  3. Преобразование кинематического тела обратно в твердое тело
+0

Это совершенно не нужно. Просто телепортируйте RigidBody. – Joehot200

+0

Измените его мировоззрение, а затем очистите силы, и достаточны линейные и угловые скорости. – Ben

2

Вот мой метод репозиции, что делает именно это.

void LimbBt::reposition(btVector3 position,btVector3 orientation) { 
    btTransform initialTransform; 

    initialTransform.setOrigin(position); 
    initialTransform.setRotation(orientation); 

    mBody->setWorldTransform(initialTransform); 
    mMotionState->setWorldTransform(initialTransform); 
} 

состояние движения mMotionState это состояние движения, созданный для btRigidBody в самом начале. Просто добавьте свои clearForces() и скорости к нему, чтобы остановить движение тела от новой позиции, как если бы он проходил через портал. Это должно сделать это. Здесь хорошо работает со мной.

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

Edit2: Другая проблема заключается в том, что если вам нужно детерминированное поведение (каждый раз, когда вы сбросите свои тела, они должны падать точно то же самое), то вам придется убить старую dynamicsWorld, воссоздать его и добавить все тела еще раз. В мире хранится информация о телах, которые пока не могут быть очищены. Это может измениться в будущем, поскольку bullet4 будет поддерживать детерминированные сбросы. Но пока, если вы проводите эксперименты с детерминированными сбрасываниями, вам нужно сбросить мир и воссоздать его.

источник: discussion with Erwin Coumans, the developer of Bullet Physics.