AI work · Experiment 02 · Computational design
Differential Growth in Architecture, Design, and Art
An interactive 3D experiment: how simple growth rules create complex folded surfaces.
Start with a ring-shaped surface. Hold its inner edge in place, add length around its outer rim, and let the vertices find new positions. Change one growth parameter and explore a family of folded forms.
Try the experiment
Choose Petal, Ruffle, Coral, or the 300% Extreme preset, then change growth intensity, localization, smoothing, or the seed. Growth runs from 0% to 300%; changes update automatically, and you can watch the surface relax. Use Grow again to replay the process. Orbit the mesh, compare its starting shape, and export OBJ geometry, parameter JSON, or a PNG of the current view.
The model runs in your browser. WebGL is required. Parameter files are processed locally.
| Preset | Growth | Seed |
|---|---|---|
| Petal | 0.65 (65%) | 42 |
| Ruffle | 1.15 (115%) | 42 |
| Coral | 1.65 (165%) | 42 |
| Extreme | 3.00 (300%) | 42 |
The preset names are visual suggestions. They do not represent simulations of those organisms.
How the surface grows
The model increases circumferential target lengths toward the outer edge of a triangulated annulus. The inner boundary stays pinned. Position-based relaxation adjusts vertices in three dimensions, while weaker cross-triangle springs discourage sharp hinges. The mesh stays at a fixed resolution: 1,824 vertices and 3,456 triangles in the default configuration.
const g = 1 + p.growth * ramp * e.weight;
e.target = e.length * Math.sqrt(
1 + (g * g - 1) * e.tangentFraction
); growth = 1.15 is displayed as 115% additional growth intensity. The slider reaches
300% (growth = 3). It does not mean that every edge becomes 1.15 times its original
length. The target also depends on the radial growth weight, the gradual growth ramp, and the
edge's alignment with the circumference. At the theoretical fully grown rim, a purely tangential
edge would target 2.15 times its original length; actual mesh edges sample different weights and
directions.
Higher localization concentrates growth near the rim. Smoothing changes the strength of the secondary constraints. The seed selects the small initial perturbation, so keeping it fixed helps you compare the effect of another parameter.
From natural growth to built form
Floraform by Nervous System explores differential growth in elastic surfaces and has produced sculptures and wearable objects. Its published implementation includes shell mechanics, collision handling, and adaptive subdivision. This example is a separate, smaller fixed-resolution spring-relaxation model inspired by edge-driven growth; it is not a recreation of Floraform or a physically validated shell simulator.
MARC FORNES / THEVERYMANY offers related built references. Minima | Maxima, in Astana, combines double curvature, pleated regions and a layered aluminium-strip assembly. Pleated Inflation, in Argelès-sur-Mer, uses a pleated aluminium shell to create a pavilion and informal amphitheatre.
These projects show how surface geometry can contribute to enclosure, light and structure. They are architectural references for the discussion; their documented construction and form-finding methods are different from this differential-growth experiment.
Download the example
The code bundle contains the solver, Three.js viewer, four generated OBJ meshes, parameter files, tests and verification receipts. The Skill bundle contains reusable instructions and a copy of the implementation for an agent.
View the verification record · Download the three-form comparison
Run the code
The geometry generator needs Node.js 20 or later and no third-party packages. Extract the
example ZIP, open its demo directory, and run:
node --test model.test.mjs
node generate.mjs ruffle.json ../my-ruffle The destination directory must be new. The generator saves surface.obj, the full parameters.json, and a receipt.json containing measurements and the exported
OBJ's SHA-256 hash.
For a shorter programmatic example, save this as experiment.mjs next to model.mjs, then run node experiment.mjs:
import { writeFile } from 'node:fs/promises';
import { solve, measure, toOBJ } from './model.mjs';
const surface = solve({
growth: 1.15, localization: 2.2,
smoothing: 0.025, seed: 42
});
console.log(measure(surface));
await writeFile('my-surface.obj', toOBJ(surface), { flag: 'wx' });
await writeFile('my-parameters.json',
JSON.stringify(surface.p, null, 2), { flag: 'wx' }); To run the bundled static viewer without installing packages, open demo/dist in a
terminal and run node serve.mjs. Visit the HTTP address it prints. Opening its HTML
with file:// will not support module workers.
Three.js mesh construction
This excerpt assumes the scene, camera, lighting and renderer are already configured. The complete viewer supplies them.
import * as THREE from 'three';
import { solve } from './model.mjs';
const surface = solve({ growth: 1.15, seed: 42 });
const geometry = new THREE.BufferGeometry();
geometry.setAttribute('position',
new THREE.Float32BufferAttribute(surface.positions, 3));
geometry.setIndex(Array.from(surface.faces));
geometry.computeVertexNormals();
const material = new THREE.MeshStandardMaterial({
color: '#b96a4d', roughness: 0.52,
metalness: 0.12, side: THREE.DoubleSide
});
scene.add(new THREE.Mesh(geometry, material));Let an agent use the existing algorithm
Once the generator worked, I packaged the method as a reusable Agent Skill. You can give an agent the existing solver and ask for variations, saved parameters and checked geometry.
Extract the Skill ZIP and give the complete folder to an agent with local file and Node.js
access. Ask it to read SKILL.md, then use a request such as:
Create three folded surface studies with growth values 0.65, 1.15, and 1.65. Keep seed 42 and all other parameters fixed. Save each OBJ with its parameters and verification receipt in a new directory. Inspect the results and explain what was checked. Each variation gives you an OBJ, its resolved parameter file and a receipt. Keep those together with the Skill folder to continue the work in another chat. Attaching the folder does not automatically install a skill in every host.
What was checked
Six automated model tests passed, including geometry checks at 300% growth for two seeds. A separate agent reviewed the previous version of the same numerical solver, generating two seed-73 variations and independently checked their saved coordinates, triangle indices and areas, connectivity, orientation, boundary loops, parameters and file hashes. In that review, a repeated output was byte-identical in the same runtime and the default browser OBJ matched the command-line export.
These results establish a reproducible geometry workflow in the tested environment. The surface is open, dimensionless and has no thickness. Self-intersections, material behaviour, structural performance and fabrication readiness have not been verified. Edge-fit error describes numerical constraint fit, not structural performance.
Start with one parameter. Compare the result. Then decide which qualities you want to develop.