Haloの3D化

透視投影, カラー化の続き。

この前の処理はカメラが固定で投影変換だけしていて、そのカメラに写る範囲に適当にものを置いていた。行列を使って、ぶつは固定でカメラを動かせるようにしよう。

boost::numeric::ublasを使う。これ行列だけじゃなくてベクトルもあるんだなぁ。昨日実装した_dot_productとかはこれのinner_productを使ってもよかったなぁ。まあでもこの程度なら自分で実装しても大した苦労ではない。行列の掛け算とかを自分で実装したくはない。


できた。

x, y平面上に渦巻きを置いてz方向に線が出ているサンプル。

つまずきどころ:

  • ublasのouter_prodは一般の次元のベクトルでの外積なので、返り値が行列。結局3次元のベクトルの外積は自分で定義した。
  • 結局カメラ行列1個では4次元斉次行列にする必要性がぜんぜんないのでベクトルの外積内積しか使ってない。

さて、やりたいことはこれで終わりじゃなくて、haloを光源とした<大域照明をやりたいんだ。まあぼちぼちやろう。(追記: id:nyaxtによれば拡散反射が1回だけでは大域照明とは呼ばないらしい)



19秒くらいかかるなぁ。なんかちょっとずれてるし。

原点に近い側が近い側に、遠い側が遠い側にずれているということは下に凸っぽい非線形な関数で歪んでいるということだなぁ。なんだろう。



X軸とY軸に並行なものを置いてみた。
む、これは!

あー、やっぱり。光源だけ平行投影している。修正修正。

これで40秒くらい掛かる。光源の数nとピクセル数mにO(nm)のオーダーなのできついなぁ。光源が400個あるんだけど、その程度の光源で6000x4200程度のサイズで出すのに1時間かかる計算だなぁ。