レイキャスト

提供: MonoBook
レイキャスティングから転送)
移動先: 案内検索

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

衝突判定[編集 | ソースを編集]

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

レイキャスト1.png

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

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

処理を軽くすべく、右下から銃の生えているFPSなどのゲームでは、銃弾の衝突判定はレイキャスト、キャラの衝突判定はAABBと使い分けているケースも見受けられる。また某オープンソース物理演算エンジンソースコードでは、まずAABBで大雑把な判定を行い、次にレイキャストを行うという2段階処理になっているものもあった。

2Dを3Dっぽく描画[編集 | ソースを編集]

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

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

レイキャスト2.png

ボリュームレンダリング[編集 | ソースを編集]

上記では2次元配列から3D風を生成する事例であるが、これに1軸を加え3次元配列から3D空間を描画すればボリュームレンダリングとなる。 一世を風靡した「マインクラフト」である。

視点となる「点」と、その先にあるスクリーンとなる「面」を決め、その視点からスクリーン上の1点を結ぶ線(これをレイという)のさらに先の延長線上にあるボクセルの値を次々と抽出する。レイキャスティングで得られた値を用いて、最大値最小値平均値中央値などといった値に加工し、最終的な映像としてレンダリングすることをボリュームレンダリングという。

一見すごそうに思えるが、やっていることは前述の2Dの3D風描画にZ軸の概念を加えただけである。 単純に重い。