2012-04-27 6 views
1

У меня возникла проблема с реализацией ориентирующих персонажей в игре, которую я реализую с использованием физики Ogre3D и Bullet.Плавное вращение с использованием Bullet и Ogre3D

Что у меня есть: Вектор направления, в котором перемещается персонаж, вместе с его текущей ориентацией.

Что мне нужно: установить ориентацию персонажа так, как он движется.

У меня есть фрагмент кода, который делает вид, что я хочу:

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

Где «тело» является Rigidbody я пытаюсь сориентироваться.

Этот фрагмент кода имеет несколько проблем, однако:

1) При изменении направления движения, она стремится к «Дрожание», то есть он быстро сталкивается в одну сторону, то обратное течение секунды или около того, прежде чем исправлять себя ориентации он должен быть включен.

2) В большинстве случаев, что код запуска я получаю ошибку утверждение от btQuaternion пули на
assert(d != btScalar(0.0));

Может кто-нибудь помочь?

Спасибо!

+0

Я думаю, что вы можете построить btQuaternion из двух векторов, и он даст кватернион, который вращается от первого ко второму. Если вы используете базовую ориентацию своего персонажа и направление, которое вы хотите, вы должны получить необходимый вам кватернион. Вероятно, дрожание происходит потому, что у вас есть поворот, где кватернион не уникален (например, 180 ° против 0 °). – LiMuBei

ответ

2

Я думаю, что вы не должны использовать такие функции, как «acos» для таких вещей, поскольку это может привести к некоторым несоответствиям в пограничных случаях, как упомянутое выше вращение 180 vs 0. Вы также можете получить высокую числовую ошибку для таких данных.

Во-вторых, вы должны избегать устанавливать явное положение и вращение в физических двигателях, а применять силы и крутящие моменты, чтобы ваше тело двигалось так, как вы хотите. Теперь ваш текущий подход может работать отлично, но когда вы добавляете другой объект и заставляете персонажа занимать одно и то же место, ваша симуляция взорвется. И на этом этапе его очень сложно исправить, так что лучше сделать это с самого начала :).

Я знаю, что найти правильную силу/крутящий момент может быть сложно, но это лучший способ сделать вашу симуляцию последовательной.