【西川善司が語る“ゲームの仕組み” Vol.3】見た目とは違う!?ゲームの「当たり判定」

2023.03.03
注目記事ゲームづくりの知識しくみをつくる西川善司が語る“ゲームの仕組み”
この記事をシェア!
Twitter Facebook LINE B!
Twitter Facebook LINE B!

今回は「当たり判定」をテーマにして、ゲームにおける「衝突」について学びます。10万ポリゴンの3Dモデル同士が衝突するとき、合計20万ポリゴンの衝突判定を1つずつ行うのは現実的ではありません。離散的に時間が進むゲームという存在に対して、最もベストな当たり判定の仕組みはどういったものでしょうか?キャラクターや敵、アイテムを「直方体の箱」に見立てて処理を行うAABB、OBBの概念を、イラスト付きで解説します。

TEXT / 西川 善司
EDIT / 神山 大輝

目次

西川善司

前回はゲームにおける「時間進行」についてお話ししました。ゲーム内の時間は、現実世界の連続的な進行とは異なり、離散的なもので、一瞬一瞬が“飛び飛び”な「デジタルなもの」なのでした。

そしてデジタルな時間進行こそが、フレームレートと深い関係性であることにも触れました。ゲーム内の時間進行の“飛び飛び”具合と、キャラクターやオブジェクトの速度の関係により「衝突」を免れてしまうようなことがあるという話題にも行き着きましたね。

ということで、今回はその続き。

ゲームにおける「衝突」や「当たり判定」というものについてもう少し深く見ていきたいと思います。

「生きていることの実感」それは衝突判定から!?

我々、現実世界の人間が「ああ、オレは今生きているんだ」と実感できるのは、我々の五感が現実世界を感じ取れることに大きく関係しています。歩行すれば足は地面との接地感を実感しますし、大好きなあの子と手を繋けば「その触感」を感じます。もし、自分の足が地面をすり抜け、あの子の手を掴めずスルっと通り過ぎてしまったとしたら、我々人間は、この世界で生きている意味や目的をだいぶ見失ってしまうかも知れません。

ゲームも大体同じです。乱暴な言い方をすれば、コンピュータゲームなんてものは「2Dなり3Dなりの仮想世界にプレイヤーがちょっかいを出して、その反応を楽しむもの」ということができます。

巨大なドラゴンが爆炎を吐いても、その炎は騎士を素通りし、騎士の聖なる剣撃もそのドラゴンの体を切り裂くことはなく、ただすり抜けるとすれば、その情景がどんなに美しいグラフィックスで描かれていたとしても「クソゲー」のレッテルを貼られるでしょう。それだけゲームにおいて「衝突判定」(当たり判定)は重要なことだといえます。

現実世界にも衝突判定があって本当に良かったと思います。最近は、「衝突判定がなければこの世から戦争もなくなるのに…」と思うこともしばしばありますが…。

この連載ではあまり見られない、社会派の“うまいこと”を言ったところから本題に移っていきましょう。

ギリギリ避けた?それとも当たった?

我々の住む現実世界では、そこにあるコップやら机やらクルマやらに手を伸ばせば、その形状通りの触感が得られます。

大好きなあの子の頬に手を触れれば、その丸みを帯びた形状の触感を感じ取ることができるでしょう。そして、この様子を見ていた2番目に大好きなあの子が登場して「あんた!誰といちゃついているのよ!」と、後ろからコップを投げられたとします。反射神経のよいあなたは身を引いて回転して飛んでくるコップを見事に避けることができました。ただ、コップとあなたの顔面の距離はわずか数mm程度。まさにギリギリ避けたという感じでした。

ものが飛び交う痴話げんかに限らず、現実世界ではこのくらいの「ギリギリ、当たりそうだった」話はそこら中にあります。しかし、もしこの状況が一般的なゲームの場合だったら、投げられたコップはヘッドショット扱いとなっていた可能性があります

どういうことなのでしょうか?

「梱包箱」から始まった3Dグラフィックスゲームの衝突判定

多くのゲームファンは、ゲーム画面に広がる映像の情景で衝突判定が行われていると考えているかも知れません。確かにそういうゲームもあるかもしれませんが、多くのゲームは衝突判定をかなり大ざっぱに扱っています

前回「ゲーム世界は大ざっぱな離散時間で出来ている」という話をしましたが、実は衝突判定も似ていて、「ゲーム世界は大ざっぱな衝突判定で出来ている」場合が多いです。

