技術

BulletでaddConstraintする前にモーターを有効にするとstepSimulationが不安定になる

メモ。

不安定というのは、「Bullet Error: Overflow in AABB, object removed from simulation」というメッセージが表示されて関連オブジェクトのシミュレーションが行われなくなる問題がまれに(条件によっては頻繁に)起きるの意。

例えば以下のような感じ。

btDynamicsWorld *world;
…worldの初期化処理等…

btHingeConstraint *hinge;
…hinge の初期化処理等…
hinge->enableMotor(true);
hinge->setMaxMotorImpulse(10.0f);

world->addConstraint(hinge);

world->stepSimulation(1.0f / 30.0f, 2);  // ←ここで問題が起きる場合がある

ただし、問題が発生するのは非常にまれで、一度stepSimulationが成功すればその後は何度呼んでも問題は起きない。

が、シミュレーション中に同様の方法で制約の追加が行われるとその次のstepSimulationで比較的問題が顕在化しやすい。
(もちろん頻度についてはうちの環境においての話)

これを回避するためには、addConstraintした後にモーターを有効にするといい。

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください