プチメタ3.0

刺激を受けた物事に対する感想や考察、資産運用や英語学習、自己成長に関することなど。


衝突判定に必要な3Dモデルの大きさを自動計算する仕組み


ゲームというものは2Dであれ3Dであれ
「何かと何かが衝突する」という状況が多く発生するが、
その判定には当然ながらそれぞれの大きさの情報が必要になる。


2Dゲームの場合は画像の幅や高さを使えばいいが、
3Dゲームの場合はどのようにしているのか、
そのあたりの仕組みを解説してみる。

3Dモデルは頂点の集合体


立体的なキャラクターや背景モデルは
「ポリゴン」と呼ばれる三角形の板で構成されており、
そのポリゴンは3つの頂点が1セットになっている。


平面を使って立体物を表現する手法は
ペーパークラフトに非常によく似ている。




つまりこういった複雑なモデルであっても



結局は多数の頂点が集まっているのだ。


形が複雑になればなるほどポリゴンが増えるのだが、
それらを使って真面目に衝突判定をしていると
計算負荷が大きくなってゲーム中に処理できない。


そこでいかにシンプルに考えるかが重要になる。

モデルを球体に見立てる


たとえばモデルの中心から各頂点までの距離を求め、
その中で一番遠い値を半径とする球体をイメージする。




一番遠い場所にある頂点を基準にしているので
すべての頂点がこの球体の中に収まるはずだ。
つまりこれが3Dモデルのおおよその大きさを表す球となる。


衝突する物体同士を球に見立てれば
2Dゲームと同様に三平方の定理で高速に判定することができる。
これは各作品で非常によく使われている方法だ。


ただし、モデルの形が球状から大きくかけ離れていると
当たっていないのに衝突したと見なされる違和感が出る。




そういう場合は複数の球体を埋め込む形で
ある程度、モデル全体の形に近づけて判定する。
球の個数が多くなるとやや計算回数も増えるが、
それでも三平方の定理だけで処理できるメリットは大きい。

モデルを直方体に見立てる


もうひとつの方法として、
各頂点の中でもっとも大きなX座標の値を調べる。
つまり一番右にせり出している頂点のX座標だ。


同様に、全頂点から最大のY座標と最大のZ座標を探す。
これは一番高い位置の頂点、一番奥にある頂点となる。
それらの値を組み合わせると
もっとも右・上・奥の角を表す座標となる。


さらに全頂点からXYZ座標の最小値も調べて
もっとも左・下・手前の角の座標を割り出す。




その2つの座標が対角に位置する直方体をイメージすると
3Dモデルがぴったり収まるボックスができあがる。


球体として扱いにくいもの、たとえば戦車などは
こういった直方体として考える方がよかったりする。

まとめ

ゲーム機のスペックはどんどん進化するが
その恩恵の大半はグラフィック部分に回されるため、
内部的な処理はできる限りシンプルで高速にする必要がある。


見た目は豪華でも計算上は実は簡略化して判定していることは多く、
最新のゲーム作品であっても
さまざまな工夫と原始的な理屈がベースになっている。



mclover.hateblo.jp

総アクセス数