いいえ。衝突検出は常にO(N ^ 2)とは限りません。
たとえば、サイズが10x10のオブジェクトを含む100x100のスペースがあるとします。このスペースをグリッドで10x10のセルに分割できます。
各オブジェクトは、最大4つのグリッドセルに入れることができます(ブロック内に収まるか、「間に」セルを配置できます)。各セルにオブジェクトのリストを保持できます。
それらのセルで衝突をチェックするだけです。グリッドセルごとに最大数のオブジェクトがある場合(たとえば、同じブロックに4つを超えるオブジェクトが存在しない場合)、各オブジェクトの衝突検出はO(1)であり、すべてのオブジェクトの衝突検出はO(N)です。
これはO(N ^ 2)の複雑さを回避する唯一の方法ではありません。他のユースケースに適した他の方法があります-多くの場合、ツリーベースのデータ構造を使用します。
説明したアルゴリズムは、スペース分割の一種ですが、他にもスペース分割アルゴリズムがあります。O(N ^ 2)時間的複雑さを回避するアルゴリズムについては、スペースパーティションデータ構造の種類をご覧ください。
Box2DとBulletは、チェックペアの数を減らすメカニズムをサポートしています。
マニュアル、セクション4.15:
物理ステップでの衝突処理は、狭相と広相に分けることができます。狭位相では、形状のペア間の接点を計算します。N個の図形があるとします。ブルートフォースを使用して、N * N / 2ペアの狭位相を実行する必要があります。
b2BroadPhaseクラスは、ペア管理に動的ツリーを使用することにより、この負荷を軽減します。これにより、狭位相呼び出しの数が大幅に削減されます。
通常、ブロードフェーズと直接対話することはありません。代わりに、Box2Dは広範なフェーズを内部的に作成および管理します。また、b2BroadPhaseはBox2Dのシミュレーションループを念頭に置いて設計されているため、他のユースケースには適していません。
Bullet Wikiから:
ペアの完全なリストを返す単純なO(n ^ 2)アルゴリズムを改良するさまざまな種類のブロードフェーズアルゴリズムがあります。これらの最適化されたブロードフェーズでは、衝突しないペアがさらに導入される場合がありますが、これは一般的に実行時間が改善されることで相殺されます。それらは異なるパフォーマンス特性を持ち、すべての状況で他のものより優れているものはありません。
ダイナミックAABBツリー
これは、BulletのbtDbvtBroadphaseによって実装されます。
名前が示すように、これは動的なAABBツリーです。このブロードフェーズの便利な機能の1つは、構造が世界とそのコンテンツの次元に動的に適応することです。非常に最適化されており、非常に優れた汎用ブロードフェーズです。多くのオブジェクトが動いている動的な世界を処理し、オブジェクトの追加と削除はSAPよりも高速です。
スイープとプルーニング(SAP)
Bulletでは、これはAxisSweepのクラスの範囲です。これは、汎用の大規模なフェーズでもあり、事前に知られている固定されたワールドサイズを必要とするという制限があります。このブロードフェーズは、ほとんどのオブジェクトがほとんどまたはまったく動きを持たない典型的なダイナミクスの世界で最高のパフォーマンスを発揮します。btAxisSweep3とbt32AxisSweep3は、パフォーマンスを向上させるために、各軸の開始点と終了点を浮動小数点数ではなく整数として量子化します。
次のリンクは、ブロードフェーズの一般的な紹介と、スイープとプルーンのアルゴリズムの説明です(ただし、「ソートとスイープ」と呼ばれます)。
http://www.ziggyware.com/readarticle.php?article_id=128
また、ウィキペディアのページもご覧ください。
http://en.wikipedia.org/wiki/Sweep_and_prune