Code

Three.js

Generative Art

Expert A noise-displaced icosphere with per-vertex colour cycling — every frame each vertex is scaled by layered trigonometric noise, producing an organic breathing shape surrounded by a particle halo. Three.js Docs

// High-res icosphere with vertex colours
const geo = new THREE.IcosahedronGeometry(1.0, 6);
const origin = new Float32Array(geo.getAttribute('position').array);
const colors = new Float32Array(origin.length);
geo.setAttribute('color', new THREE.BufferAttribute(colors, 3));

const mesh = new THREE.Mesh(
  geo,
  new THREE.MeshBasicMaterial({ vertexColors: true })
);
scene.add(mesh);

// Layered trig noise — organic, no imports needed
const noise = (x, y, z, t) =>
  Math.sin(x * 2.1 + t) * Math.cos(y * 1.9 - t * 0.7) +
  Math.sin(z * 2.3 + t * 0.5) *
  Math.cos(x * 1.7 - y * 2.1 + t) * 0.5;

const posAttr = geo.getAttribute('position');
const colAttr = geo.getAttribute('color');
const c = new THREE.Color();
let t = 0;

function animate() {
  for (let i = 0; i < posAttr.count; i++) {
    const ox = origin[i * 3], oy = origin[i * 3 + 1],
          oz = origin[i * 3 + 2];
    const n     = noise(ox, oy, oz, t);
    const scale = 1 + n * 0.28;
    posAttr.setXYZ(i, ox * scale, oy * scale, oz * scale);
    c.setHSL(((n * 0.5 + t * 0.04) % 1 + 0.6) % 1, 0.9, 0.6);
    colAttr.setXYZ(i, c.r, c.g, c.b);
  }
  posAttr.needsUpdate = true;
  colAttr.needsUpdate = true;
  mesh.rotation.y = t * 0.18;
  t += 0.01;
  renderer.render(scene, camera);
  requestAnimationFrame(animate);
}