夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

レイトレーシングについて歴史を交えまとめる その3 アリゴリズム2 レイとオブジェクトの交差

今回はオブジェクトとの交差についてのアルゴリズムについてみていきます。

〇レイとオブジェクトの交差

 レイとオブジェクトの交差とは視点から発射されたレイが3D空間内のどの物体と交差するかを判定するプロセスです。

 レイが物体の表面に当たるかどうか?またどの位置に当たるかを計算、交差点での色、明るさを求めるためのベースとします。

 これはプリミティブの形状によって種類が異なりますが、一般的なアルゴリズムとしては似ています。

 具体的には次に表すレイのパラメトリック方程式をそれぞれのプリミティブのパラメトリック方程式に代入します。

 

 \displaystyle
ray ≡ \vec{P} = \vec{P_0} + \vec{P_1}t
 

ここでPはレイの高線状の任意の点を表し、P0は原点(レイの始点)、 P1は距離を意味します。

 上記式では始点ベクトル+距離ベクトルで光線上のあらゆる点を示すことができるという簡単な式です。   実際に交差判定に用いられるシンプルなアルゴリズムは次のようになります。

  1. レイー球面

2次元平面上の円を表現する手法として円の中心を原点Cとして半径rとしたときパラメトリック方程式は 次のようになります。

 

 \displaystyle
sphere ≡ (\vec{P} - \vec{C})・(\vec{P} - \vec{C}) - r^{2}  =0
 

 

 \displaystyle
substitute: \vec{P} = \vec{P_0}+ \vec{P_1}t
 

 

 \displaystyle
sphere ≡ (\vec{P_0}+ \vec{P_1} -C) ・ (\vec{P_0}+ \vec{P_1} - \vec{C}) - r^{2} =0
 

 

 \displaystyle
sphere ≡ t^{2} (\vec{P_1}・ \vec{P_1} ) + 2t \vec{P_1} ・ (\vec{P_0}+ \vec{C} +( \vec{P_0} - \vec{C}) ・ (\vec{P_0}- \vec{C}) - r^{2} =0
 

3つ目の式は円の方程式であり、ここではオブジェクトの領域を意味します。

4つ目の式は判定式です。

ここでtはパラメータをさし、一般的に角度を表します。(ラジアン

パラーメータを代入することでtについての二次方程式を得られます。(4つ目の式)

 オブジェクトとの交差点を判定するためには判定式を計算し、tの結果が負の場合交差点は存在しないことになります。

 この判定式とはつまるところ円の方程式(オブジェクトの形状)内にレイのベクトルが存在するかを求めています。

 正の場合かつ解が2つ存在する場合レイが2か所で衝突することになります。

 正の場合かつ解が1つの場合は円に接している場合になります。

 1つの正と一つの負の場合はレイが球体内部で発生し、内部から交差している場合になります。

 具体的にはサーフェスモデルにおいてオブジェクトの内部にカメラが存在している場合ということになります。

 交差点は次のように求めることができます。

 

 \displaystyle
Intersection Point = \vec{P_0}+ \vec{P_1}t
 

また法線も次のように求めることができます。

 

 \displaystyle
Normal = \frac{(\vec{P}-\vec{C})}{|(\vec{P}-\vec{C})|}
 

Pはレイのベクトルであり、Cはオブジェクトの原点であり、シェイプに対して垂直な法線ベクトルを求めています。

これによって球との交差判定ができました。

〇レイー平面

平面の場合はポリゴン(三角形)がシーンのレンダリングに一般的に使用されているため最適なアルゴリズムです。

つまり、オブジェクトのポリゴンでレイとの交差を行うアルゴリズムになります。

まず行われるのはレイがポリゴンのどこにヒットしたかを検知することです。

この方法は先ほどのレイー球交差法と似ています。

まずはレイのパラメトリック方程式(以下)を平面のパラメトリック方程式に代入します。

 

 \displaystyle
sphere ≡ (\vec{P} - \vec{C})・(\vec{P} - \vec{C}) - r^{2}  =0
 

平面のパラメトリック方程式は次のように定義されます。

 

 \displaystyle
plane ≡ (\vec{P}・\vec{n} - \vec{A}・\vec{n}) =0
 

球の場合同様tについて解を求めることで判定できます。

階が存在する場合は交差点が存在することを意味します。

本日は以上です。