Я пишу двигатель анимации анимации персонажей, в котором используется 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: У меня также есть ограничения, возможно, это и есть причина?
Это совершенно не нужно. Просто телепортируйте RigidBody. – Joehot200
Измените его мировоззрение, а затем очистите силы, и достаточны линейные и угловые скорости. – Ben