SlideShare a Scribd company logo
www.***.net




 Collision Detection

衝突判定の基礎とCPUの構造から見る高速化
www.***.net




       なぜ衝突判定か
 ゲームでは、処理時間の9割は描画関係。
 でも衝突判定はオブジェクト数のO(n^2)に
 なる。
 画面が複雑になるとオブジェクト数も増え
  る。
 だから結構衝突判定も重い(ことがある)。



                                2
www.***.net




           Contents
 点の衝突判定
 矩形の衝突判定
 矩形と線分の衝突判定
 3Dへの拡張
 ゲームにおけるBVの使用
 衝突可能性による高速化



                                3
www.***.net




           点の衝突判定
 return (a.x==b.x && a.y==b.y) ? 1 : 0;
 return !((a.x ^ b.x) | (a.y ^ b.y));


上記のコードは等価だが、下記のコードは条
 件分岐がなく、高速である。




                                                     4
www.***.net




           矩形の衝突判定
 return  (r1.left <= r2.right)&&(r1.right
  >= r2.left)&&(r1.top <=
  r2.bottom)&&(r1.bottom >= r2.top);
 return ((DWORD)(r1.left - r2.right) &
  (r2.left - r1.right) & (r1.top -
  r2.bottom) & (r2.top - r1.bottom)) >>
  31;
これは最上位ビット(符号)に着目している

                                                  5
www.***.net




   矩形と線分の衝突判定
 は、線分同士の判定に帰着させる。4辺と
線分を交差判定する(包括関係は例外)。



スーパーマリオワールドぐらいならそこまでし
 なくても良い(特殊な矩形を用意)。
坂の任意の点の高さをh=sin(θ)・wで。

                               6
www.***.net




     線分の交差判定
 何気に結構重い処理。
 二つの直線に交差点があるかを確認した
上で、交差点がボックス内に収まっている
か判定する。

 要は連立一次方程式を解きましょう。



                                7
www.***.net




      3Dへの拡張
 点,円はそのまま応用できる。
 矩形はAABBとOBBの二通りが考えられ
  る(とりあえずね)。
 ただし移動を考え始めると結構面倒。




                                8
www.***.net




  ゲームにおけるBVの使用
 本当はマッピング画像(色による判定)を作
 るのがよい(2D)
 本当はポリゴン同士の当たり判定を総当り
 でやる方がよい(3D)

でも面倒かったり重かったり。
特に3Dでは球,AABB,OBB,n-DOPが多い。

                                   9
www.***.net




         OOBの判定
 データ構造が命(一般的なのは中心座標・
  x,y,zへの半径・ x,y,z 方向行列)。
 フィッティングがさらに重要。
ベクトルの微分とかめんどくさいけど。
 死ねる。


n-DOPの方が効率良いんでない?って話も
  あるけど、今回はカットで(ごめん)。

                                     10
www.***.net




衝突可能性による高速化(2D)
 軸ソート
 グリッディング
 BSPTreeも使えるけど、二次元ではあまり
 使用する意義がないと思われ・・




                                11
www.***.net




          軸ソート
 1.矩形のLeftの値でクイックソートする。
 2.ソートされた順番に次の処理を行っていく。
  ・リストに当たり判定を調べる矩形を加える。
  ・リストにある矩形を順に調べていく
    (1)リストからとってきた矩形の右端が今調
 べている矩形の左端より左の場合はリストから
 はずす
    (2)リストからはずさなかった場合は交差判
 定を行う

                                    12
www.***.net




      グリッディング
 1.矩形の範囲からその矩形を含んでいる
  桝目のリストに、そのリストを加える。
 2.桝目のリスト毎で通常の当たり判定の
  計算を行う。

・コツは升目のサイズを2の累乗にすること
・升目のサイズが一意な事と、複数個の枡に
 属するオブジェクトの扱いが問題

                             13
www.***.net




 衝突可能性による高速化(3D)
 kdTree
 BSP Tree
この二つのやろうとしていることは大体一緒。
 そんでもってどっちも2Dにも使える。あん
 まり使用事例聞かないけど




                            14
www.***.net




           kd Tree
 2D→4分木
 3D→8分木   k分木に一般化可能

対象領域全域をカバーする矩形を再帰的に
 n分割する。分割線上のオブジェクトを節に
 保存し、非分割領域に属するオブジェクト
 をそれぞれの葉とする。

                                15
www.***.net




           BSP Tree
 binary
      space partition tree
 見てのとおりの二分木でkd treeと同じこと
  をしようとする手法。超平面とか出てくる。
  むずい。
 何が難しいって、効率的なBSP Treeの構
  築が。何とか最悪を回避すること。



                                 16
www.***.net




        おまけ
 2Dの判定を精密に行うには


当たりエリアを着色した画像を作る。キャラク
 タと同期して動かす(描画しない)。すべて
 の点の座標について、他のキャラクタの当
 たり判定画像が着色されているか調べる。



                             17
www.***.net




        おまけ
 3Dの判定を精密に行うには
→三角形のポリゴンを総当りで判定する。

空間分割と併用すればこれで割とOKな時も
 ある。
※非三角ポリゴンをモデルに含む時が要注
 意

                               18
www.***.net




 三角と三角
 一方の三角形の二つの辺が他方の三角
 形の内部を貫通している
 各三角形のうちのそれぞれの一辺が他方
 の三角形の内部を貫通している

※三角形が縮退しているとだめ。要例外

                              19
