1

Ogre3D と Bullet physics を使用して実装しているゲームでのキャラクターの向きの実装に関する問題に苦しんでいます。

私が持っているもの:現在の向きとともに、キャラクターが移動している方向ベクトル。

必要なもの:キャラクターの向きを、キャラクターが動いている方向に向くように設定します。

私は、私が望むことを行うコードのスニペットを持っています:

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);

「body」は、向きを変えようとしている剛体です。

ただし、このスニペットにはいくつかの問題があります。

1) 方向を変えるとき、それは「ジッター」する傾向があります。つまり、ある方向に向きを修正する前に、1 秒ほど反対の方向に急速に向きを変えます。

2) コードが実行されるほとんどの場合、Bullet の btQuaternion からアサーション エラーが発生します。
assert(d != btScalar(0.0));

誰でも助けることができますか?

ありがとう!

4

1 に答える 1

2

上記の180対0の回転のように、境界の場合に不整合が生じる可能性があるため、このような場合は「acos」のような関数を使用しないでください。また、そのようなデータでは高い数値誤差が発生する可能性があります。

2つ目は、一般に、物理エンジンで明示的な位置と回転を設定するのではなく、力とトルクを適用して、体を好きなように動かす必要があるということです。現在のアプローチは完全に機能する可能性がありますが、別のオブジェクトを追加してキャラクターに同じスペースを占有させると、シミュレーションが爆発します。そして、この段階では修正するのが非常に難しいので、最初から修正することをお勧めします:)。

正しい力/トルクを見つけるのは難しい場合があることを私は知っていますが、それはシミュレーションを一貫させるための最良の方法です。

于 2012-07-18T11:34:52.070 に答える