140 likes | 349 Views
プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作. 第 5 回 当たり判定・リベンジ. 今日の内容. 究極の当たり判定を求めて 球の拡張 OBB 完全版 凸包 戻し方で苦労しよう. 球ベース判定の傾向と対策. 球 シンプルイズベスト 球だけで押し通すのは厳しいが、他の判定と併用することも多い 球の中心を「点」から「線分」に拡張することにより、「カプセル」へと進化する カプセル 球よりボリュームの広いエリアをカバー 球の弾丸貫通問題対策としても使用 ボーンのように組み合わせれば人型キャラの判定は十分作れる. 角張り系判定. AABB
E N D
プロジェクト演習Ⅳ・Ⅵインタラクティブゲーム制作プロジェクト演習Ⅳ・Ⅵインタラクティブゲーム制作 第5回 当たり判定・リベンジ
今日の内容 • 究極の当たり判定を求めて • 球の拡張 • OBB完全版 • 凸包 • 戻し方で苦労しよう
球ベース判定の傾向と対策 • 球 • シンプルイズベスト • 球だけで押し通すのは厳しいが、他の判定と併用することも多い • 球の中心を「点」から「線分」に拡張することにより、「カプセル」へと進化する • カプセル • 球よりボリュームの広いエリアをカバー • 球の弾丸貫通問題対策としても使用 • ボーンのように組み合わせれば人型キャラの判定は十分作れる
角張り系判定 • AABB • XYZ軸に平行な直方体 • 球やカプセルとの判定も可能で、その場合は裏技を使ってOBB同様の扱いができる • OBB • 自由に回転できる直方体 • 角張り系判定の究極系とされる • 凸包 • 対球に関しては最強レベルの判定素材 • 凸包同士や、その他の判定素材との連携が困難
凸包とは • 凹んだ部位のない立体 • n角柱、n角錐なども凸包に含まれる • 点(球)との内外判定がべらぼうに簡単 • 衝突検出になると難しいが。。。
とりあえずおすすめは • キャラ • 球(カプセル)、OBB • 障害物 • OBB • 地形 • OBB、角張り系 • 乗っかれる必要があるデカキャラなど • OBB • 視界判定 • ベクトルの内積による角度判定&距離 • 攻撃判定 • 球、カプセル
戻し方 • 動物体の次フレームでの位置を仮定する • その動きを阻害する可能性のある物体全てと衝突判定を行う • 戻しベクトルが発生したら動物体に適用する • 全物体と判定を終えたら終了… ではない
以下のようなシチュを考える • 右図のような状況の場合、Aに衝突して発生した戻しベクトルによって、Bに衝突する危険性がある • A→Bの順に判定できればいいが、そうならなかったらどうする? 真上から見た図 A B
解決案 • 全部の物体と判定して、「戻しベクトルが発生しなかったら」判定終了とする • 色々効率化の余地はあるだろうが、とりあえずはこうしておこう do { 戻しベクトル初期化 for(障害物全部) { 当たり判定する 戻しベクトル加算 } 動物体に適用 } while(適用したベクトルがゼロじゃなかったらもう1回ループ);
重力の扱い • 基本的には常時下向きの力を働かせる • そうすると、同じ高さで並べたブロックでつっかかる • 足下のブロックから先に判定できればいいが、そうもいかない • 速度をXZ方向とY方向に分解して2回判定 真横から見た図 A B
物体を押せるようにした場合 • 押されて動いた物体vs全物体での判定も必要 • 連鎖的に押せるような状況作りは困難 • 判定回数が指数関数的に増加する • 押して動かせるのは限定的にするべき
効率的な判定のためテクニック • 距離で刈り込む • OBBの判定より距離の判定の方が軽い • 具体的な距離の値が要らない(距離内かどうかだけが知りたい)場合は、ベクトルの長さの2乗と判定距離の2乗で比較しよう • if(vec.dist2() < d*d) のように判定 • fkut_OBBでは内部実装済み • クラスタで刈り込む • 常時全物体と判定するのはナンセンスの極み
クラスタリングって? • モノの分類や、グループ分けのこと • マップを領域ごとに分割する • 領域ごとに「どの物体が存在しているか」のリストを持つ • 判定したくなったら、自分が居る領域のリストに問い合わせて判定 真上から見た図
クラスタリングに必要な部品 • 座標→クラスターIDへの変換 • (x, z)の座標値を、一定間隔ごとの整数値に変換する必要がある • 配列の配列 • クラスターIDで問い合わせると、対応する領域の物体情報が取れるようにしたい • vector< vector<int> >などを使う • 本当はlistなどに出来ればした方がよい