当たり判定

アバター
GRAM
記事: 164
登録日時: 14年前
住所: 大阪

当たり判定

投稿記事 by GRAM » 14年前

当たり判定は難しい…
何が難しいって一つ一つの図形と判定をとるアルゴリズムそのものじゃなくて、それらをまとめて処理するのにどう実装するのかを考えるのが難しい
2Dだったら総当たりで妥協してたのになw

基本的にはBSP木を使う事になるんだろうけれど、床なんかはセル空間分割法を使った方がいいだろうし、RDCアルゴリズムとやらも試してみたい
一つの物体が持つ複数のバウンディングボックスなんかはどこに登録しようかな…
というかプログラミングしてて気づいたんですが、2Dだと比較的簡単にできたのに3Dだと回転軸が自由すぎて衝突の予測が不可能に近い(笑)
回転する2物体の次のフレームでの衝突、その後の位置補正とか考えたくもないですねwカオスになることが予測できる…

今考えている方式での最終目標は当たり判定そのものを見えなくしてしまうことです。
各物体は自分で当たり判定の計算を行わず、管理クラスからどの物体とどのように衝突したかのメッセージだけを受け取るようにしたい…
たとえばミサイルが飛行機に当たるとしたら、ミサイルが自分で当たり判定をして飛行機の耐久力を直接落とすのでなく

まず管理クラスが事前に当たり判定を実行する
→すべての衝突物を列挙
→ミサイルに衝突メッセージを、飛行機に「ミサイルと接触した」というメッセージを送る
→ミサイルは管理クラスに自分を破壊するよう要請する
→飛行機は自分で耐久力を減らす
という流れにしたいんですよね。
所有関係のない物理的な物体間の干渉はポインタじゃなくてメッセージで全部処理したい…。
なんかこう物体が全部ポストを持ってる感じにしたいなぁ。お互いは住所以外は全く知らないという関係がいい。
というのも特定の物体を考えてるときに、他の物体の事なんて考えたくないw
飛行機がミサイルを持っている間はそのミサイルを所有していても、ぶっ放した後は別の物体として振舞い、敵に当たろうが外れようが知ったことじゃない。
その後ミサイルから当たったか外れたかのメッセージが送られてきて初めてヒットしたかどうかを知る。
もしそれに対応してなにか反応するならそれもいいし、もしそのメッセージを処理するすべがなければ何もしない。
うん。こういう感じに実装したいな。

アバター
パコネコ
記事: 139
登録日時: 14年前

Re: 当たり判定

投稿記事 by パコネコ » 14年前

3Dは作ったことないのでどのくらい大変かは知らないのですが、
やっぱり大変なんですね。

なんだか大変そうですが、がんばってください。

ISLe
記事: 2650
登録日時: 14年前

Re: 当たり判定

投稿記事 by ISLe » 14年前

衝突判定オブジェクトをメンバに抱えるようにして、衝突判定オブジェクトリストで当たり判定を行い、衝突判定オブジェクトはオーナーオブジェクトに対してメソッドを呼び出すという形にしてはどうでしょう。
タスクシステムのタスクリストのように当たり判定も汎用化してしまうわけです。

2Dシューティングでも複数のオブジェクトが合体したキャラや複数のバウンディングボックスを持つキャラを実装することがあります。
敵弾との接触用(狭い)と敵本体との接触用(広い)で当たり判定が違うとか。
アーケードのシューティングはいまでも320x240の解像度が多いですから、距離で当たり判定するよりも長方形を並べたほうがどこに当たったかも分かりやすくて便利です。
最後に編集したユーザー ISLe on 2010年12月27日(月) 16:46 [ 編集 1 回目 ]

アバター
GRAM
記事: 164
登録日時: 14年前
住所: 大阪

Re: 当たり判定

投稿記事 by GRAM » 14年前

>>パコネコさん
がんばります!w

>>ISLeさん
ISLe さんが書きました:衝突判定オブジェクトをメンバに抱えるようにして、衝突判定オブジェクトリストで当たり判定を行い、衝突判定オブジェクトはオーナーオブジェクトに対してメソッドを呼び出すという形にしてはどうでしょう。
そうですよね。だいたいそんなことを考えています(僕の理解が正しければですが…)
現状は取り敢えずその衝突判定オブジェクトの実装をいろいろ試してます。
でもなかなかコレ!っていう感じにならないんですよね。試行錯誤中です。