ねこでじ(Nekodigi)

Nekodigi’s diary

学習中の気づきをまとめています。応援よろしくお願いします

【Processing×Path Tracing】法線の周りの半球上の点をサンプリングする。

成果物

www.youtube.com
PythonのPath Tracingのサンプルが動いたので、それをもとにProcessingでPath Tracingを作ってみるというシリーズを始めていこうと思います。今回は、そのための基礎として、半球状の点をサンプリングするプログラムを作りました。(均一だと思います。)

仕組み

半球上の点をサンプリングする数式はこのようになっています。expが0の時z座標は均一にサンプリングされますが、均一な半球状の点のz座標の分布は同じなのでそれで完了みたいです。(要検証)
後はtheta*theta+z*z=1の関係を利用してあるz座標でのx,yの拡大率を決めているようです。(thetaは角度ではないことに注意してください)
 \begin{array}{l}
z=( 1-u_{1})^{exp+1}\\
\phi =2\pi \times u2\\
\theta =\max\left( 0,\ 1-z^{2}\right)\\
( \theta cos( \phi ) ,\theta sin( \phi ) ,z)
\end{array}
しかし、今回は、法線の周りという条件があるので、法線からw、法線と(0,1,0)の外積を計算し、法線に垂直な座標vを求め、最後にw,vの外積を求めることでw,vに直交なuを作成し、基底ベクトルw,v,uを作成しました。Pythonのサンプルではvや出力結果を正規化していましたが今回は必要ないと思います。変換対象のx,y,zをそれぞれかけ合わせたら変換ができます。
 \begin{array}{l}
w=\mathrm{normal}\\
v=( 0,1,0) \times w\\
u=v\times w\\
( xu,yv,zw)
\end{array}

コード

expを変更することで点の分布が変更できます。球面上の座標を表すu1,u2の範囲は0~1です。normalのベクトルを変更すれば半球を傾けることができます。
また、基底座標の、uを赤、vを緑、wを青、で表示しています。
orientedHemiSamplingという名前になっています。
github.com