球体スウィープボリューム(SSV)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/11/13 13:05 UTC 版)
「衝突判定」の記事における「球体スウィープボリューム(SSV)」の解説
上記の衝突判定ではすべて、オブジェクト同士が衝突しているかどうかを「1フレームごと」にチェックする、つまり「離散的(Discrete)」な衝突検出法を用いた。1フレームごとにしか衝突判定を行わないことで、高速な衝突判定が行えるが、しかしこの方式を用いた場合、オブジェクトが速すぎてヒットボックスが1フレーム以下の時間で壁を通り過ぎてしまって衝突判定が行われない、トンネリング(いわゆる「壁抜け」)が起こりがちである。それを防ぐためには、1フレームごとに離散的に衝突判定を行うのではなく、連続的に衝突判定を行う「連続的衝突判定」(Continuous Collision Detection, CCD)と言う手法を取るのが一般的である。そのための最も一般的な手法がこれである。 オブジェクトを球体で近似する。この球が、現在の速度で直線的に動くと考え、「ある点」から「ある点」まで移動することで出来る軌跡を考える。この結果できた、カプセルのような形をしたボリューム(掃引体)のことを「球体スウィープボリューム(sphere-swept volume:SSV)」と言う。このボリュームが別のオブジェクトと接触していた場合、衝突が発生していると考えられる。 球体スウィープボリューム同士の衝突判定を行うことで、高速に動くオブジェクト同士の衝突判定も行える。動く球同士の衝突判定の取り方を説明すると、動く球は、移動開始時の中心・速度ベクトルV・半径、で表すことができる。現在のフレーム(フレーム0)と次のフレーム(フレーム1)の間の時間において、0 < t < 1 となる媒介変数 t を使うと、球Aの中心は (A0 + t Va), 球Bの中心は (B0 + t Vb) と表せる。このように動いていく球A・球Bの中心どうしの距離が、半径の和以下になるような時刻 t が存在するか? を求める。 この手法では物体の角運動を無視しているため、回転運動をしているオブジェクトではやはり「壁抜け」を起こしやすい欠点があるのと、かなり計算機負荷の高い手法であるため、大量のオブジェクトが存在する状況では計算量が増大し、オーバーヘッド(いわゆる「処理落ち」)が発生する懸念がある。 2Dの場合は、円形のスウィープボリュームを用いる以外は同じである。1990年代以降のFPSでよく使われている(例えばアンリアルエンジンでは「カプセルスイープ」として実装されている)が、敵が遠くにいてもショットガンが1フレームで高速に真っ直ぐに敵に着弾するという、文字通りアンリアルな挙動になりがちである。
※この「球体スウィープボリューム(SSV)」の解説は、「衝突判定」の解説の一部です。
「球体スウィープボリューム(SSV)」を含む「衝突判定」の記事については、「衝突判定」の概要を参照ください。
- 球体スウィープボリュームのページへのリンク