В настоящее время я использую Bullet sdk для работы с физикой. Я также реализовал Debug Drawer для визуализации физики.
Но я застрял, потому что не могу правильно синхронизировать физику с графическим рендерингом модели со скинами. На самом деле они выровнены не так, как я ожидал: сетка находится на земле, а форма капсулы смещена вниз.

Это мой рабочий процесс:
После инициализации объекта со скинами я использую метод AddCapsuleController() из моей физики класс, передавая, среди прочих параметров, преобразование корневого узла кости:
Код: Выделить всё
void Physics::AddCapsuleController(GameObject* actor, Animation* anim, btScalar radius, btScalar height, btScalar mass)
{
//Get animation (rootnode) transformation
glm::mat4 boneTransformation = anim->GetRootNode().transformation;
//retrieve single transformation components: position + rotation...
glm::vec3 scale{};
glm::quat rotation{};
glm::vec3 pos{};
glm::vec3 skew{};
glm::vec4 perspective{};
glm::decompose(boneTransformation, scale, rotation, pos, skew, perspective);
//Assign pos and rot to btTransform
btTransform transform;
transform.setIdentity();
transform.setOrigin(GlmToBulletVec3(pos));
btQuaternion Quat = GlmToBtQuaternion(rotation);
transform.setRotation(Quat);
btDefaultMotionState* motion = new btDefaultMotionState(transform);
btVector3 inertia;
btCollisionShape* capsule = new btCapsuleShape(radius, height);
capsule->calculateLocalInertia(mass, inertia);
btRigidBody* Charbody = new btRigidBody(mass, motion, capsule, inertia);
Charbody->setAngularFactor(btVector3(0, 0, 0));
Link(Charbody, actor);
}
Код: Выделить всё
std::vector bone_transforms = animator.GetFinalBoneMatrices();
myPhyx->UpdateBoneTransform(&model_Entity, bone_transforms);
Подробнее здесь: https://stackoverflow.com/questions/798 ... engl-3-3-c
Мобильная версия