ねこでじ(Nekodigi)

Nekodigi’s diary

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

【Processing】Ray Marchingで3Dマンデルブロ集合を表示する。

成果物

f:id:Nekodigi:20200214232915p:plain
距離、反復回数、光の反射をもとに色を決めています。
f:id:Nekodigi:20200215081234p:plain
精度は分かりませんが、輪郭はあっているような気がします。ただ、Unityで作られたデモと比べると、精度も速度も劣っている気がします。GPU演算ができないのが原因だと思います。※あくまで参考程度にお願いします。

コード

演算子のオーバライドができないので、若干無理があります。
github.com

仕組み

今回は少し難解でしたが、分かる範囲で解説しようと思います。
Ray Marchingについては前回の記事をどうぞ。
nekodigi.hatenablog.com
そもそも、マンデルブロ集合はZ'=Z^2+Cのようにあらわされているのですが、三角関数を使って表すと三次元にも拡張できるようになるのです。複素数の自乗を回転と拡大に置き換えて解説しているサイトが参考になるのでぜひご覧ください。
Skytopia - Mystery of the Real 3D Mandelbrot Fractal
計算式などは、こちらに書かれています。
3D Mandelbrots
マンデルブロ集合との距離を求める数式については、こちらで紹介されていました。証明はなかなか難しそうです。
Distance Estimated 3D Fractals (V): The Mandelbulb & Different DE Approximations | Syntopia
今回、一番参考になったサイトはこちらです。こちらのUnity上での実装をもとに今回の作品を作りました。
www.youtube.com
シンプルなコードですが、かなり奥深かったです。また何か分かったときは報告しようと思います。