Sarah Kushner

← back to portfolio

Floating Sculptures

PhD thesis · Eurographics 2021 · with Risa Ulinski, Karan Singh, David I.W. Levin, Alec Jacobson

computational fabrication · walkthrough exhibits · topology optimization · storytelling

space-themed objects floating in a room corner with hidden support structure
Space-themed objects hover in a room corner — rods and wires hold everything in place, hidden from both the doorway and the window.

The experience

Walk into a gallery, museum, or themed room and objects appear to float — a rocket, a whale skeleton, playing cards, dresses overhead. Without visible struts breaking the illusion, the scene feels magical. This is physical storytelling through space: the arrangement of levitating objects is the narrative.

Design challenge

Making objects truly float is easy with thick, obvious supports. Making them float invisibly is hard. Every rigid piece must balance force and torque under gravity, but thin wires only resist tension and thick rods compete for attention. Remove too much structure and the scene collapses; leave too much and the magic is gone.

The method

We model hidden support generation as topology optimization on a ground structure — a dense graph of candidate rods and wires between Poisson-disk sample points on each rigid object and a fixed support surface (wall, ceiling, or floor). A convex linear program selects a sparse subset of edges that holds every object in force and torque equilibrium while minimizing material volume and visibility from a user-specified distribution of viewpoints.

Rods resist tension, compression, and bending (wooden dowels, steel beams). Wires resist tension only (fishing line, cable). The optimizer assigns each candidate edge a non-negative cross-sectional area; most areas end up exactly zero, leaving only the supports you actually build.

input scene of bunny teapot and rocker arm with computed hidden support structure
Input scene (left) and optimized hidden supports (right): rods in orange, wires in black, rigid objects in green, support surface in blue.

Ground structure & pruning

We connect all pairs of sample points between different objects and the support surface, label each edge as a candidate rod or wire, then prune edges that self-penetrate, intersect scene geometry, or have exceptionally high visibility coefficients. Pruning often shrinks the graph by 10× before the linear program runs.

dense ground structure, pruned graph, and final sparse rod solution
Dense candidate ground structure (left), after pruning intersections (middle), and the extracted sparse hidden rods (right).

Visibility term

For each rod, we estimate expected visibility by Monte Carlo sampling over the viewpoint distribution. From each sample viewpoint $\mathbf{e}$, we cast rays along the rod and check whether the segment is occluded by scene geometry. The visible contribution is weighted by solid angle — the same physical rod appears smaller when viewed end-on or from farther away.

We approximate the rod as a line for visibility (rods are thin relative to the scene), accounting for foreshortening: a rod viewed at a glancing angle subtends less apparent area than one seen broadside. Precomputing a per-edge coefficient $g_{ij}$ makes squared visibility linear in cross-sectional area: $a_{ij} g_{ij}^2$. Wires are treated as invisible ($g_{ij}=0$) and skip this step.

diagram of visibility measurement along a rod from a viewpoint three rods at different angles showing foreshortened projected visible area
Left: visibility integrates unoccluded solid angle along each rod. Right: projected visible area depends on the angle between the viewpoint and the rod.
\[ v_{ij} \approx \sqrt{a_{ij}} \cdot g_{ij}, \qquad g_{ij} = \frac{1}{n_u\sqrt{2\pi}} \sum_{u=1}^{n_u} \cos^{-1}\!\left(\frac{(\mathbf{x}_i-\mathbf{e}_u)\cdot(\mathbf{x}_j-\mathbf{e}_u)}{\|\mathbf{x}_i-\mathbf{e}_u\|\|\mathbf{x}_j-\mathbf{e}_u\|}\right) \sum_{w=1}^{n_{ij}} r(\mathbf{e}_u,\mathbf{x}_w) \]

Here $r(\mathbf{e},\mathbf{x}) = 0$ if the segment from viewpoint $\mathbf{e}$ to point $\mathbf{x}$ hits the scene, and $1$ otherwise. The attachment mesh and visibility mesh can differ — supports attach on one surface while occlusions are measured on another (see the ghost build below).

Sparse $L_1$ optimization

Classic ground-structure methods minimize total rod volume, which is an $L_1$-style cost on cross-sectional areas (weighted by edge length). $L_1$ costs are sparsity-inducing: the optimum usually lands on a corner of the feasible polytope where most $a_{ij}$ are exactly zero — analogous to Lasso variable selection.

