我一直在受到一个问题,关于在我使用Ogre3D和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);
其中“身体”是我试图以定向刚体。
该片段有几个问题但是:
1)当改变方向,它趋向于“抖动”即它迅速面临的一种方式,则相反为一秒钟左右校正本身的取向前它应该是在。
2)大多数时候该代码运行我从子弹的btQuaternion上
assert(d != btScalar(0.0));
谁能帮断言错误?
谢谢!
我想你可以从两个向量构造一个btQuaternion,它会给出一个四元数从第一个旋转到第二个。如果你使用角色的基本方向和你想要的方向,你应该得到你需要的四元数。抖动可能发生,因为你有一个四元数不是唯一的旋转(比如180°和0°)。 – LiMuBei 2012-05-14 08:34:58