フラクタル

フラクタルギャラリー2

フラクタルギャラリー1」の続き。

要旨

ST法により等角写像を繰り返し用いた3Dフラクタルを実装できる。

等角写像を用いる順番、種類、回数を変えることにより、様々な3Dフラクタルを実装できる。

描画結果

f5f4f3f2f1f

最後の奴は、何かの膜で包まれているようにも見える。

フラクタル・ギャラリー1

f
サムネイル

前回の記事もそうだったように、レイトレーシングの手法の一つにSphereTracing法というものがある。

このSphereTracing法の距離関数を上手く設定することで、3Dフラクタルを現実的な速度で書く事ができます。

3Dフラクタル描画の問題点

 

ff
(図1)開発中のフラクタル・エディタ(2Dver)

一般的に、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式のほうが拡張性が高いといったところである。現在、フラクタル・エディタに進化計算システムを追加しようとしている。

imagee5

mandelbox_mmm

ff