衝突判定

アバター
みょん
記事: 16
登録日時: 12年前
住所: 京都
連絡を取る:

衝突判定

投稿記事 by みょん » 12年前

衝突判定は色々なところに出てくるのでまぁ誰しも一度は組むことになると思います。

実際、オブジェクトの数がそんなに多くない、せいぜい100程度ならば力技で全て判定してやっても問題にはならないと思うのですが、
これが何千何万と増えてくるととてもじゃないけど総当りなんてやってられないと思います。

さて、そんな時になるべく高速で当たり判定をするためのアルゴリズムとして、4分木空間分割というものがあります。
http://marupeke296.com/COL_2D_No8_QuadTree.html
↑ここのサイトがとても丁寧に解説してくださっています。
要は空間を適当に分割してオブジェクトを登録しておいて、同じ空間に属しているものだけ判定すればよい、という考え方ですね。

これを使うと線型時間で衝突判定すべきオブジェクトを調べることができます。

という訳でそれを組んでみましたってだけです。上手く動いて嬉しかったので紹介したくなっただけですが。

あ、言語はもちろんHaskellなので晒してもおそらくここのコミュニティの誰かの役に立つということは無いと思いますが、大量のものを高速に衝突判定したくなったら上の方法を思い出してみてください。
以上です。

デモ動画→http://www.youtube.com/watch?v=cLFmy5AjNWQ
ソースコード→https://github.com/myuon/HSDLightPhyx

ちなみに上の動画はときどき処理落ちしていますが、それは4分木空間分割がC++とHaskellでは少し考え方が違うのでまだ最適化ができていないのと(上のサイトで解説されている方法にしているのでHaskellだと遅い)、そもそもGUIのパッケージとして使っているSDLがあんまり速くない、あとキャプチャソフトの負荷が結構あってPCのスペックがいまいちなので遅くなる(これが一番の理由な気がしますが)という感じです…><

コメントはまだありません。