Engineering case study · Computational geometry

Flower lampshades, grown to print

A deterministic geometry pipeline that grows elastic shells, validates topology and print constraints, and exports five shades against one frozen mechanical interface.

JavaScript Position-based dynamics Binary STL
Rendered Datura floor lamp with five large reflexed petals on black printed hardware. Top view of the five leaning petals of the Morning Glory shade. Rendered Lily shade with six separated petals and a narrow throat.
Renders from the same geometry that writes the STL files. The project has not been physically printed yet.

The engineering target is a family of non-radial shades that share one physical interface, print Z-up without supports, and rebuild identically from the same specification. A mesh that renders successfully is only an intermediate result.

Each shade starts as a triangulated elastic shell pinned at a Ø68 throat. Differential growth changes edge rest lengths; curl changes signed hinge rest angles; stretch, bend and collision constraints are projected until the sheet settles. Flower geometry emerges from the rest state rather than from forces that push vertices toward a target shape.

The preview and exporter call the same generator. Export is gated by topology, build-volume, overhang, interface and determinism checks, so an invalid simulation cannot quietly become a printable-looking STL.

5deterministic shell specifications
0support structures in the print plan
≤ 3%budget for area past the derived angle limit
2frozen printed thread interfaces

From renderer to printer

The browser renderer runs the same generator as the build pipeline. Select a specification, adjust its independent shape controls and inspect the measured envelope, wall, overhang and topology report. The shade download remains disabled until the generated mesh passes the export gate.

For a repeatable first print, the validated print pack contains the exact ten STL files produced by the current passing build: five shades, four lamp parts and a fit coupon, plus the manifest and slicer instructions. Start with the coupon, then test the collar and ring against the actual E27 holder before spending seven to fifteen hours on a shade.

Differential growth is the geometry primitive

The input is a seed mesh plus fields over material coordinates. A growth field scales edge rest lengths near the margin; bending stiffness sets the fold wavelength; signed rest curvature controls reflexed tips; collision constraints prevent self-penetration. The solver finds the deformed position field.

  1. 01
    Evaluate material fields

    Petal bands, anisotropy, patchiness, veins and twist are functions of each vertex’s seed coordinates, which survive subdivision.

  2. 02
    Project constraints

    Position-based dynamics resolves stretch, signed hinge bending and collision constraints against the grown rest state.

  3. 03
    Audit the mesh

    The final shell is analysed in print orientation: millimetres, Z up, flange at z=0. Only a passing mesh reaches binary STL serialization.

Five specifications, five constraint sets

Datura shade with five broad petals curling outward.
DaturaFive webbed petals. Outward rest curvature opens the trumpet into a star.
Camellia shade with six cupped petals overlapping around the centre.
CamelliaSix slit petals outgrow the available room and collide into a whorl.
Lily shade with six separated petals supported by visible midribs.
LilyDeep slits, stiff midribs and reflexed tips. Designed to hang as a pendant.
Morning Glory shade with five petals leaning in the same direction.
Morning GloryThe growth field twists through height, so the five petals lean into a pinwheel.
Poppy shade with four broad irregular petals and fine pleats.
PoppyA limp, patchily grown sheet creases between ten radial ribs.

An STL is a build artifact, not evidence of printability. The validation gate decides whether that artifact is allowed to exist.

Generator invariant

Frozen mechanical interfaces

The assembly contract is deliberately small. Five printed parts meet a bought E27 lampholder, LED bulb and certified cord set through two support-free trapezoidal threads: KNUCKLE-40 for the structural spine and PETAL-56 for the shade clamp.

The thin shell carries no thread. It terminates in a solid 1.6 mm flange that drops over the collar and is retained by a separate ring. Shade generation can change radically while the collar, stem and base remain compatible.

  1. Shadegrown translucent shell
  2. RingPETAL-56 clamp
  3. CollarE27 holder cup
  4. StemKNUCKLE-40 module
  5. Basehollow for ballast

Verification boundary

The software checks are real. The current catalogue builds deterministically, produces watertight meshes, fits the declared 250 × 250 × 250 mm volume, and stays within its measured steep-area budget.

Nothing has been physically printed yet. Dimensions that touch bought hardware—the E27 holder body, M10×1 nipple and cord—come from catalogue figures rather than a part measured in hand. The first physical job is a ten-millimetre thread coupon, followed by the collar and ring, before committing to a shade.

Ideas the project builds on