A sphere, displaced along its own normals
The organic, breathing surface starts life as an ordinary UV or icosahedral sphere mesh. Every vertex is then pushed outward or inward along its own surface normal by an amount that comes from a smooth noise function evaluated at that vertex's 3D position, plus a slowly advancing time offset:
displaced = position + normal * noise3D(position * frequency + vec3(0,0,time*speed)) * amplitude
Because the offset is added along the normal rather than in a fixed direction, the surface bulges and dimples in a way that always looks anchored to the sphere rather than sheared sideways — the same trick used to sculpt terrain heightmaps, just wrapped around a ball instead of a flat plane.
Why simplex noise, not classic Perlin noise
The noise function itself is almost always simplex noise, Ken Perlin's 2001 successor to his original 1985 Perlin noise. Classic Perlin noise interpolates pseudo-random gradient vectors placed on the corners of a square (2D) or cube (3D) grid; in n dimensions that grid cell has 2ⁿ corners, so the cost of evaluating one noise sample explodes with dimension — 8 corners in 3D, 16 in 4D. Simplex noise instead uses a simplex, the simplest possible shape that fills space in n dimensions with the fewest vertices — a triangle in 2D, a tetrahedron in 3D, so a 3D sample needs only 4 corner evaluations instead of 8. It is also visually cleaner: the square/cube lattice underlying classic Perlin noise leaves faint axis-aligned directional artifacts, while the simplex lattice is far more isotropic, so the resulting bumps do not silently prefer the x, y or z axis.
Continuity: why the morph looks fluid, not jittery
Both noise families are built to be C¹ continuous — the function and its first derivative vary smoothly everywhere, with no sudden jumps between grid cells. That matters twice over here: spatially, so neighbouring vertices displace by similar amounts and the surface doesn't tear into facets; and temporally, because advancing the noise function's hidden fourth input (time) at a small, constant step produces a smoothly evolving field rather than a new independent random pattern every frame. Sampling 3D noise at (x, y, z + t·speed) is a common trick to get animated 3D noise cheaply — it is really 4D noise's cross-section moving through a 3D slice, without paying the cost of a full 4D implementation.
Multiple octaves for organic detail
A single noise call produces smooth, rounded blobs at one characteristic size. Layering several octaves — the same noise function sampled at doubling frequency and halving amplitude, summed together (a technique called fractal Brownian motion, fBm) — adds fine wrinkles on top of the broad bulges, the same way real organic surfaces (clouds, terrain, coral) show detail at multiple scales simultaneously:
n = 0
amp = 1; freq = 1
for octave in 0..3:
n += amp * noise3D(p * freq + t)
freq *= 2
amp *= 0.5 // each octave contributes half the previous amplitude
Recomputing normals after displacement
Once vertices move, the original per-vertex normals are no longer correct for lighting — a bulging patch of surface should shade differently than a flat one. A vertex shader can either recompute the normal analytically from the noise function's gradient (fast, exact, but requires differentiating the noise function), or a fragment shader can reconstruct it numerically from nearby displaced points via a finite-difference cross product. The fresnel-lit, glossy look on this simulation depends entirely on getting that updated normal right — get it wrong and the bulges look flat no matter how much geometry actually moved.
Frequently asked questions
Why does the sphere ripple smoothly instead of jittering randomly every frame?
The displacement comes from simplex noise sampled continuously in both space and time — the function is built to have no sudden jumps, so nearby vertices and nearby time steps produce nearly identical values, which reads as a smooth, organic flow rather than static.
What's the actual difference between simplex noise and the original Perlin noise?
Classic Perlin noise interpolates gradients on a square/cube grid, which costs 2ⁿ corner evaluations per sample and shows faint axis-aligned artifacts. Simplex noise uses a triangular/tetrahedral lattice instead, needing only n+1 corners per sample and producing a more visually isotropic result — cheaper and cleaner, especially in 3D and higher.
Why is the displacement applied along the normal instead of just a random direction?
Pushing each vertex along its own surface normal keeps the bulge anchored to the sphere's shape — it grows straight out of the surface rather than shearing sideways, which is what makes the result read as a breathing, morphing solid rather than a wobbly, deforming mesh.
Try it live
Everything above runs in your browser — open Morphing Sphere and change the parameters while it is running. Nothing is installed, nothing is uploaded, the whole model lives in one tab.
▶ Open Morphing Sphere simulation