成果物
www.youtube.com
PythonのPath Tracingのサンプルが動いたので、それをもとにProcessingでPath Tracingを作ってみるというシリーズを始めていこうと思います。今回は、そのための基礎として、半球状の点をサンプリングするプログラムを作りました。(均一だと思います。)
仕組み
半球上の点をサンプリングする数式はこのようになっています。expが0の時z座標は均一にサンプリングされますが、均一な半球状の点のz座標の分布は同じなのでそれで完了みたいです。(要検証)
後はtheta*theta+z*z=1の関係を利用してあるz座標でのx,yの拡大率を決めているようです。(thetaは角度ではないことに注意してください)
しかし、今回は、法線の周りという条件があるので、法線からw、法線と(0,1,0)の外積を計算し、法線に垂直な座標vを求め、最後にw,vの外積を求めることでw,vに直交なuを作成し、基底ベクトルw,v,uを作成しました。Pythonのサンプルではvや出力結果を正規化していましたが今回は必要ないと思います。変換対象のx,y,zをそれぞれかけ合わせたら変換ができます。
コード
expを変更することで点の分布が変更できます。球面上の座標を表すu1,u2の範囲は0~1です。normalのベクトルを変更すれば半球を傾けることができます。
また、基底座標の、uを赤、vを緑、wを青、で表示しています。
orientedHemiSamplingという名前になっています。
github.com