3D-animiertes Modell, das nicht an der Kapselform ausgerichtet ist – Bullet Physics Opengl 3.3 c++C++

Programme in C++. Entwicklerforum
Anonymous
 3D-animiertes Modell, das nicht an der Kapselform ausgerichtet ist – Bullet Physics Opengl 3.3 c++

Post by Anonymous »

Zu Versuchszwecken habe ich eine 3D-Szene mit Kugeln, einem Zylinder und einem animierten Modell (von Mixamo) erstellt.
Derzeit verwende ich Bullet SDK, um Physik-Sachen zu verarbeiten. Ich habe auch eine Debug-Schublade für die Physikvisualisierung implementiert.
Aber ich stecke fest, weil ich die Physik nicht korrekt mit der grafischen Darstellung des gehäuteten Modells synchronisieren kann. Tatsächlich sind sie nicht wie erwartet ausgerichtet: Das Netz liegt auf dem Boden, während die Kapselform nach unten versetzt ist.
Image

Das ist mein Arbeitsablauf:
Nach der Initialisierung des gehäuteten Objekts verwende ich die AddCapsuleController()-Methode aus meinem Physikunterricht und übergebe sie unter anderem Andere Parameter, die Bone-Rootnode-Transformation:

Code: Select all

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);

}
Dann sorge ich in der Hauptschleife dafür, dass die Knochentransformationsdaten entsprechend der aktuell laufenden Animation aktualisiert werden (es gibt vier Animationen: Leerlauf, Gehen, Laufen und Schlagen):

Code: Select all

std::vector bone_transforms = animator.GetFinalBoneMatrices();

myPhyx->UpdateBoneTransform(&model_Entity, bone_transforms);
Was ist los? Wie kann ich das Problem beheben? Könnte mich bitte jemand in die richtige Richtung weisen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post