L1 diamond isolines versus L2 circular isolines showing sparse solution on an axis
$L_1$ isolines (diamond) push the solution to an axis where $a_1 = 0$; $L_2$ (circle) would keep both edges active.

We augment volume with a least-squares visibility penalty. Because $v_{ij}$ is linear in $\sqrt{a_{ij}}$, the squared-visibility cost $\lambda g_{ij}^2 a_{ij}$ stays linear in the unknown areas and fits inside the same linear program.

Linear program

Unknowns are rod/wire areas $\mathbf{a}$, axial forces $c_{ij}$, and shear forces $\mathbf{q}_{ij}$ coupled through yield-stress inequalities. Each rigid object must satisfy force balance $\sum \mathbf{f}_i = m_k \mathbf{g}$ and torque balance $\sum (\mathbf{x}_i - \bar{\mathbf{x}}_k) \times \mathbf{f}_i = \mathbf{0}$. We solve with Mosek; typical scenes take under a minute after visibility precomputation.

\[ \min_{\mathbf{a},\mathbf{c},\mathbf{q}} \sum_{ij \in \mathcal{G}} a_{ij}\left(\ell_{ij} + \lambda g_{ij}^2\right) \] \[ \text{s.t.} \quad \sum_{ij \,:\, j \in V_k} \left(c_{ij}\hat{\mathbf{t}}_{ij} + \mathbf{N}_{ij}\mathbf{q}_{ij}\right) = m_k \mathbf{g} \quad \forall\, k \] \[ \sum_{ij \,:\, j \in V_k} \left(c_{ij}\hat{\mathbf{t}}_{ij} + \mathbf{N}_{ij}\mathbf{q}_{ij}\right) \times (\mathbf{x}_j - \bar{\mathbf{x}}_k) = \mathbf{0} \quad \forall\, k \] \[ -\sigma_{ij}^c a_{ij} \le c_{ij} \le \sigma_{ij}^t a_{ij}, \qquad -\sigma_{ij}^s a_{ij} \le \mathbf{q}_{ij} \le \sigma_{ij}^s a_{ij}, \qquad a_{ij} \ge 0 \]

The weight $\lambda$ trades material volume against visibility (we used $\lambda = 10{,}000$ in the paper examples). A linearized shear model lets thin rods resist bending without breaking convexity.

Animated results

Traversing the viewpoint distribution shows supports staying tucked behind occlusions. The bunny-and-teapot scene demonstrates multi-object equilibrium; the sheep uses separate rod and wire graphs with different material limits.

Bunny, teapot, and rocker arm — camera path through the viewpoint distribution reveals hidden rods.
animated traversal showing hidden supports on a floating sheep
Sheep scene — supports remain occluded as the camera moves.
ground structure method optimization animation
Ground structure method — dense candidate edges prune down to a sparse hidden support network.

Physical builds

We validated the method by fabricating several scenes — 3D-printed attachment points, hand-assembled rods and wires, and real objects held in mid-air.

seagull supported in mid-air by fishing wire
A seagull held invisibly mid-air with fishing wire — a wire-only solution where visibility optimization can be skipped.
ghost model with hidden rod supports
A ghost assembled from rods and wires. The attachment model (green head) and visibility model (yellow tail) can differ — supports attach on one mesh and hide behind occlusions on another.
sheep floating with mixed rod and wire supports
A floating sheep using separate rod and wire graphs, so the optimizer can assign different materials and visibility weights to each.
giant balloon display with hidden supports outside a museum
A parade-balloon-style display: standard ground-structure methods leave supports visible (left); our visibility term hides them from the intended viewpoints (right).

Storytelling with floating objects

Levitating objects show up everywhere in physical stories — museum dioramas, theatre sets, promotional displays, and animation. Stop-motion and zoetropes are especially unforgiving: if a character is mid-air, the support rod is visible in every frame unless you hide it.

I used this method in my PhD zoetrope work — generating per-frame hidden supports so a backflipping character and a pancake both appear to float, then hiding those rods from the camera's viewpoint.

backflip zoetrope frame with hidden support rods
Backflip zoetrope frame with hidden support rods — the structure is stable at rest and while spinning.
pancake zoetrope scene with hidden supports
The pancake scene from the Audiotrope — girl and pancake held invisibly mid-air across animation frames.

Outcomes

Project page · Eurographics 2021 paper · ArXiv · Supplemental video · PhD thesis (Ch. 1)