0

そこで、長方形 (軸に沿ったバウンディング ボックス) のみを形状として使用する物理エンジンを作成しています。衝突時間と 2 つの移動 aabbs の法線を返すクリスタ エリクソンの本からメソッドを実装しました。また、2 つの aabbs 速度、位置、および衝突に応答して aabbs に新しい速度を与える法線を取得する別のメソッドも作成しました。

現在の実際の問題は、すべての aabb 間の衝突をチェックし、それらに応答するループがどのように見えるかがわからないことです。単純に、衝突時までに衝突を順序付ける方法と、どの衝突に応答する必要があるかがわかりません。

すべての衝突を順序付ける方法を示す疑似コードで記述されたループは、非常に役立ちます。

私が言及したもう 1 つのことは、速度が非常に速い場合、移動するボックスが 1 つのフレームで 2 つの静的なボックスの間を何百回も跳ね返る可能性があるということです。

4

1 に答える 1

0

単純なプライオリティ キューに正しい実行順序を任せる必要があります。概念的には、これは次のようになります。

queue<CollisionEvent> q = new empty queue
while (!q.isEmpty) {
  nextCollision = q.dequeueMinimum
  /* run animation until nextCollision.time 
     ...
  */
  newMovingParticles = nextCollision.movingParticles
  newCollisions = computeCollisionEvents(newMovingParticles, allOtherParticles);
  for each event in newCollisions {
    q.enqueue(event, event.time);
  }
}

大きな速度で移動するボックスについてはどうですか。わかりません。物理的には、一連の非常に頻繁な衝突イベントが発生する可能性があることを受け入れることは理にかなっています。理由を説明することはできませんが、何らかの理由で、無限ループやゼノタイプの問題が発生するとは考えていません。ライトボックスが重いボックスと壁の間に閉じ込められている場合、非常に重いボックスと非常に軽いボックスの正面衝突でさえ、有限数のステップで終わることをむしろ期待しています。これが剛体を剛体にするものであり、これを機能として受け入れるべきだと思います。

于 2015-04-19T11:25:45.557 に答える