Selection
Environment
Scene
History
A capture arrives wrapped in the sky and ground the cameras saw, with your scan inside the bubble. Find shell measures where that bubble begins and selects it, so you can see what would go before it goes - drag Radius and the selection follows, then Delete selection. Delete environment does the whole thing in one undoable step. On a PLY it works from the file rather than from what is drawn, so it holds at any Density.
A solver does not always agree with the world about which way round it was: a scan can arrive flipped, and no amount of Yaw will unflip it. Mirror H and Mirror V reflect the whole scene — every splat's position and the orientation of the gaussian itself, so the ellipsoids lie the way the geometry does. It is the Mirror control in the PLY section, put where you are when you notice; either one moves both, and it keyframes and saves like any other. Your deletions follow the geometry through a flip; splats you had moved by hand keep the offset you gave them, as they do under Yaw.
Drag to select, shift adds, alt subtracts. Right-drag orbits and middle-drag pans while you are editing; scroll and WASD work as ever. Drag the handle at the centre of a selection to move it - an arrow for one axis, the white square for the camera plane.
Edits ride on top of the generator, so Count, Build, grading and the whole timeline keep working and .ply / .splat exports carry them. Changing a control that resamples the cloud - the text, the source file, Placement, Seed - clears them, because splat 4,001 is no longer the splat you deleted. On a PLY scene edits are recorded against the splat's place in the file instead, so Density, Reveal and Seed all leave them alone: thin a scan to 10% and what you deleted stays deleted.
Alpha suits cut-out icons, Dark suits line art on white, Even fills the whole frame — the one you want for photos, paired with From image colours.
Surface scatters over the skin, Volume fills the inside (needs a closed mesh), Edges traces the wireframe. Set Rotation to Surface in Splats to lie the splats flat on the geometry. From model uses the colours the file carries: an OBJ's vertex colours or the .mtl beside it, a glTF's materials and textures. Files a model keeps beside it — a .gltf's .bin, an .mtl, their textures — can be dropped with it, or as the whole folder; an .mtl can also be added afterwards.
The file is played back, not rebuilt: every splat keeps its own size, rotation and colour. Density is the percentage of the capture that plays at all — 100% is every splat in the file, 10% keeps every tenth one, spread evenly through the scene rather than lopped off one side, so a heavy scan stays workable. Splats you have deleted or moved by hand stay that way at every density. Count then reveals within whatever Density leaves, and follows it as you drag unless you have pulled Count back by hand. Animate Count with Reveal shuffled to dissolve the scene in, and keyframe the camera to fly it. Y-down matches most captures — flip it if the scene lands upside down.
Background is preview-only — PLY and .splat files store no background.
Tone
Color
Color mixer
Density
Each range steers one slice of the hue wheel. A color between two ranges takes a blend of both, so nothing bands. Grays are left alone — there is no hue to steer — and the effect eases in as a color gains saturation. A dot on a swatch means that range is carrying an edit.
The eye in this header switches the whole grade off without disturbing a setting, so you can see the picture you are grading against — the same is true of Depth and Build. It is a preview, not a setting: it is never saved, and while it is off the renders and exports are ungraded too. Anywhere in the panel, a label in orange means that control is no longer at its default; hover it for the ↺ that puts it back.
The four Tone sliders are the corners of one curve: Blacks and Whites move the ends, Shadows and Highlights bend the quarter and three-quarter tones. Each one shifts a splat by how bright it is rather than channel by channel, so a colour keeps its hue on the way.
Clarity works on the frame rather than on the splats: right of centre it adds back the difference between the picture and a blurred copy of it, which reads as bite and definition; left of centre it fades into that copy instead, for haze and soft focus. Its radius is a share of the frame, so it lands the same way in the viewport and in a 4K render.
Grading runs on the GPU, so it stays live at any splat count, and it is baked into PLY and .splat exports — everything above except Clarity, Edge and Depth fade, which are viewport, PNG, MP4 and GIF only. Edge reshapes the splat kernel that every viewer fixes at gaussian; depth fade depends on where the camera stands; clarity needs neighbouring pixels, which a splat in a file does not have. Every slider here is keyframeable.
Burst is Swarm aimed rather than random: every splat starts Travel out along its own bearing from the burst point, and Progress pulls the scene in from there. Move the point and you change every direction at once — it is the ✳ in the viewport, dragged by its middle or along one of its arrows. The build arrow drags the same way: its middle moves the origin, its head aims the sequence.
Origin is where the sequence is measured from — the middle of the arrow, the centre of the Outward sphere, the hub of the Sweep. It starts on the middle of the box the build is measured across, which is not always where the splats you are looking at actually are; drag it in the viewport, or press Center on splats. Splats outside the span still arrive: they are simply first or last.
Keyframe Progress 0 → 1 to assemble the object — the Build in button on the timeline lays that ramp down for you. Feather is how wide the wavefront is, Jitter breaks it up so splats arrive raggedly, and Steps lands them in that many discrete waves instead of a continuous sweep. The arrow in the viewport shows the direction and where the front has reached. Preview and PNG/MP4/GIF renders honour the build; .ply and .splat always export the finished cloud.
Lens is the vertical field of view of the frame, not the window, so the framing holds however you resize. Aperture blurs whatever sits off the focus plane — it is a real depth of field, so it lands in PNG and MP4 renders. Lens, Aperture and Focus are all keyframeable; the Frame button top-right toggles the guides, and Path shows the camera's route through its keyframes.
Technical draws one flat dot at the centre of every splat — no gaussian falloff, no per-splat size, rotation or colour. Size is in screen pixels, so dots hold their weight however far you fly. Build, Count and the camera still drive it, and the whole stack is keyframeable. Exports: PNG, MP4 and GIF record what you see; .ply and .splat always carry the real splats.
Lays a page design over the frame, so the splats are judged where they will actually live. Use a PNG or SVG with a transparent background — the scene shows through it, and the mouse goes straight through to the splats, so orbit, frame and edit as usual.
The page always fills the frame's width and is pinned to the top, like a browser; anything taller is clipped at the bottom. Shift-scroll over the viewport moves down it, and Scroll is keyframeable, so a video can scroll the page. A nav bar is a second image that never scrolls: fitted to the width and fixed to the top of the frame, over the page, like a sticky header. Aspect is the Camera frame — the same setting, shown here too. Screen shrinks the frame inside the viewport, in percent, to leave room around it; it changes only the view, never a render's size or framing.
While the mockup is on, PNG, JPEG, MP4 and GIF renders include the page and nav bar; the eye switches it off for comparison, and for the exports with it. .ply and .splat never carry it. Both are saved inside the project.
Y-down matches the 3DGS/COLMAP convention used by SuperSplat, Polycam and most viewers. Flip to Y-up if your type lands upside down. 1 world unit = 1 em × scale.
Stills and video live in the Render button on the timeline — PNG or JPEG, MP4 or GIF, with resolution, aspect and a transparent backdrop set there.
All of those export the result. To keep the work — every control here, the timeline, the camera, your splat edits, the font and the source file itself — use Save at the top of this panel. It writes one .splatproj that opens back exactly where you left off. ⌘S saves, ⌘O opens, and a project dropped anywhere on the window opens too.
Copy look is the handoff to the client page, affine/. It puts this scene's look on the clipboard as script — the PLY scene's splat size, opacity and colours, and everything in Color, Grade and View — to paste over the marked LOOK block at the top of affine/assets/scripts/affine.js. The page then opens with that look baked in. What the frame shows is what is copied, keyframes included; a section switched off by its eye is copied as set.
Pick what the splats are built from.