レイキャスト

提供: MonoBook
2017年11月13日 (月) 03:40時点におけるimported>Administratorによる版 (ページの作成:「'''レイキャスト'''(英語:ray-cast)とは、直訳すると「光(ray)を投げる(cast)」という意味であり、主に3Dの衝突判定や、2Dを3D...」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

レイキャスト英語:ray-cast)とは、直訳すると「光(ray)を投げる(cast)」という意味であり、主に3Dの衝突判定や、2Dを3D風にレンダリングするのに使われるアルゴリズムである。 こいつに光の反射の処理を入れるとレイトレーシングになるが、光の反射の処理を入れるとソースコードは100倍くらいに跳ね上がるので実質別物である。

衝突判定

レイキャストでは現在位置から移動予定先まで見えない線(レイ)を発射して、その線上に衝突する物体があるかを判断するアルゴリズムである。「移動先に物体があるか」を算出するものであるため静止した物体の衝突判定には使えない。

レイキャスト1.png

レイキャスト1回あたりの処理はそんなに重たいものではないが、これを3Dモデルで頂点の数だけやるととんでもない計算量になる。 頂点ではなくポリゴンの中心からレイを伸ばせば1/3にはなるがそれでも凄い計算量である。 物理演算エンジンなどではクソ真面目に衝突判定を行う際に用いられており、物理演算エンジンが重い理由のほとんどはこれである。

上記のうち丸印がレイキャストの調べる間隔であり、この間隔を大きくしすぎると物体を突き抜けやすくなり、この間隔を狭くすると計算量が増えて処理が重くなる。 その両者の欠点を埋めるべく、現在位置から遠ざかるにつれ間隔を少しづつ広げていくという手法もある。

処理を軽くすべく、右下から銃の生えているFPSなどのゲームでは、銃弾の衝突判定はレイキャスト、キャラの衝突判定はAABBと使い分けているケースも見受けられる。

レンダリング

レイキャストは重たいというイメージがあるが、1フレームで大量に計算するから重たいのであって、1回の処理自体はそんなに重たいものではない。

そこでレイキャストを使い2Dマップ(2次元配列)から壁の抽出(添字算出)と、レイと壁の衝突角度を算出し、それを3D風に描画するとWolfenstein 3DやDOOMになる。 現在のようなポリゴンを使った本格的な3Dゲームが大流行するより前の時代にに登場した「2Dを3D風に表現」する手法である。

レイキャスト2.png