2012-04-27 2 views
1

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!

+0

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

Répondre

2

Je pense que vous ne devriez pas utiliser des fonctions comme 'acos' pour de telles choses, car cela peut provoquer des incohérences dans les cas-bordereaux comme la rotation 180 vs 0 mentionnée ci-dessus. Vous pouvez également obtenir une erreur numérique élevée pour ces données. La deuxième chose est que, en général, vous devriez éviter de définir une position et une rotation explicites dans les moteurs physiques, mais plutôt appliquer des forces et des couples pour que votre corps bouge comme vous le souhaitez. Votre approche actuelle peut parfaitement fonctionner maintenant, mais lorsque vous ajoutez un autre objet et que vous forcez votre personnage à occuper le même espace, votre simulation va exploser. Et à ce stade, il est très difficile de le réparer, il est donc préférable de le faire dès le début :).

Je sais que trouver la force/le couple correct peut être difficile, mais c'est la meilleure façon de rendre votre simulation cohérente.