У меня возникла проблема с реализацией ориентирующих персонажей в игре, которую я реализую с использованием физики 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));
Может кто-нибудь помочь?
Спасибо!
Я думаю, что вы можете построить btQuaternion из двух векторов, и он даст кватернион, который вращается от первого ко второму. Если вы используете базовую ориентацию своего персонажа и направление, которое вы хотите, вы должны получить необходимый вам кватернион. Вероятно, дрожание происходит потому, что у вас есть поворот, где кватернион не уникален (например, 180 ° против 0 °). – LiMuBei