J'ai souffert d'un problème concernant l'implémentation de caractères d'orientation dans un jeu que j'implémente en utilisant la physique Ogre3D et Bullet. Ce que j'ai: Un vecteur de direction dans lequel le personnage se déplace, ainsi que son orientation actuelle. Ce dont j'ai besoin: Pour définir l'orientation du personnage face à la façon dont il bouge.Rotation lisse en utilisant Bullet et Ogre3D
J'ai un bout de code qui ne sorte de ce que je veux:
btTransform src = body->getCenterOfMassTransform();
btVector3 up = BtOgre::Convert::toBullet(Ogre::Vector3::UNIT_X);
btVector3 normDirection = mDirection.normalized();
btScalar angle = acos(up.dot(normDirection));
btVector3 axis = up.cross(normDirection);
src.setRotation(btQuaternion(axis, angle));
body->setCenterOfMassTransform(src);
Où « corps » est le modèle du solide indéformable je suis en train d'orienter.
Cet extrait a quelques problèmes cependant:
1) Lorsque le changement de direction, il tend à « gigue » à-dire qu'il fait face rapidement dans un sens, puis l'inverse pour une seconde ou avant de se corriger l'orientation il est censé être à.
2) La plupart du temps que le code est exécuté, je reçois une erreur d'assertion de btQuaternion Bullet sur
assert(d != btScalar(0.0));
Quelqu'un peut-il aider?
Merci!
Je pense que vous pouvez construire un btQuaternion à partir de deux vecteurs et il donnera un quaternion qui tourne de la première à la seconde. Si vous utilisez l'orientation de base de votre personnage et la direction que vous voulez, vous devriez obtenir le quaternion dont vous avez besoin. La gigue se produit probablement parce que vous avez une rotation où le quaternion n'est pas unique (comme 180 ° vs 0 °). – LiMuBei