フラクタル・ギャラリー1
前回の記事もそうだったように、レイトレーシングの手法の一つにSphereTracing法というものがある。
このSphereTracing法の距離関数を上手く設定することで、3Dフラクタルを現実的な速度で書く事ができます。
3Dフラクタル描画の問題点
一般的に、GPUを使って2Dフラクタルを実装する際は、フラクタルを描画したい閉区間をピクセルにラスタライズして、各点がそのフラクタルの内部にあるか外部にあるか確かめねばならない。(図1)
これを常識的に拡張すれば、当然3Dのピクセル、すなわちボクセルの集合体として閉空間をラスタライズし、フラクタル内部の点かどうか確かめ適当な射影行列で2Dにマッピングするという考えに至るだろう。
しかし、これには問題がある。それは計算量の問題である。2Dフラクタルの計算量は時間計算量・空間計算量ともにO(n^2)であり、これを拡張した3DフラクタルではO(n^3)となっている。これは非常に大きい。
距離関数の設計
そこで、SphereTracing法である。すなわち、ある点が与えられた時、その点から最も近いフラクタル立体の距離がわかれば、ST法を用いて計算量O(n^2)で2Dマッピングができるというわけだ。
詳細な距離関数の設計は他所(Hypercomplex Iterations,Distance Estimation and Higher Dimensional Fractals, Yumei et al.)に譲るとして、フラクタルの構成の際に、すべてが等角写像であれば、距離関数d(r)は
d(r) > sd(r) = 0.5rlog(f(r))/abs(grad(f(r)))
で計算できることが知られている。ここで等号ではなく不等号が使われているのは、距離関数の近似を用いているためである。ST法ではsum(n=0…∞)d(r_n)=sum(n=0…∞)sd(r_n)が成り立つとき、dをsdで代用できる(自明である)。
これを用いて、実際にフラクタルを実装してみた結果が、次のようである。
描画結果
これらは、現在開発中の「フラクタル・エディタ(3Dver)」の出力結果である。解像度がころころ変わっているのは気にしないで欲しい。「フラクタル・エディタ(3Dver)」はリアルタイム式(Unity)と高解像式(CUDA)の二種類を開発している。しかし、やっていることは変わらないのであんまり意味は無い。しいて言えば、CUDA式のほうが拡張性が高いといったところである。現在、フラクタル・エディタに進化計算システムを追加しようとしている。
Posted on: 2016年2月21日, by : UMU