Fast Splat Morphing

A fast near-optimal splat assignment for morphing between Gaussian splattings
, September 2026

Six renders of a bonsai in a shallow pot turning into a house plant in a round pot, from left to right.
A bonsai becomes a house plant, rendered at t = 0, 0.2, …, 1.
📄 Papersoon 📎 Supplementary GitHub ▶️ Live demo ✍️ Cite

Abstract

Morphing one 3D Gaussian splatting capture into another requires an assignment: which source splat becomes which target splat. Optimal transport is the principled way to choose it, but at capture scale exact, entropic and hierarchical solvers are all too slow for interactive use in our measurements. We introduce Fast Splat Morphing (FSM), a hierarchical optimal-transport refinement to the rank-2 case, replaces the per-node transport solve with a closed-form median split along a shared axis, and add appearance to the assignment choice through a weighted lightness coordinate. FSM assigns 1.2 million splats in single-threaded browser JavaScript, without precomputations or GPU solvers. We measure how close our result is compared to the optimal solution.

Method

A morph between two splat captures needs an assignment: every source splat is paired with exactly one target splat, and each pair then interpolates its position, covariance and color. FSM builds that assignment by co-bisection. Both clouds are cut at their median along one shared axis, the widest of their combined extents, and the four halves are paired straight or crossed, whichever makes the half centroids travel less. The recursion continues down to single splats in O(N log N) time. Appearance enters as a fourth coordinate, the CIELAB lightness at weight ω = 1/4, so a split can separate dark from bright before it separates space. The smaller capture is padded with transparent clones, so the assignment stays a bijection and both endpoints are exact.

Five panels of a ring-shaped source cloud above a cross-shaped target cloud: the first, second and third median cuts, the resulting assignment, and the exact optimum, whose energy FSM exceeds by 8.1 percent.
The co-bisection on two 2D point clouds, source above and target below. Both are cut at their own median along a shared axis, and the halves are wired straight or crossed by whichever pairing of half centroids travels less (a–c). The leaves determine the assignment (d). Its transport energy is 8.1 % above the exact optimum (e). Colour follows matching.
A torus of colored points split by one plane, then by two, then colored by its assignment; below, a sphere wearing the matched colors and shaded by travel under FSM and under the exact optimum.
The same recursion in 3D, a torus mapped to a sphere. Top: the first split, the second, and the assignment they converge to. Bottom: the sphere wearing each splat's matched color, then every splat's travel under FSM and under the exact optimum. FSM's transport energy is 13.6 % above the optimum's.

Results

1–2 s to assign a million splats in single-threaded browser JavaScript, on an Intel i9-14900KF
5–20 % above the exact optimum in transport energy
1–13 % extra mean travel over the exact optimum
20–50 % less recoloring from the lightness coordinate, for little extra travel

Live morphing in your browser

Pick an object for each side. The page computes the assignment between them on your device, with the paper's code, and shows the morph swinging from one to the other.

About the demo
  • The time shown covers what the paper times: packing both clouds with their lightness at ω = 1/4 and the co-bisection, in one thread of your browser. Preparing the clouds and bending each pair's path come on top, and the first pair also pays for the JavaScript engine warming up.
  • Every object is used at full density. The counts are the Gaussians left after floaters are removed, and the smaller side is padded with transparent clones.
  • The method assumes both objects share a frame, so the bonsai, the duck and the bee are turned about the up axis when they load, and the bee is also tilted toward the camera.
  • Drag to turn the view, double-click to reset it. It needs WebGL2.

BibTeX

@misc{padilla2026fsm,
  title        = {Fast Splat Morphing},
  author       = {Padilla, Marcel},
  year         = {2026},
  howpublished = {Preprint, ETH Z\"urich},
  url          = {https://marcelpadilla.com/Fast_Splat_Morphing/}
}

Data and licences

code is MIT; the splats keep their own terms

The code and this page are MIT; the splats are not. The house plant is the author's capture (CC BY 4.0). The bonsai and the duck were generated by the author with TripoSplat from CC0 photographs on Wikimedia Commons, by Wilfredor and by Oleg Yunakov, and are provided as-is, with no warranty of rights. The bee is a subsample of Japanese Bee by YUMA株式会社 and the cat in the thumbnail is Kitty by Andrej Kurcik, both CC BY 4.0 on SuperSplat. The plant, the bonsai and the duck are also in the author's splat collection. The viewer adapts antimatter15/splat (MIT); the notices carry the upstream licence text.

This project is part of a wrapping up at the end of my postdoc ETH Zürich.