This is the last post in my introduction to distance estimated 3D fractals (see Part one for an overview). Originally, I intended this to be much shorter and more focused, but different topics kept sneaking up on me.
This final post discusses hybrid systems, and a few things that didn’t fit naturally in the previous posts. It also contains a small collection of links to relevant resources.
Hybrids
All the fractal systems mentioned in the previous parts apply the same transformation to each point for a number of iterations. But there is nothing that prevents applying different transformations at each iteration step. This has led to a number of hybrid systems, using building blocks from different fractals. They are very popular in Mandelbulb 3D, which comes with a huge library of transformations, which may be stringed together in a vast number of possible combinations.
Spudsville
It is difficult to trace the origin of many of these hybrids, since they are often cloned and modified. One of the more interesting base forms is the Spudsville system by Lenord (see also Hal Tenny’s tutorial on this system).
It is based on the following recipe:
5 x { Mandelbox, i.e. BoxFold, SphereFold, Scaling, Offset } 50 x {BoxFold, Mandelbulb power-2 Squaring }
Pseudo Kleinian
This is another popular base form, based on parameters from Theli-at’s Kleinian Drops. It is based on this formula:
12 x { Scale -1 Mandelbox } 1 x {BoxFold, Mandelbulb power-2 Squaring } 400 x { Scale 2 Mandelbox }
A version of a similar system is available in Fragmentarium as “Knighty Collection/PseudoKleinian.frag”:
It is also possible to throw some Menger structure into the mix (see “Knighty Collection/PseudoKleinianMenger.frag”):
It is a very diverse system: this is the same formula, that I used as a base form for both Time Pieces:
and Pseudo-Kleinian Blue:
There really is no end to the possibilities. Here is another example:
where an octahedral symmetry transformation has been substituted in a Spudsville-like system:
7 x { Mandelbox, i.e. BoxFold, SphereFold, Scaling, Offset } 7 x { Octahedral, Mandelbulb power-2 Squaring }
The question is how to construct a suitable distance estimator for these hybrids systems. There is no easy answer to this. Mandelbulb3D and Mandelbulber both use the numerical gradient approximation discussed in part V of this series.
If the system is composed only of conformal transformations, the scalar approach discussed in part VI will be sufficient.
But for general combinations there is no easy way: it is often possible to guess a decent distance estimator, but more often than not, the analytic distance estimator overshoots and needs to be compensated by a fudge factor.
Interior renderings
The Mandelbrot distance estimation formula discussed in part V is only valid for exterior distances. There also exists a formula for the interior distance (for the 2D case), but it is much more complex than the exterior one, since it requires detecting cycles in the orbit.
However, in some cases the exterior distance estimate (or the absolute value of it), also works as an interior estimate (thanks to Visual for pointing this out). Here is an example of the interior of a Mandelbulb:
Geometric Orbit Trapping
Orbit trapping is often used to color fractals. During the orbit calculation the minimum distance to various geometric objects is stored (often the center, a sphere shell, or the x,y, and z-planes).
But it is also possible to use orbit traps to define the geometry of the fractals. Here is a standard Kaleidoscopic IFS like system, defined by DE such as:
float DE(vec3 z) { int n = 0; while (n++ < Iterations) { // ...do some transformations here n++; } return length(z)*pow(Scale, float(-n)); }
resulting in an image like this:
but by inserting a trap-function and keeping the minimum value, we can create some interesting geometric variations:
float DE(vec3 z) { int n = 0; float d= 1000.0; while (n++ < Iterations) { // ...do some transformations here n++; d = min(d, trap(z) * pow(Scale, float(-n))); } return d; }
for instance, using a cylinder-function for trap(z) results in an image like this:
Heightmap renderings
It is also possible to use distance estimated methods to draw heightmaps of fractals, e.g.:
Included in Fragmentarium as 'Knighty Collection/MandelbrotHeightField.frag'
Or use heightmaps to visualize the algebraic structure of poles and zeroes in the complex plane:
Included in Fragmentarium as 'Experimental/LiftedDomainColoring3D.frag'
Heightmaps can also be generated from Perlin Noise, to create more realistic terrains:
Included in Fragmentarium as 'Experimental/Terrain.frag'
Knots, Polytopes, and Honeycombs
It is also possible to use distance estimation techniques to depict other mathematical structures than fractals. I've written about them before, but Knighty has explored DE's for knots and polyhedra:
for four-dimensional polychora:
and even for hyperbolic honeycombs:
(There are several examples included with Fragmentarium)
Resources
Software
The easiest way to start exploring 3D fractals is probably by trying Mandelbulb 3D or Mandelbulber. Both are very powerful and feature-rich applications.
Mandelbulb 3D (by Jesse) is probably the most used 3D fractal creation tool (judging by pictures posted at Fractal Forums). It contains many different formulas and fragments, which can be combined as hybrids. It is free, closed-source, CPU-based, and Windows only.
Mandelbulber (by Buddhi) is open source, and available for Windows, Linux, and Mac. CPU-based, but with OpenCL preview!
GPU Based renderers
Fragmentarium is my own playground for working with GPU (GLSL) based pixel graphics. It is meant to create a modular and interactive environment for working with 2D and 3D graphics. All the images in this series of blog post were made with Fragmentarium, and many of the systems are included as examples.
Rrrola's Boxplorer is a fast interactive Mandelbox explorer. It has been extended by Marius Schilder in Boxplorer2 to include spline animations, stereo view, and many examples of fractal systems.
Subblue's Pixel Bender Mandelbulb script was one of the first GPU implementations. He has made many great fractal animations and images, so be sure to visit his web site. He also created the impressive Fractal Lab WebGL site, which made it possible to explore fractals directly in a browser (the site is currently under reconstruction)
Eiffie's Animandel Pro is a tool for creating fractal animations. It features a GLSL editor and even an integrated C-compiler for dynamically compiled CPU code. It is certainly not the easiest way to get started, but as can be seen from Eiffie's videos it is a powerful tool.
Web sites and papers
Fractal Forums is the place, where all the new development and discoveries can be followed. It's a treasure chest filled with information, but it can be difficult to find it in the archives. A good place to start is the original Mandelbox thread and the thread about DE's for the Mandelbox.
Daniel White’s Mandelbulb site is probably the best account of the history of this fractal. Also see Paul Nylander’s Hypercomplex systems.
Tom Lowe's Mandelbox site has a lot of information on the Mandelbox, collected by the person who discovered it himself.
Hypercomplex Iterations: Distance Estimation and Higher Dimensional Fractals (2002). by Dang, Kaufmann, and Sandin is a rare mathematical treatment of higher-dimensional fractals and their distance estimates. It is free (but tough!).
J. C. Hart's original paper Ray tracing deterministic 3-D fractals and his sphere tracing papers are must-reads. He has also written many other great papers.
Pouet.net is a web site for demo scene coders. There is a strong emphasis on heavily optimized and efficient code. Several demos features distance estimation and fractals.
In particular Iñigo Quílez has explored fractals and distance fields in a demo scene context. His Rendering Worlds With Two Triangles is a good introduction to distance field rendering. But be sure to check out Quilez's website - there is an abundance of good stuff, including lots of tutorials.