Saturday, July 28, 2012

Project[Chaos]: Initial Quaternion Julia Sets

I finally got quaternion Julia sets rendering! I've never actually made one before, so I'm quite happy I have at least something. I'll attach some screenshots below. FYI, these are just crude renderings of the depth buffer from ray casting.

So where do I go now? Well, I follow the course outlined on my Project[Chaos] page. But here's a list of the short term goals and tasks, in order:

  1. Add a few more fractal types (maybe one or two more 3D ones).
  2. Refactor and revise the existing fractals (right now I'm just getting them to work, this step will focus on improving each one's design).
  3. Refactor again to give each fractal a common interface.
  4. Multithread the processing.
  5. Create a plugin architecture and connect fractal parameters to the GUI.
  6. Check overall progress and make new short term goals.

At c = 1 - 0.2i + 0j + 0k

At c = -0.162 + 0.163i + 0.560j - 0.599k

And as a side note, I came across a new site that's really cool. subblue has some fantastic fractal renderings and animations, so if you've got a moment I suggest you explore there a bit!

Friday, July 13, 2012


Back in ~2005, I learned about fractals and Mandelbrot sets for my first time from a friend of mine. I became interested, and started working on my own fractal rendering program. After some time I had an interactive program that could render Mandelbrot sets, Julia sets, Buddhabrots, Anti-buddhabrots, and my own tweaked version of a Buddhabrot. I called this program Project[Chaos] (until I could choose a proper name for it).

Project[Chaos] is pulling a phoenix right now. The first version was more of a prototype, and I haven't worked on it for years. I'm rewriting the entire program, with the following goals:

  • High Scalability. I want to take advantage of every core, and eventually handle distributed computing.
  • Unlimited Zooming. I've worked on an arbitrary precision arithmetic library before, and now I want to rewrite it and be able to properly handle any precision for unlimited zooming (within the limits of your memory, of course).
  • Highly Optimized. It needs to be fast. I've got several ideas about this, but really I'm just excited to learn some assembly and SSE.
  • Really Flexible. It's my goal to render any type of fractal (2D, 3D, 4D, IFS, L-system, whatever) and allow for user-defined fractals and provide input parameter controllers.
  • Cross Platform. Windows, Linux, and OS X.
  • Pretty. Gradient support (with some suggested gradients (kuler, anyone?)) where gradients can be edited and results are shown in realtime (for fractals where gradients make sense); PNG output; video output (with full parameter tweening between "keyframes"); customizable rendering; etc.

This project is currently in the "womb" it's so young—it is still in very early deveopment. As this project progresses, I'll update this page and shift from focusing on my goals to what the project actually is (and probably discuss how it works too). I'll also post plenty of screenshots as they become available.

Currently, there's only support for L-systems, Mandelbrot sets, and Buddhabrots, with none of the cool features above. I'm still prototyping the software's architecture (flexible, optimized, and distributed are tricky to all pair together while keeping a clean architecture). I'm getting a feel for what it takes to support several very different types of fractals (next I'm doing Lorenz systems, quaternion Julia sets, IFS (rendered with bitmaps or vector primitives), and some others I've forgotten).

A note on what won't be supported: There are some cool things you can do with fractals, like large scale landscapes. I don't have any plans on competing with Terragen. I haven't worked on large fractal landscapes with vegetation or things like snow, and I currently do not plan on supporting them. I also do not plan on allowing 3D geometry to be generated and rendered in a traditional way via OpenGL. We'll see where things end up once the above goals have been properly met.

Until I make more progress, I'll post some screenshots of my old program. Remember, these are several years old.