夜風のMixedReality

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

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

本日はグラフィックについてです。

引き続きレイトレーシングを見ていきます。

1979年に登場したレイトレーシングの概念は、現実の光源から物体を散乱、反射、屈折して我々観測者の目に入る光が映像としてとらえることができるという物理学的プロセスの全く真逆、観測者(カメラ)から光源に対しレイ(光線)を飛ばし、ぶつかった物体の情報を取得することでレンダリングに用いる技術で、高度な計算が必要ですが、他の方法では不可能なほどリアルな反射、屈折、光計算が可能となっています。

レイトレーシングのプロセスはいくつかありますが、現在まででカメラ座標の定義、ピクセルよりレイのベクトルの定義をみて、レイと物体の交差のアルゴリズムを見ています。

これは簡単に表現すると形状に対しレイベクトルが領域内に入ることがあるかの判別式を求め、交差判定をしています。

〇レイーTriangles

今回Trianglesとの衝突判定を見ていきます。

レイが平面に当たった場合の判定は前回見ていきました。

この時、さらに交差点がTrianglesの中にあるかを判定することができます。

これにはバリセントリック座標が用いられます。

交差点のバリセントリック座標を見つけ、それらが0以上であれば、交差点がTrianglesの領域内に存在します。

こちらがバリセントリック座標の式になります。バリセントリック座標については後述します。

 \displaystyle 
P=λ_{1}A + λ_{2}B +λ_{3}C
  \
 \displaystyle 
λ_{1} + λ_{2} +λ_{3}=1
  \

以下の式は3次元空間のある点xが3つのベクトル(x_1,x_2,x_3)と対応するスカラー係数(λ1,λ2,λ_3)を意味します。

これはポリゴンの頂点を示します。

 \displaystyle 
x=λ_{1}x_{1} + λ_{2}x_{2} +λ_{3}x_{3}
  \
 \displaystyle 
y=λ_{1}y_{1} + λ_{2}y_{2} +λ_{3}y_{3}
  \

以下の式はバリセントリック座標系の頂点の位置を計算するためのものです。

バリセントリック座標(λ1,λ2,λ_3)の和は1になります。

 \displaystyle 
substitute  λ_{3}=1- λ_{1} -  λ_{2}
  \

ここでλ3を(1-λ1 - λ _2)と置き換えることで3つの変数ではなく2つの変数のみで位置を表すことができるようになります。

 \displaystyle 
 λ_{1}(x_{1} - x_{3}) + λ_{2}(x_{2} + x_{3}) -x_{3} - x= 0
  \
 \displaystyle 
 λ_{1}(y_{1} - y_{3}) + λ_{2}(y_{2} + y_{3}) - y_{3} - y= 0
  \

上記式は点x,yが三角形の内側にあるかを判定する判定式になります。

つまりこのバリセントリック座標にパラメトリック座標としてレイのベクトルを対応させることでレイの交差の判定ができます。

バリセントリック座標の計算をさらに進めると以下のようになります。

ここでdet(T)は三角形の行列の行列式です。

 \displaystyle 
 λ_{1} = \frac{(y_{2} - y_{3})(x-x_{3})-(x_{2} - x_{3})-(y-y_{3})}{det(T)}
  \
 \displaystyle 
 λ_{2} = \frac{-(y_{1} - y_{3})(x-x_{3})-(x_{1} - x_{3})-(y-y_{3})}{det(T)}
  \
 \displaystyle 
 λ_{3} =1- λ_{1} - λ_{2}
  \

これらの式を解いて1,2、3すべてのλが0以上である場合点は三角形の内部に存在すると判定できます。

〇バリセントリック座標とは?

バリセントリック座標は三角形の頂点に対しての重みを表すパラメータです。

重心にも関連がありますが、同じものではなく三角形の三つの頂点に対しる「重み」を示す数値の組み合わせで、三角形内の任意の点を表現するものです。

バリセントリック座標上に無限に点を打つと元の三角形の形状になります。

ある点が頂点ABCで構成される三角形にある場合この点の座標(s,t,u)は次のようにあらわせます。

 \displaystyle 
P = sA + tB +uC
  \

詳しい説明は以下のブログがわかりやすかったです。

zellij.hatenablog.com

本日は以上です。