プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作 第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などに出来ればした方がよい
© Copyright 2025 ExpyDoc