Bullet Physics を物理シミュレーション エンジンとして使用するキャラクター アニメーション レンダリング エンジンを作成しています。
シーケンスは画面にモデルが表示されていない状態で開始され、そのモデルにアニメーションが割り当てられ、モデルがアニメーションのフレーム 0 に移動され、エンジンがアニメーションを使用してモデルのレンダリングを開始します。
フレーム 0 で初期化されたときに、キャラクター モデルの剛体を再配置する正しい方法は何ですか?
現在、アニメーションがモデルに割り当てられ、ボーンがフレーム 0 の位置に移動された直後に呼び出されるこのコードを使用しています。
_world->removeRigidBody(_body);
bool k = (_type == Kinematics);
_body->setCollisionFlags(_body->getCollisionFlags() & ~btCollisionObject::CF_NO_CONTACT_RESPONSE);
btTransform tr = BulletPhysics::ConvertD3DXMatrix(&(_bone->getCombinedTrans()));
tr *= _trans;
_body->setCenterOfMassTransform(tr);
_body->clearForces();
_body->setLinearVelocity(btVector3(0,0,0));
_body->setAngularVelocity(btVector3(0,0,0));
_world->addRigidBody(_body, _groupID, _groupMask);
問題は、これが機能する場合と機能しない場合があることです。例として、モデルのスカートを取り上げます。自然な位置に表示される場合もあれば、わずかにずれて所定の位置に収まる場合もあれば、衝突がオフになって何らかの力でその方向に押し出されたかのように、ボディを完全に切り取って表示される場合もあります。ほとんどの場合、これは理にかなっています。テスト アニメーションでは、モデルの初期位置が画面の中央にあるのに、アニメーションは画面の左側から開始されるためです。これを解決する方法を知っている人はいますか?
スカートのボーンが問題ではないことはわかっています。物理演算をオフにして、フレームごとに強制的にボーンの位置を手動で更新したため、アニメーション全体ですべてが正しい位置にありました。
編集:私にも制約がありますが、それが原因でしょうか?