2012-04-27 16 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); 

このスニペットしかし問題のいくつかを有する:

1)の方向を変更する場合、それは急速に一方向を向いている、すなわち、それは向きに自分自身を修正する前にそう第二又は、次いで反対の、「ジッター」になる傾向がありますそれはであることになっています。コードは
assert(d != btScalar(0.0));

に、私は弾丸のbtQuaternionからアサーションエラーを取得する実行していることを

2)ほとんどの時間は、誰もが助けることはできますか?

ありがとうございます!

+0

私はあなたが2つのベクトルからbtQuaternionを構築することができ、最初から2番目に回転する四元数を与えると思います。キャラクターの基本方位と望む方向を使用する場合は、必要なクォータニオンを取得する必要があります。あなたが四元数が一意でない回転(180°対0°のような)があるので、おそらくジッタが発生します。 – LiMuBei

答えて

2

私はあなたが上記の180回転と同じように境界ケースにいくつかの矛盾を引き起こす可能性があるので、そのようなものには 'acos'のような関数を使うべきではないと思います。また、そのようなデータに対して高い数値エラーを得ることができます。

第2の点は、物理エンジンで明示的な位置と回転を設定するのではなく、必要に応じて力とトルクをかけて体を動かすことです。現在のアプローチは完全に機能するかもしれませんが、別のオブジェクトを追加して同じスペースを占めるようにキャラクタを強制すると、シミュレーションが爆発的になります。そしてこの段階では、それを修正するのは非常に難しいので、最初からすぐにそれを行う方がいいです。

正確な力/トルクを見つけることは難しいかもしれませんが、シミュレーションを一貫させるには最良の方法です。

関連する問題