Strange 3D objects, Perlin noise
Recently I’ve been thinking on ways of programmatically creating curvy and strange, organic-looking shapes in 3D. And reflecting on the fact that I can think of no particular ‘practical’ application for such an endeavor. And concluding that that’s part of what makes it interesting…
Here’s the high-level recipe:
Start with a cylinder or sphere-shaped mesh, where the vertices are evenly spaced . The vertices of the mesh can be thought of as a matrix or grid, where the left and right edges are curved 360 degrees until they meet.
Take an interesting bitmap with varying light and dark areas, whose height and width match the number of rows and columns in the mesh.
Use brightness (or some other color-derived property) from the pixels of the bitmap as a multiplier value to dictate the distance of the corresponding vertices from the z-axis (center) of the shape.
That’s basically it. In Flash, the built-in BitmapData.perlinNoise method is perfect for generating interesting gradients. The kicker is that the last parameter of the method allows you to change the x & y offset for each ‘octave’ (think semi-transparent layer), allowing for gradual, random-looking changes over time.
So on each update, change the offset of each octave of the perlin noise image and recalculate the vertices accordingly. The behavior and properties of Perlin noise does the rest.
Licensed under a Creative Commons Attribution 3.0 License.

May 18th, 2008 at 7:39 am
Absolutely beautiful.
May 18th, 2008 at 8:16 am
thanks
May 18th, 2008 at 8:31 am
looks perfect! perlin noise is one of my favourite functions.
May 18th, 2008 at 12:50 pm
Looks great, but attached archive “strangeobj_project.zip” is damaged.
May 19th, 2008 at 9:57 am
Thanks for sharing your awesome idea.
May 19th, 2008 at 10:57 pm
Rytis, I double-checked, and the ZIP file is alright.
Lee
September 8th, 2008 at 6:34 am
Great idea. I actually was thinking on what 3D Perlin is and simulating it trough offsets is great idea :D And a great demo :)
September 8th, 2008 at 7:33 am
Thanks. 3D perlin noise sounds like a great idea.
One idea that comes to mind – without having to create the algorithm from scratch – would be to use offsets to create a series of bitmaps, and then stacking those 2d bitmaps ‘on top of’ each other to create the third dimension. Similar to what I’m doing here, I guess, except that instead of the extra dimension being time, it would be ‘Z’…
If it was represented it in 3d space, the camera could travel the volume of it and it could look like going through clouds in an airplane, or like going through a nebula…
September 11th, 2008 at 11:13 am
Well I posted my first experiment with it at DA. Looks strange so far :D
September 11th, 2008 at 5:45 pm
Very cool! (http://wonderwhy-er.deviantart.com/art/Volumetric-Perlin-Noise-97650044)
October 8th, 2008 at 9:42 am
This is the most amazing [th!ng] i’ve seen in the flash world in a LONG time. It is quite simply stunning. It is beautifully alien. Refreshingly bizarre and inspiring. I cannot stop looking at it. I simply cannot stop looking at it! It is perfect and pure. And piping in perlinNoise – Brilliant!
October 8th, 2008 at 9:46 am
Wow! Thank you.
Lee
October 9th, 2008 at 1:58 pm
thanx..
October 21st, 2008 at 1:42 pm
This is awesome and the example has inspired me to make something similar but I cant make your example work, what version of paperVision does it use?
January 9th, 2009 at 8:53 am
Well, I can think of an application that can use your technique as a base…
Imagine you have the picture of human face, and being able to bevel/extrude the image pased on the chosen points to create a 3d model of the face in realtime, while retaining the texture of the image across the model.
Not available yet in most commercial modelling apps, and doing this could take you in that direction.
January 9th, 2009 at 8:55 am
if you know of a modelling app that has it, and is cheap… I would love to know.
January 9th, 2009 at 9:00 am
kind of like surface recognition. ART
April 7th, 2009 at 7:57 am
Great job! very clever idea as well!