3Dグラフィックスベースのゲームが三角形(ポリゴン)の集合体で出てきていることを知っている人は多いと思います。かっこいい主人公キャラクターも、かわいいヒロインキャラクターも、三角形を繋ぎ合わせた3Dモデル(メッシュモデル)で出来ています。最近のPS5世代のゲームだと、1キャラクターあたり数万ポリゴンで構成された多ポリゴンモデルで構成されている場合が多いです。

レンダリング後の最終画面

同一シーンのワイヤーフレーム画像。こうしたゲームでは、果たしてシーン内の全てのポリゴン単位の衝突判定を行っているのだろうか

※本タイトルはAIを活用した、AI自動テストソリューション「Playable!」などを提供するAIQVE ONE株式会社より提供いただいています(デモゲーム開発:株式会社ヒストリア)

もし、画面に描画された数万ポリゴンで出来た2体の3Dモデル同士の衝突判定を“きまじめ”に行うとしたら「2体の3Dモデルを構成する数万ポリゴン同士の総当たりの衝突判定」を行うことになります。

そのシーンに、同クオリティの10体の3Dモデルがあったとして、相互に当たり判定を取るとしたら「10体の3Dモデルを構成する数万ポリゴン同士の総当たりの衝突判定」が必要になってくるということです。

さすがに、これは非現実的ですよね。ここでちょっとした工夫を導入します。

それは、それぞれの3Dモデルをすっぽりと包んだ梱包箱のような大ざっぱな「直方体」の仮の衝突判定を各3Dモデルに設定しておくことです。

最初から「10体の3Dモデルを構成する数万ポリゴン同士の総当たりの衝突判定」を行うのではなく、10個の梱包箱同士の衝突判定を先に行うことから始めるのです「衝突している梱包箱」の組み合わせが分かれば、「総当たりの衝突判定」を行うべき3Dモデルの個数を絞ることが出来ます。

こんな3Dグラフィックスベースのゲームの1シーンがあったとする。衝突判定を、このシーンに登場する、各3Dモデルを構成するポリゴン同士の総当たりで実践するのは演算負荷が高すぎる

そこで、各3Dモデルがすっぽりと入る、“まるで梱包箱のような”直方体同士の衝突判定を最初に行い、この直方体が衝突しているもの同士についてより正確な衝突判定を取るようにすれば、演算負荷を激減させられる

ここでふと我に返ります。

各3Dモデルをすっぽりと囲った梱包箱的な直方体同士の衝突判定が取れたのであれば、その情報を使ってそこそこのゲームは成立させられそうです。実際、最初期の3Dグラフィックスベースのゲームは、そうした衝突判定を使っていたものもありました。

「AABB」と「OBB」

「3Dモデルをすっぽりと囲った梱包箱的な直方体」の作り方には、大別して2つあります。

1つは「AABB(axis-aligned bounding box)」というもので、「3Dモデルをすっぽりと囲った梱包箱的な直方体」の各辺をX軸,Y軸,Z軸に平行なもので構成する方法です。日本語では「軸平行境界ボックス」と呼ばれます。これは、3Dモデルの向きを無視して「梱包箱的な直方体」は、X軸,Y軸,Z軸に平行なものになるので、時間の経過とともに3Dモデルが向きを変えて動く場合、その梱包箱のサイズは大きくなったり小さくなったりすることがあります。

AABBの概念図。3Dモデルがすっぽり入る直方体の各辺はx軸,y軸,z軸に平行となるのがAABBの鉄則

つまり、AABBベースの直方体ベースで衝突判定をとろうとすると、かなり粗っぽく大ざっぱなものになります。しかし、衝突判定自体は各直方体を構成する8個の座標の大小関係で判定できますから、演算はとても軽量です。

ここでちょっと脱線させて下さい。

現在、PS5やXbox Series X|S、そしてPC向けの最新GPU達はレイトレーシングに対応しましたよね。実は、レイトレーシングに対応したGPU達は、3Dシーン内の全3Dモデル達をAABBベースで管理し、3D空間上の各所で放たれたレイと、3Dシーン内の3Dモデルとの初期衝突判定(レイトレーシング用語では交差判定といいます)をAABBベースで行っています。これは「レイと3Dシーン内の3Dモデルの交差判定」を「レイとポリゴン総当たり交差判定」にしないための工夫に使われています。いずれ機会があれば、この話題をやることがあるかも知れません。

近代GPUのリアルタイムレイトレーシング技術において、その3Dシーンに対して放たれたレイが、その3Dシーン内の3Dモデルに衝突したか/否かの初期判定の仕組みにもAABBが用いられている。レイトレーシングにおける3DシーンのAABB構造は、大きなサイズのトップAABBと、細かなボトムAABBからなる階層構造になっている。図版は拙著「ゲーム制作者になるための3Dグラフィックス技術 改訂3版」より引用

