差分

ナビゲーションに移動 検索に移動

レイキャスト

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

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

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

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

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

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

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

[[category: 3DCG]]
[[category: 衝突判定]]
匿名利用者

案内メニュー