我一直在受到一個問題,關於在我使用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