Category processing

nudibranch experiment


Audio by Daft Punk (“Recognizer” from Tron Legacy [SoundTrack]).


Nudibranch is an experiment inspired by the motions of a spanish dancer, a type of sea slug commonly found on coral reefs. They oscillate their fins symmetrically as well as rhythmically to travel through open water. This experiment is an abstraction of that motion.

In my previous experiment, I was writing code natively in Processing IDE. I’ve had some luck working with the FDT4 IDE for work related projects so I figured it was about time to plunge into the Eclipse framework. It was definitely a challenge getting everything setup but once it was, working in Eclipse was a breeze.


The first step was to create a simple following motion in 3d space using code I found while browsing through the processing forums. I implemented it to a simple chain script that I converted from 2d to 3d. While the mouse follow was technically working, the range I was receiving leaned towards the extreme causing weird jumps in animation. I instead opted for a simple motion that followed a osculating track.


In the balloon experiment, I was exposing much of the math calculations which overcomplicated the code. In this experiment, I used the toxiclibs libraries which handled much of the complex mathematics and saved me quite a bit of time and headaches along the way. The purple dots represent a scaffold for me to visualize the flapping motion. To quickly go over the construction, I’m building the nudibranch in terms of segments, like slices of a banana. Each slice points towards as well as follows it’s parent. I first parse and store all the points of all the segments and then draw those points later.


The next step was to create a simple oscillating line that protrudes from the center of each segment aka the fins. Using sinusoidal motion that’s offset by the segment id, I’m able to get the motion and cause a ripple effect that travels from the head to the tail of the nudibranch.


I added another scale and offset to each segment to make the flapping of the fins less rigid. I also started playing with the visuals creating line segments for better viewing.


I added the mesh fills soon after and proceeded to fine tune the parameters I created to mimic the look and feel of a nudibranch. I had quite a bit of fun modifying the parameters via the controlP5 sliders so I exposed it to the viewer and added quite a bit more which included motions related to audio, as well as the ability to randomize and animate across all parameters.

This was the basis for the nudibranch video which randomly changed form and shape over time. It may not look like a nudibranch any more but the essence is still there. Feel free to download the latest mac and pc desktop apps to view the ful experience.

balloon experiment

Written images is an upcoming book comprised of artists creating a series of code generated images. The content of each printed book is a random selection of those images, making each book unique. One of the available ways to submit work was to use processing as a medium. I’ve had some minor success manipulating coordinates in 3d space with my previous flash projects so I assumed it would be easy to do it again in processing.

My idea was to create a randomly generated balloon animals, looking specifically at how the joints are connected from segment to segment. Each segment  has a specific length and a specific rotation which would be nested into the next segment until the dog shape emerges. It seemed simple and straightforward enough until I started rotating each balloon segment in 3d space. I assumed all rotations would be easy to create using only the base x,y,z axis rotations but boy was I wrong. Once I started nesting the segments it became harder and harder to predict where the rotations would end up. There was no easy way to solve this and the deadline was fast approaching so I had to shelf the project until I solve the rotation issue.

Without getting into the details, because frankly I still don’t completely understand them. There are a few ways to do rotations in 3d space. There’s Euler angles, matrix transformations, axis angle rotations and quaternion rotation. After testing every option, quaternion rotation seemed to be the solution. I’m slowly understanding quaternions which I learned from this book and this wikipedia article.

The first thing I did was to randomly distribute a set of points that had no dependency with it’s previous segment. The white lines below represents the segment length and random position.

The violet and green lines represents the start and end 3d tangents of each segment respectively. Getting a 3d tangent aka a cross product is a little tricky only because it requires 2 vectors. I only had 1 so I arbitrarily created another one ( you can barely see it as a small white line extending from each segment corner). After normalizing the cross product and multiplying it by a radius I was able to get the violet and green dots that cap the lines.

Using the quaternion solution above, I was able to get a rotation around the off axis created by the segment line. I distributed the angles in relation to an arbitrary total number of points used to generate a circle and then connecting the front and back points to create a cylinder. I now have enough data to connect the lines using a bezier segment. Each line of a segment is comprised of 2 bezier curves, one from the front and 1 from the back. adjusting where the control points of the bezier are position govern the ‘shape’ of the segment.

This is starting to look good but there was an issue with the segment edges. When I linked a segment, the cross products theoretically should be a mashup of the front and back of two segments. Currently there is no mashing going on so i needed a simple way of averaging of 2 vectors.

My first instinct was to use a SLERP which I will not describe because frankly i couldn’t get it to work. Instead I copped out and used a basic LERP which kind of works well enough to be passable. I think if I started to get serious about creating a balloon shape I’ll probably have to switch over. For now it works well enough. You can see the resulting LERP as the red dotted lines that orbits the joint between two segments.

The next step is to systematize all the arbitrary controls into a unified control panel. ControlP5 made it really easy to add controls to the shape without having to create a radically new interface. PeasyCam made it easy to rotate the balloon in 3d space. I’ll still need an easy way to modify each point manually but currently i’m happy with just using a random spread.

I added a few different views to make it more interesting and a randomizer button that repositions the segments over time. There’s still quite a few more things i’d like to add like audio input and video export but I’m happy with the result so far. Maybe if written images 2 rolls around I can resubmit this to the project.

In the meantime please enjoy the progression of work here.
(Source and local version are also available).

umbrella experiment

Under my umbrella…ella…ella…hey…hey.

In my previous experiment. I used a series of simple methods that calculates rotations in 3d space. For the most part it worked fine, so long as my rotations were parallel to the x, y and z axis. But once the rotation was along an off axis, the math became terribly complex and I entered a world of hurt trying to get my head around quaternions. Pouring through wikis about SLERPs and cross/dot products, I think I finally reached a point were I’ve learned just enough to come up with this umbrella experiment.

I’ve been having some issues with playing java applets online so I created local versions to play with on a mac or a pc.

Where’s the download button?

Sorry folks, I was in the middle of doing a redesign for the May 1st reboot and then I got slammed with work since then. While it’s really no excuse I’ll have them all ready to download with a fancy new button before the end of August-ish.

On a side note, the weird looking icons under the nav will be a set of new navigation options that I have yet to update.