Skip to content
Sample of Radiolarian Lattice

nervous_system_hansmeyer · RadiolarianLattice

Radiolarian Lattice

Nervous System's Radiolaria series translates Ernst Haeckel's 19th-century radiolarian drawings into 3D-printed sculpture. The mathematical heart is a spherical lattice: an icosahedron is recursively subdivided (each face into four triangles), and every new vertex is perturbed along its radial axis by a small random offset, producing a perforated shell whose topology stays regular but whose surface ruffles like a sea creature's silica skeleton. We collapse the 3D body to a 2D orthographic projection with a viewer rotation, then stroke the resulting edges as a wireframe. Color encodes depth — pixels nearer the camera pick up a warm glow accent, far edges fade toward the cool edge color — so the result reads as a translucent geodesic sphere even on a flat substrate.

Original: https://n-e-r-v-o-u-s.com/blog/?p=4601

▶ Try the live demo (JS port) ▶ Run reference.py via Pyodide 10 formulas have instant JS ports. The Pyodide path runs the actual Python in your browser — first load is ~6 MB, then instant.

Family
nervous_system_hansmeyer
Source
nervous system × hansmeyer
Evolution
geometry
Render
wireframe
Complexity
medium
Agents
642
Year
2013
Author
Nervous System (Jessica Rosenkrantz & Jesse Louis-Rosenberg)

Math essence

Start with the 12 unit-sphere vertices of a regular icosahedron and its 20 triangular faces. At each subdivision step, every face (a, b, c) is replaced by four triangles using its three edge midpoints (ab, bc, ca) projected back to the unit sphere, growing the vertex count from 12 → 42 → 162 → 642 for k=1,2,3 subdivisions. After subdivision each vertex is displaced along its outward normal: v' = v * (1 + sigma * N(0,1)) + offset_tangent, where the tangent component breaks spherical symmetry so the lattice warps irregularly. Faces are rotated about X and Y axes and orthographically projected to 2D. depth_mix = (z - z_min) / (z_max - z_min) controls per-edge color: foreground edges glow warm, background edges fade to the cool palette color.

Parameters

Name Type Default Range Description
dim int 600 200–1400 Square canvas side length
subdivisions int 3 1–5 Number of icosahedron subdivisions (each multiplies vertex count by ~4)
radial_displacement float 0.18 0–0.6 Per-vertex radial perturbation magnitude
displacement_decay float 0.72 0.2–1 Reserved per-subdivision scaling factor
projection_axis str z null–null Orthographic projection axis (x|y|z)
radius float 0.42 0.15–0.5 Sphere radius as fraction of dim
edge_color tuple 200,230,255 null–null Edge RGB
glow_color tuple 255,180,110 null–null Foreground accent RGB
bg_color tuple 8,10,18 null–null Background RGB
edge_thickness int 1 1–3 Edge stroke thickness
depth_fade float 0.55 0–1 Depth-mix modulation (0=flat color, 1=high contrast)
rotation_x float 0.35 -3.1416–3.1416 View rotation about X axis (radians)
rotation_y float 0.55 -3.1416–3.1416 View rotation about Y axis (radians)
seed int null 0–999999 RNG seed

Reference

First 60 lines of reference.py. Full source: library_external/nervous_system_hansmeyer/RadiolarianLattice/reference.py

from __future__ import annotations

from typing import ClassVar

import imageio.v2 as imageio
import numpy as np


def _icosahedron() -> tuple[np.ndarray, np.ndarray]:
    phi = (1.0 + 5.0 ** 0.5) / 2.0
    verts = np.array(
        [
            [-1.0, phi, 0.0],
            [1.0, phi, 0.0],
            [-1.0, -phi, 0.0],
            [1.0, -phi, 0.0],
            [0.0, -1.0, phi],
            [0.0, 1.0, phi],
            [0.0, -1.0, -phi],
            [0.0, 1.0, -phi],
            [phi, 0.0, -1.0],
            [phi, 0.0, 1.0],
            [-phi, 0.0, -1.0],
            [-phi, 0.0, 1.0],
        ],
        dtype=np.float64,
    )
    verts /= np.linalg.norm(verts, axis=1, keepdims=True)
    faces = np.array(
        [
            [0, 11, 5],
            [0, 5, 1],
            [0, 1, 7],
            [0, 7, 10],
            [0, 10, 11],
            [1, 5, 9],
            [5, 11, 4],
            [11, 10, 2],
            [10, 7, 6],
            [7, 1, 8],
            [3, 9, 4],
            [3, 4, 2],
            [3, 2, 6],
            [3, 6, 8],
            [3, 8, 9],
            [4, 9, 5],
            [2, 4, 11],
            [6, 2, 10],
            [8, 6, 7],
            [9, 8, 1],
        ],
        dtype=np.int64,
    )
    return verts, faces


class RadiolarianLattice:
    family: ClassVar[str] = "nervous_system_hansmeyer"
    sketch: ClassVar[str] = "RadiolarianLattice"

Try running it locally

The reference implementation is self-contained Python with numpy. Install the package and run:

python library_external/nervous_system_hansmeyer/RadiolarianLattice/reference.py

Need help? See Learn for the standard environment setup, or Playground for an in-browser sketchbook.

More from nervous system × hansmeyer

See all nervous_system_hansmeyer artworks →