話を「ゲームにおける衝突判定」に戻しましょう。

もう1つは「OBB(Oriented Bounding Box)」というもので、「3Dモデルをすっぽりと囲った梱包箱的な直方体」の各辺を、3Dモデルの前後左右の向きに配慮して構成してやる方法です。日本語では「有向境界ボックス」と呼ばれます。

AABBとは違って、「3Dモデルをすっぽりと囲った梱包箱的な直方体」の各辺を「X軸,Y軸,Z軸に平行にする」という鉄則に縛られない手法なので、3Dモデルがどっちを向こうが、その3Dモデルを囲む直方体は常に最小の体積で構成されることになります。時間が進むごとに向きを変えて移動する3Dモデルがあったとすると、そのOBBの大きさ(体積)は、各3Dモデルが変形しなければ(あるいは姿勢を変えなければ)、基本的には不変(一定)です。イメージ的には、現実世界のオモチャの梱包箱のような感じです。

OBBの概念図。3Dモデルがすっぽり入る“最小”の直方体に相当する。直方体の各辺はx軸,y軸,z軸に平行でなくてもよい…というのがAABBとの最大の違い。上で示した“梱包箱”の図版は、実はOBBの図版だった

3Dモデルが3D空間を縦横無尽に向きを変えて移動する3Dグラフィックスのゲームにおいて、直方体単位で衝突判定を取るならばOBBの方が向いていそうです。

ただ、OBBはAABBと比べて幾何学的な計算が増えて、処理系としてはやや複雑化します。比較的等身の低いキャラクターを取り扱ったアクションゲームや、向きは変われど形状が大きく変化しない自動車が登場するレーシングゲームであれば、このOBBを使った衝突判定でも、それなりに問題は起きなそうです。

速度の速い動体の衝突判定を取るための別の方法

さて、本連載の前回で「動きの速い動体が、衝突判定を免れて壁をすり抜けてしまう珍現象が起こり得る」という話題をお届けしました。解決手法として「ゲームの処理単位時間を狭める」という直接的な手法があるという話をしました。

関連記事
【西川善司が語る”ゲームの仕組み” Vol.2】いつもの日常とゲームの世界では時間の流れ方が違う?ゲームは”離散時間”で出来ている
2022.11.11

簡単に振り返ると、たとえばゲーム映像が毎秒60コマの60fpsで動作している際、多くのゲームでは60分の1秒の16.67ms単位の衝突判定を取るのが基本概念となりますが、動体の動きが速すぎると16.67msの時間内で壁の厚み分をワープしてしまい、それが衝突判定のすり抜けに繋がってしまうという、あの話です。

これを解決するためには、ゲームの映像描画/表示が60fpsだとしても、衝突判定や物理シミュレーションを60fps(16.67ms間隔)よりも短いサイクルで行うとこの問題を回避出来ることがあります。

前回は「ゲームにおける時間は離散時間である」というお話が主体だったので、こうしたストーリーにしましたが、実際のゲームにおける衝突判定では別の手法もよく用いられます。

それは、1フレーム前の時間の3Dオブジェクトの状態から、現在フレームの3Dオブジェクトの状態までの残像のような領域を考えて、その残像領域が衝突しているかで衝突判定を行うという考え方です。たとえば60fpsのゲームは16.67msごとにゲーム内時間が進んでいきますが、ある瞬間のボールの衝突判定を、16.67ms前(1フレーム前)のボールの位置から、現在時間までのボールの位置までの移動軌跡領域を考えて、「それが壁に当たっているか」で考えるのです。

壁とボールの軌跡領域との衝突判定。高速に動く動体に対する衝突判定は、その動体の前フレーム時間から現在フレーム時間までの移動軌跡領域に対して衝突判定を行えばすり抜けを抑止できる

動き回る敵キャラに対してボールを当てる場合についても同様です。16.67ms前(1フレーム前)のボールの位置から、現在時間までのボールの位置までの移動軌跡領域と、16.67ms前(1フレーム前)の敵キャラの位置から、現在時間までの敵キャラの位置までの移動軌跡領域とが、衝突しているかを判定してやります。

動くボールの軌跡領域と動く敵キャラの軌跡領域との衝突。ドッジボールのイメージ…にしてはボールも敵プレイヤーも移動速度が速すぎるような感じもするがそのあたりはご容赦を。1フレーム時間の間に移動するボールの軌跡領域と敵プレイヤーの移動軌跡領域の衝突判定を実践すれば高速移動体同士の衝突もすり抜けを免れる

