It’s quite interesting with some kind of “simulation”. It’s still rough but something like this…

```
void setup() {
size(800, 800, P2D);
int yOffset = 120;
background(0);
noStroke();
fill(255);
textSize(140);
textAlign(CENTER, CENTER);
push();
translate(width / 2, height / 2 + yOffset);
rotate(0.2);
text("Needed", 0, 0);
text("Me", 0, 150);
pop();
loadPixels();
//background(0);
//image(pg, 0, 0);
translate(width/2, height/2 - 100);
float step = 2;
noStroke();
OpenSimplexNoise noise = new OpenSimplexNoise();
float ambient = 2.0;
double nX = 40;
for (float y = -400; y < 400; y+=step) {
for (float x = -400; x < 400; x+=step) {
if (within((int)x+400, (int)y+400+yOffset) == false) continue;
float decay = 1;
for (float z = 0; z < 600; z+=step) {
float n = (float)noise.eval((double)x / nX, (double)y / nX, (double)z / nX);
float density = pow((n + 1) * 0.5, 2.0);
decay = max(0, decay - density * 0.04);
fill(255, (density * 20) * decay);
// orthographic projection
circle(x + random(step / 2), y / 2 - z / 2 + random(step / 2), step * 1.5);
}
}
}
noLoop();
}
boolean within(int x, int y) {
if(x < 0 || x >= width || y < 0 || y >= height) return false;
return (pixels[x + y * width] >> 16 & 0xFF) > 0;
}
```

I took `OpenSimplexNoise.java`

from Visually isotropic coherent noise algorithm based on the simplectic honeycomb. · GitHub

The parameter choice is quite tricky.

with nX = 20

with nX = 40

after some iterations: