SPOLIA — Growing Supports

this is the page as it was on 2026-08-10 18:08 — all versions

SPOLIA

A sculpture has to hold itself up twice. Once as an object, standing in a room — and once, briefly and awkwardly, while it is being printed, when it is not yet an object at all but a few hundred half-finished layers of warm plastic. Most software treats the second as a separate, disposable problem: scaffolding, generated in a slicer, snapped off and binned.

This page is about not doing that. Supports in SPOLIA are grown as part of the piece — in the same signed-distance field, smooth-unioned into the same surface, carrying their own block material — so that a strut can be a decision rather than a nuisance. Roman workshops carved struts and tree trunks into marble for exactly the same structural reason, and then made them mean something. So can we.

Live at https://auriea.art/spolia/, in the menu.

Contents

  1. The rule
  2. What slicers actually do — and the mistake I made first
  3. Growing downward
  4. A support must not need a support
  5. Standing off
  6. The Roman argument
  7. The trunk and the vine
  8. Using it
  9. What it does not do yet

The rule

A printer can lay a new layer slightly wider than the one beneath it, but not much. The usual working figure is 45° from vertical: past that lean, a downward-facing surface has too little underneath it and droops. Spolia measures this exactly the way a slicer does, on the surface normal — -n.y against cos 45° = 0.7071 — and tints the lit render toward red as a face passes it.

A tall vessel in Spolia with the overhang heatmap on and no supports: red bands mark the rim lip and the underside of the base ring, the surfaces that lean past 45 degrees from vertical.

A vessel stood upright, heatmap on, no supports yet. Two red bands: the flared lip of the rim, and the underside of the base ring. Everything else on this form is vertical or better, and needs nothing.

Two details worth knowing. The tint is applied to the lit colour, not the albedo — overhangs are by definition the faces turned away from a key light coming from above, so tinting the base colour before shading buried the warning in its own shadow, which is where the first version of this went wrong. And the toggle is view-only: it is not saved into a .spolia file and never reaches an export.

What slicers actually do — and the mistake I made first

The first working version grew a branch upward from a root you tapped on the ground, reaching toward the flagged overhangs. It made a convincing single strut and left most of the piece untouched, and it took a while to see why that was not a tuning problem but a structural one: coverage was contingent on reach. A ring of overhang around a base can never be reached from one point inside it, however good the search — the far side of the ring is always too far sideways for the height available. Clustering the targets and retrying in rounds only papered over it.

PrusaSlicer and Cura both go the other way, and PrusaSlicer's source says so in one line. In src/libslic3r/Support/OrganicSupport.cpp:

using Forest = std::vector<Tree>;

A forest, never one tree. Overhang tips are laid across the entire flagged region at a set spacing — support_tree_branch_distance, generated as a zig-zag infill over the overhang area — and each tip begins its own branch at the surface it has to hold. Branches then descend, and merge with each other on the way down. (PrusaSlicer's organic supports, added in 2.6, are Thomas Rahm's rework of Cura's tree supports.)

Turn it around and the coverage problem evaporates, because it was never really a search problem: you cannot miss an overhang you started from.

Growing downward

So: find the overhangs, thin them to evenly spaced tips, and let every tip fall.

The same vessel after growing supports: branching oak-coloured struts descend from the rim and from the base ring, merging into a few thicker legs that meet the build plate.

The same vessel, grown. On this piece: 122 flagged surface crossings → 22 tips → 94 capsules, of which 7 reach the build plate. About 20 ms to compute.

Each tip descends in small steps. Three things shape the step:

When two branches come within a merge radius they become one node carrying both tip counts, and thickness follows the pipe model: a branch's radius is leafR × tips^(1/2.5), so merging two equal branches gives r × 2^(1/2.5) and the trunk thickens toward the plate the way growth rings do, with no manual taper anywhere.

Close view under the base ring showing branches merging into thicker trunks as they descend, each junction sitting below the branches entering it.

Underneath the base ring: thin twigs at the contact points, merging downward into fewer, fatter legs. Every junction sits below the branches entering it — which turns out to matter more than it sounds.

A branch stops when it reaches the plate, or when the piece itself blocks its descent — in which case it lands there. A support springing from the sculpture's own lower body is not a failure case; it is a puntello.

A support must not need a support

The obvious trap, and the one Auriea named before I hit it: scaffolding that is itself unprintable.

The guarantee is enforced at the step, not checked at the end. Every descent direction is clamped into a cone of 35° from vertical before it is taken. A cylinder leaning θ from vertical presents a steepest underside normal of sin θ, so 35° gives 0.574 — comfortably inside the 0.707 that flags the model, with margin to spare. And because the cone is convex, a run of steps collapsed into a single capsule is still inside it: the vertical components add exactly while the horizontal ones can only partly cancel, so a merged capsule can never lean further than its own steepest step. That is a proof rather than a hope, which matters, because three separate bugs each broke it in a way that looked fine on screen:

what went wrong why it broke the rule
Merging to a centroid at the mean height of the branches A sideways hop with no drop is a horizontal bar — 11 of 29 capsules failed the cone. Junctions now sit below everyone entering them, by horizontal / tan 35°.
Landing by snapping the last point to y = 0 Kept the step's sideways travel while throwing away the vertical it had earned, tipping the final capsule flatter than the step that made it. Now it interpolates to the true crossing.
A junction computed below the plate The merged node then emitted an upward capsule back to y = 0 — precisely the horizontal bar the cone exists to forbid. Junctions below the plate are refused; those branches were about to touch down anyway.

Every grown forest is re-checked capsule by capsule afterwards, and the count of violations is reported. It should always read zero — and if it ever doesn't, the clamp is wrong, not that particular tree.

The grown supports with the overhang heatmap turned back on: almost no red remains, and the branches themselves show none, meaning the supports do not need supports of their own.

The grown supports with the heatmap switched back on. The branches carry no red at all. What remains is a thin line along the rim and base lips, between the contact points — the same residue a slicer leaves, since it also supports a continuous lip at intervals and bridges the gaps. It is not zero, and it is honest to say so.

Standing off

The first version that covered properly still looked wrong: branches from the rim hugged the neck all the way down and read as wax runs, not struts.

Slicers keep a clearance from the model (xy_min_distance) so branches remain their own object. Spolia now does the same, pushing away along the horizontal gradient of the field only, so the push is sideways off the wall and never argues with the descent. It also walks each new branch clear of its own contact point, since a tip starts life exactly on the surface. The difference is entirely visual and entirely worth it: the struts arch away and read as structure.

The Roman argument

Anna Anguissola's Supports in Roman Marble Sculpture: Workshop Practice and Modes of Viewing (Cambridge, 2018) is a whole book against the idea that a strut is merely technical. Her point is that scholarship has dismissed these elements — especially plain non-figural struts — as "mere safeguards for production and transport", and that close attention to them instead reveals what buyers and carvers actually wanted.

The catalogue of solutions is remarkably close to what a support generator produces: tree trunks and stumps beside a leg; plain rectilinear struts bridging a limb back to the body; pillars, herms and vertical slabs behind a figure; and drapery engineered into a falling mass that happens to carry load.

The Aristodikos kouros, ca. 510–500 BC, Athens NAM 3938. The hands are lost; the two struts that braced them to the thighs survive as blunt stubs.
The Aristodikos kouros, ca. 510–500 BC, Athens NAM 3938. The hands are lost; the two struts that braced them to the thighs survive as blunt stubs.

The plainest form, and the oldest. The Aristodikos kouros (ca. 510–500 BC, Athens NAM 3938) had two short struts bracing its free-carved hands back to the thighs. The hands are long gone; the struts are still there, two blunt stubs at hip height. Purely structural, no pretence otherwise — a puntello in its raw state, and unmistakably the same object as a slicer's support.

The Diadoumenos from Delos, ca. 100 BC, Athens NAM 1826. The trunk carries a mantle and a quiver — iconography, not statics.
The Diadoumenos from Delos, ca. 100 BC, Athens NAM 1826. The trunk carries a mantle and a quiver — iconography, not statics.

The Diadoumenos from Delos (ca. 100 BC, Athens NAM 1826). The knotty 80 cm tree trunk at his left leg is almost detached from the figure and of little consequence to its stability. It carries his mantle and a hanging quiver — which is what names him an archer, possibly Apollo, on Apollo's own island. The support is doing iconography, not statics. Anguissola notes that the statue was entirely gilded, support included.

Silenus and the infant Dionysus, Vatican 2292. A vine-wrapped trunk, and at shin height a plain squared strut tying the leg back to it.
Silenus and the infant Dionysus, Vatican 2292. A vine-wrapped trunk, and at shin height a plain squared strut tying the leg back to it.

Silenus cradling the infant Dionysus (Vatican 2292), one of three full-size copies. Two support types in one object: the vine-wrapped trunk that takes the weight of the leaning body, and — at shin height — a plain squared strut tying his lower leg back to it, exactly the kind of bar a modern eye reads as scaffolding someone forgot to remove.

The comparison is the sharp part. The Louvre's version of the same group leaves those extra struts out, which made the carving harder, needed a broader block, and produced a figure whose weight reads across a diagonal rather than sitting in a flat rectangular frame. Same subject, same prototype, different answer to how much support to admit to — and the answer changes the sculpture.

And in the Townley Dionysus at the British Museum, the support is the subject: Ampelus, the boy the god loved, caught mid-metamorphosis into the vine that props up the composition. The strut became the story.

That is the whole design brief for this feature, written down two thousand years early: the support is a compositional choice with a structural floor, not an afterthought.

The same support forest assigned the bronze material instead of oak, so the struts read as cast metal against a marble body.

Which is why a grown forest carries its own block material, chosen independently of the body. Here the same struts are cast bronze against a marble vessel — a metal armature holding stone, the way a museum mount does. Oak, walnut and ebony read as the tree trunk that Roman copyists actually carved; plaster reads as a restorer's fill; and a support in the same marble as the body reads as what it would have been in a Roman workshop — carved from the same block, left in place.

The trunk and the vine

A smooth capsule forest is honest scaffolding, but honesty was never the whole brief. The Roman trunks were carved AS trunks — bark, scars, roots — and the Townley support is a living stem. So a grown forest now has three styles, switched after the fact like a material, because they are one: the same capsules, wearing different carving.

Trunk style in oak. The same forest as every figure above — the carving is display-time, so switching styles costs nothing and changes everything.
Trunk style in oak. The same forest as every figure above — the carving is display-time, so switching styles costs nothing and changes everything.

Trunk carves ridged bark into every strut, streaked hard along the vertical, with the horizontal fissure cell sized to a limb's girth rather than the trunk's — so even a thin leg carries two or three fissures around its circumference instead of one slow lump along its length. At the plate, each foot flares on a short exponential, the way a bole grips the ground; that flare is one line of shader, no geometry at all. And on the thick limbs: lopped-branch stubs, the scar every Roman marble trunk carries, from the Delos Diadoumenos' knotty stump on down. A tree that was cut to serve, not grown convenient.

Bark fissures wrapping the legs' girth, and a cut branch with its collar. The stubs blend at a smaller radius than the forest, or the fillet swallows them whole.
Bark fissures wrapping the legs' girth, and a cut branch with its collar. The stubs blend at a smaller radius than the forest, or the fillet swallows them whole.

The stubs taught their own lesson: folded into the field at the forest's own blend radius they vanished — a small thing wearing a big fillet is just a bump. They now blend at a fraction of it, still collared the way a carver leaves the scar, but legible as a cut branch. They are placed deterministically (golden-angle azimuths keyed to the segment index), angled 28° from vertical and stored descending, so they pass the same cone check as every grown capsule and the printability guarantee survives the decoration untouched.

Vine style in verde antico: three strands in a slow spiral down the neck struts, swelling gently at the internodes.
Vine style in verde antico: three strands in a slow spiral down the neck struts, swelling gently at the internodes.

Vine twists each strut into three strands with the grooves between them narrowed, so the strands read convex the way a laid rope does, and swells gently at the internodes — the strut as living stem, after Ampelus. The geometry lesson here is the good kind of cheap: the printable cone guarantees every branch is within 35° of vertical, which means a fixed world-axis reference frame never degenerates, neighbouring capsules agree about where zero degrees is, and driving the twist phase from world height makes the spiral run unbroken through every joint and merge. The constraint that makes the supports printable is the same one that makes them decorable. The twist pitch is chosen so each strand's own helix stays steeper than 45° — the carving obeys the rule the strut does.

Cycling the style also dresses the part, as a courtesy: trunk arrives in oak, vine in verde antico — until you pick a material yourself, after which the styles stop suggesting. The Delos trunk was gilded; nothing here is mandatory.

The carving depth everywhere is a fraction of the thinnest twig's radius — small against the 10° margin between the branch cone and the overhang rule — and it rides in the shared field, so STL and GLB exports carry the bark and the twist exactly as rendered.

Using it

In the menu:

The constants, for reference:

overhang threshold 45° from vertical
branch lean limit 35° from vertical
tip spacing 0.06 × the piece's longest axis, up to 22 tips
descent step 0.035 × longest axis
stand-off from the surface 0.9 × step
merge radius 1.4 × step
thickness exponent 2.5 (pipe model)
capsule budget 96, shared across the whole forest

What it does not do yet


Photographs of the ancient sculptures are from Wikimedia Commons, not from Anguissola's book, whose plates are separately licensed: Aristodikos kouros by Gary Todd (CC0); Diadoumenos by Francesco Bini (CC BY-SA 4.0); Silenus by sailko (CC BY-SA 3.0). The Spolia renders were made offline from the same baked fragment atlas and the same grown capsule list the app uses, so they are the real field rather than a redrawing of it.

#ai