これらの衝突判定は、アンリアルエンジンではMeshのCCD(常時当たり判定)フラグをONに、Unityでは衝突判定の設定を「Continuous」(例:動くボールと静止している壁)、「Continuous Dynamic」(例:動くボールと動いている敵キャラ)などを選択することで実践出来るようになります。

1フレーム前と現在フレームまでの時間の移動軌跡は、一般的なゲームでは直線移動(なおかつ加速度変化なし)で考えてしまうことが多いです。しかし、この考え方だと、たとえば「回転運動をしている動体を直線運動の軌跡で考えてしまうのは問題があるのではないか?」と、そう思う人もいるかも知れません。実際、投げたボールの軌跡は、重力の影響で放物線で落ちていくわけですから、ボールの毎フレームの動きの衝突判定を「直線運動の繋ぎ」で近似するのは荒っぽいのではないかとの指摘もあるでしょう。

確かに、ゲームによっては、そういうことも考えないといけない場合もあるかも知れません。

たとえば野球ゲームにおいて、放物線状の軌跡で球速150km/hにて飛ぶボールをスイングスピード150km/hの回転運動のバットで打つ際の当たり判定を取る場合は、ボールもバットもそれぞれ60fpsのわずか16.67msの間に約70cmも移動してしまいます。高速移動する動体同士の衝突を精密にとるには、この方法は相応しくない可能性もあるわけです。この場合は、前回取り上げたシミュレーション時間間隔を16.67msよりも狭める、といった工夫も考えなくてはならないかも知れません。

回転運動と放物線運動の高速動体同士の衝突。直線的な補間領域同士の衝突判定では「目標とするゲーム性」の実現が叶わない場合もあるかも!?

ただ、日常生活上の常識的な速度で運動する動体を取り扱うようなゲームであれば、たとえば60fpsのゲームにおける1フレーム前と現在フレームの間のわずか16.67msの移動量は微々たるものになるため、直線的な運動で近似してしまっても「問題なし」と考える場合が多いです

いずれにせよ、ゲームにおける衝突判定の取り方は「これで万能」というものはありません。

ゲームのテーマ、あるいはゲームにおける動体オブジェクトの特性に応じて適切な手法を選択する必要が出てきます。今回は、梱包箱(直方体)の衝突判定の話で終わってしまいましたが、実際の多くのゲームでは梱包箱よりはもう少し高精度な衝突判定を実践していますので、次回はそうした話題を取り上げていきたいと思っています。

関連記事
【西川善司が語る”ゲームの仕組み” Vol.1】3Dゲームグラフィックスの基礎となる”カメラの概念”をイラスト付きで解説
2022.06.27
関連記事
【西川善司が語る”ゲームの仕組み” Vol.2】いつもの日常とゲームの世界では時間の流れ方が違う?ゲームは”離散時間”で出来ている
2022.11.11
西川善司のYouTubeチャンネル
西川善司

プログラマーを経て技術系ジャーナリストへと転身。以降、半導体、ソフトウェア、グラフィックス、ディスプレイ、自動車、人工知能、ゲーム開発などの分野に注力した取材を行っている。

関連記事

【西川善司が語る“ゲームの仕組み” Vol.5】ポリゴンでモデリングされた3Dキャラクターを動かすための技術
2024.10.29
【西川善司が語る“ゲームの仕組み” Vol.4】実際のゲームの「当たり判定」はカプセル剤で出来ていた!?
2023.10.16
【西川善司が語る”ゲームの仕組み” Vol.2】いつもの日常とゲームの世界では時間の流れ方が違う?ゲームは”離散時間”で出来ている
2022.11.11
【西川善司が語る”ゲームの仕組み” Vol.1】3Dゲームグラフィックスの基礎となる”カメラの概念”をイラスト付きで解説
2022.06.27
『SINoALICE ーシノアリスー』が『シノアリスだったナニカ』に移行するまで。アプリサーバーなしで7年間のプレイ記録を後続アプリへ引き継ぐ【CEDEC2024】
2024.11.20
Unity 6のグラフィックスに関する学習リソースまとめ、Unity Technologiesが公開
2024.11.19

注目記事ランキング

2024.11.14 - 2024.11.21
VIEW MORE

連載・特集ピックアップ

イベントカレンダー

VIEW MORE

今日の用語

フォワードシェーディング(Forward Shading)
フォワードシェーディング オブジェクト毎にライティングの計算を行い、その計算結果を描画するレンダリング手法。フォワードレンダリングともいう。ディファードシェーディング(Deferred Shading)に比べてポストプロセスの自由度は低いが、(何も物を配置しなかった際にかかる)最低限の描画コストが低く、アンチエイリアス処理などにおいてフォワードシェーディングの方が有効な分野も存在する。
VIEW MORE

Xで最新情報をチェック!