2012-04-27 192 views
1

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

誰能幫斷言錯誤?

謝謝!

+0

我想你可以從兩個向量構造一個btQuaternion,它會給出一個四元數從第一個旋轉到第二個。如果你使用角色的基本方向和你想要的方向,你應該得到你需要的四元數。抖動可能發生,因爲你有一個四元數不是唯一的旋轉(比如180°和0°)。 – LiMuBei 2012-05-14 08:34:58

回答

2

我認爲你不應該使用像'acos'這樣的函數來處理這樣的事情,因爲它可能會導致邊界情況中的一些不一致,如上面提到的180 vs 0旋轉。您也可以獲得這種數據的高數值錯誤。

第二件事是 - 一般情況下 - 你應該避免在物理引擎中設置明確的位置和旋轉角度,而是應用力和扭矩來使你的身體隨意移動。你目前的方法現在可能完美,但是當你添加另一個對象並強制你的角色佔據相同的空間時,你的模擬將會爆炸。在這個階段很難修復它,所以最好從開始就這樣做:)。

我知道找到正確的力/力矩可能會很棘手,但這是讓您的模擬保持一致的最佳方法。