www.***.net




        おわり。
 次は誰かほかのテーマでやってくれ。




               ・・・つーか準備不足でごめん。




                                    20

More Related Content

衝突判定

  • 2. www.***.net なぜ衝突判定か  ゲームでは、処理時間の9割は描画関係。  でも衝突判定はオブジェクト数のO(n^2)に なる。  画面が複雑になるとオブジェクト数も増え る。  だから結構衝突判定も重い(ことがある)。 2
  • 3. www.***.net Contents  点の衝突判定  矩形の衝突判定  矩形と線分の衝突判定  3Dへの拡張  ゲームにおけるBVの使用  衝突可能性による高速化 3
  • 4. www.***.net 点の衝突判定  return (a.x==b.x && a.y==b.y) ? 1 : 0;  return !((a.x ^ b.x) | (a.y ^ b.y)); 上記のコードは等価だが、下記のコードは条 件分岐がなく、高速である。 4
  • 5. www.***.net 矩形の衝突判定  return (r1.left <= r2.right)&&(r1.right >= r2.left)&&(r1.top <= r2.bottom)&&(r1.bottom >= r2.top);  return ((DWORD)(r1.left - r2.right) & (r2.left - r1.right) & (r1.top - r2.bottom) & (r2.top - r1.bottom)) >> 31; これは最上位ビット(符号)に着目している 5
  • 6. www.***.net 矩形と線分の衝突判定  は、線分同士の判定に帰着させる。4辺と 線分を交差判定する(包括関係は例外)。 スーパーマリオワールドぐらいならそこまでし なくても良い(特殊な矩形を用意)。 坂の任意の点の高さをh=sin(θ)・wで。 6
  • 7. www.***.net 線分の交差判定  何気に結構重い処理。  二つの直線に交差点があるかを確認した 上で、交差点がボックス内に収まっている か判定する。  要は連立一次方程式を解きましょう。 7
  • 8. www.***.net 3Dへの拡張  点,円はそのまま応用できる。  矩形はAABBとOBBの二通りが考えられ る(とりあえずね)。  ただし移動を考え始めると結構面倒。 8
  • 9. www.***.net ゲームにおけるBVの使用  本当はマッピング画像(色による判定)を作 るのがよい(2D)  本当はポリゴン同士の当たり判定を総当り でやる方がよい(3D) でも面倒かったり重かったり。 特に3Dでは球,AABB,OBB,n-DOPが多い。 9
  • 10. www.***.net OOBの判定  データ構造が命(一般的なのは中心座標・ x,y,zへの半径・ x,y,z 方向行列)。  フィッティングがさらに重要。 ベクトルの微分とかめんどくさいけど。  死ねる。 n-DOPの方が効率良いんでない?って話も あるけど、今回はカットで(ごめん)。 10
  • 11. www.***.net 衝突可能性による高速化(2D)  軸ソート  グリッディング  BSPTreeも使えるけど、二次元ではあまり 使用する意義がないと思われ・・ 11
  • 12. www.***.net 軸ソート  1.矩形のLeftの値でクイックソートする。  2.ソートされた順番に次の処理を行っていく。 ・リストに当たり判定を調べる矩形を加える。 ・リストにある矩形を順に調べていく (1)リストからとってきた矩形の右端が今調 べている矩形の左端より左の場合はリストから はずす (2)リストからはずさなかった場合は交差判 定を行う 12
  • 13. www.***.net グリッディング  1.矩形の範囲からその矩形を含んでいる 桝目のリストに、そのリストを加える。  2.桝目のリスト毎で通常の当たり判定の 計算を行う。 ・コツは升目のサイズを2の累乗にすること ・升目のサイズが一意な事と、複数個の枡に 属するオブジェクトの扱いが問題 13
  • 14. www.***.net 衝突可能性による高速化(3D)  kdTree  BSP Tree この二つのやろうとしていることは大体一緒。 そんでもってどっちも2Dにも使える。あん まり使用事例聞かないけど 14
  • 15. www.***.net kd Tree  2D→4分木  3D→8分木 k分木に一般化可能 対象領域全域をカバーする矩形を再帰的に n分割する。分割線上のオブジェクトを節に 保存し、非分割領域に属するオブジェクト をそれぞれの葉とする。 15
  • 16. www.***.net BSP Tree  binary space partition tree  見てのとおりの二分木でkd treeと同じこと をしようとする手法。超平面とか出てくる。 むずい。  何が難しいって、効率的なBSP Treeの構 築が。何とか最悪を回避すること。 16
  • 17. www.***.net おまけ  2Dの判定を精密に行うには 当たりエリアを着色した画像を作る。キャラク タと同期して動かす(描画しない)。すべて の点の座標について、他のキャラクタの当 たり判定画像が着色されているか調べる。 17
  • 18. www.***.net おまけ  3Dの判定を精密に行うには →三角形のポリゴンを総当りで判定する。 空間分割と併用すればこれで割とOKな時も ある。 ※非三角ポリゴンをモデルに含む時が要注 意 18
  • 19. www.***.net  三角と三角  一方の三角形の二つの辺が他方の三角 形の内部を貫通している  各三角形のうちのそれぞれの一辺が他方 の三角形の内部を貫通している ※三角形が縮退しているとだめ。要例外 19
  • 20. www.***.net おわり。  次は誰かほかのテーマでやってくれ。 ・・・つーか準備不足でごめん。 20