3D-анимированная модель, не соответствующая форме капсулы - Bullet Physics Opengl 3.3 c++C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 3D-анимированная модель, не соответствующая форме капсулы - Bullet Physics Opengl 3.3 c++

Сообщение Anonymous »

В экспериментальных целях я создал 3D-сцену со сферами, одним цилиндром и одной анимированной моделью (из Mixamo).
В настоящее время я использую 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»