Strangelets

This post is about my umpteenth method of generating procedural art. Specifically, I wanted a method that would create solid, amorphous shapes. I had the idea of combining the idea of 3D noise and domain warping from Melted Dreams and the Camouflage algorithm described a couple of days ago:



The idea is to simulate weirdly shaped blobs on a canvas. I mean, that's a pretty easy goal to reach. Still, weird-shaped blobs takes quite a lot of effort. Just Perlin noise on its own is too straight-forward, too expectably uniform over large scales. This is where domain warping comes in - specifically, using 3D noise. 

The two first dimensions of the Perlin noise are straight-forward, just X and Y coordinates. However, the third coordinate is determined by another layer of Perlin noise, which gives these unexpectedly shaped tendrils stretching out of blobs and such.


A quick summary of Camouflage - several layers with their own unique colour and Perlin noise are overlaid. For each layer, the noise value is compared to a cut-off threshold, being either completely opaque or completely transparent.

One departure from the camouflage model is that here two Perlin noise values are calculated, and then the smallest of the two is compared with the cut-off. This is meant to make the shapes more complicated. I believe it works.

And then also adding in domain-warping, as described above.


Another idea taken from Melted Dreams is a high level of variability in how the Perlin noise is configured - here, with independent variables for each layer. Some layers are calmer than others - both differences in frequency, as well as differences in the influence of the third dimension (which creates tendrils, mostly).

This is performed by initialising a bunch of variables to random values at the beginning of the script for each layer. Yeah, pretty simple, really. These then interact in quite unexpected ways. Currently, each layer is identified by fifteen parameters.



Early versions of the algorithm ended up creating quite crowded images. To combat this, each layer has been made to be local, so as to say. Simply put, each layer has a "centre-point". The further away from that point, the more unlikely it is that the layer is active.

One can imagine, for instance, having one colour with the highest likelihood of being active around one corner, and another colour in the middle. This sorts out some of the overcrowding, and also creates a better broad composition. Since the centre-points are completely random and the noise value often is stronger than the influence of the distance to the centre-point, it does not make the composition too predictable, either.



While the original idea was to just have the blobs have flat colours, it turned out to be necessary to add a bit of variety to the colours inside the blobs. First, along the rim (where the value is close to the threshold), the colour is blended quite strongly in a predetermined direction. Towards the centre of the blob, a high-frequency sine of the value and a low-frequency cosine of the value are multiplied to create rings of varying strength. They are more apparent within some blobs than others.


The colours used are made by blending together two primary colours randomly chosen for each image. Sometimes they contrast strongly, and at other times they make for more gentle compositions. Apart from the primary colours, the layers can also be either darker or more pale white. I guess the correct thing to say is that all colours are created as a blend of four colours; black, white, and two random primary colours.


Try it yourself and find the code at OpenProcessing.


My list of different methods of generating art has become quite long by now:
This might amount to something at some point...

Comments

  1. Reminds me of Yves Tanguy https://en.wikipedia.org/wiki/Yves_Tanguy
    Thanks!

    ReplyDelete

Post a Comment