第 5 回:当たり判定・リベンジ

Download Report

Transcript 第 5 回:当たり判定・リベンジ

プロジェクト演習Ⅳ・Ⅵ
インタラクティブゲーム制作
第5回
当たり判定・リベンジ
今日の内容
• 究極の当たり判定を求めて
– 球の拡張
– OBB完全版
– 凸包
• 戻し方で苦労しよう
球ベース判定の傾向と対策
• 球
– シンプルイズベスト
– 球だけで押し通すのは厳しいが、他の判定と併用
することも多い
– 球の中心を「点」から「線分」に拡張することに
より、「カプセル」へと進化する
• カプセル
– 球よりボリュームの広いエリアをカバー
– 球の弾丸貫通問題対策としても使用
– ボーンのように組み合わせれば人型キャラの判定
は十分作れる
角張り系判定
• AABB
– XYZ軸に平行な直方体
– 球やカプセルとの判定も可能で、その場合は裏技
を使ってOBB同様の扱いができる
• OBB
– 自由に回転できる直方体
– 角張り系判定の究極系とされる
• 凸包
– 対球に関しては最強レベルの判定素材
– 凸包同士や、その他の判定素材との連携が困難
凸包とは
• 凹んだ部位のない
立体
• n角柱、n角錐なども
凸包に含まれる
• 点(球)との内外判定が
べらぼうに簡単
– 衝突検出になると
難しいが。。。
とりあえずおすすめは
• キャラ
– 球(カプセル)、OBB
• 障害物
– OBB
• 地形
– OBB、角張り系
• 乗っかれる必要があ
るデカキャラなど
– OBB
• 視界判定
– ベクトルの内積による
角度判定&距離
• 攻撃判定
– 球、カプセル
戻し方
• 動物体の次フレームでの位置を仮定する
• その動きを阻害する可能性のある物体全
てと衝突判定を行う
• 戻しベクトルが発生したら動物体に適用
する
• 全物体と判定を終えたら終了…
ではない
以下のようなシチュを考える
• 右図のような状況の
場合、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などに出来ればした方がよい