Gaussian Splatting produces photorealistic, navigable 3D scenes from a video walkthrough or a set of photos. Three tools have made the workflow accessible without writing a line of code: Postshot (Windows desktop), Polycam (mobile + web), and Luma AI (mobile + web). This is the practical guide — what to capture, which tool to use, what comes out, and what it costs.
For the underlying theory, see Gaussian Splats: The Next-Gen 3D Reconstruction. This post assumes you know what a splat is and want to make one.
What you need to capture
The capture step is more forgiving than photogrammetry — no GCPs, no flight plan, no overlap percentage to hit. But the rules below decide whether your splat looks photorealistic or like soup.
Video or photos
Either works. Video is faster to capture and gives the optimiser more data; photos give you sharper input frames. In practice:
- Video: 4K at 30 or 60 fps, ~1-3 minutes for a typical scene. Walk slowly, keep the camera steady, cover the object from many angles and heights.
- Photos: 100-400 photos for a typical object or room. Move around the subject in a spiral, taking shots every 15-30 degrees, at several heights.
A phone with a recent main camera (iPhone 13 Pro or newer, Pixel 7+, Samsung S22+) is enough. Wide-angle lenses are fine but avoid the ultra-wide — heavy distortion confuses Structure from Motion.
Coverage
You need to see every surface from at least two angles, ideally three or more. The optimiser builds Gaussians where it has enough information; gaps in coverage show up as smeared blobs or holes.
For an object, orbit it at low, mid, and high heights. For a room, walk every wall, look up at the ceiling, look down at the floor.
Lighting
Even lighting is your friend. Overcast outdoor light is ideal. Indoor scenes need diffuse light — strong directional lighting bakes harsh shadows into the Gaussians. Avoid scenes that change while you capture (clouds moving, lights flickering, people walking through).
What kills a capture
| Problem | Why it hurts | Fix |
|---|---|---|
| Motion blur | SfM can’t find features in blurry frames | Slower walk, higher shutter speed, image stabilisation on |
| Reflective surfaces | Gaussians overfit to reflections, producing floaters | Capture more angles around the reflective surface |
| Transparent surfaces | Glass doesn’t have features to triangulate | Treat as missing — splat will be hollow there |
| Repeating patterns | SfM mis-matches features (brick walls, tiled floors) | Capture wider context, vary heights |
| Featureless surfaces | Blank white walls, snow, water | Add temporary markers or accept holes |
| Scene movement | Trees in wind, people, vehicles | Capture early morning or use shorter capture windows |
Want to try it now? Open a Gaussian splat in the browser — free, no signup, your file stays on your computer.
The three tools, compared
| Postshot | Polycam | Luma AI | |
|---|---|---|---|
| Platform | Windows desktop | iOS, Android, web | iOS, Android, web |
| Processing | Local GPU | Cloud | Cloud |
| GPU required | RTX 3060+ recommended | None (cloud) | None (cloud) |
| Free tier | Free beta (no cost yet) | 10 free captures, watermark | Unlimited free captures |
| Paid tier | Expected $20-30/mo at launch | $20/mo (Polycam Plus) | $9.99/mo (Luma+) |
| Typical processing time | 30-90 min (RTX 4090) | 15-45 min | 15-30 min |
| Max input frames | Unlimited (local) | 250 photos / 2 min video | ~5 min video |
| Output formats | .ply, .splat, .ksplat, video | .ply, .splat, GLB, video | .ply, GLB, USDZ, video |
| Editing tools | Crop, trim, clean up floaters | Limited | Limited |
| Best for | Quality-focused users with a GPU | Mobile capture + AEC workflows | Easiest path, fastest results |
Postshot
Postshot is a Windows desktop application from Jawset (the same people behind Jawset Synthesis). It runs the entire pipeline locally — Structure from Motion, training, export. Because everything is on your machine, there are no upload limits, no per-capture fees, and you control every parameter.
You need a CUDA-capable GPU. An RTX 3060 will work for small scenes; an RTX 4070 or better is realistic for production. Training a 1-million-Gaussian scene on an RTX 4090 takes around 30 minutes. The same scene on an RTX 3060 might take 2-3 hours.
The output quality is the highest of the three because you can train for longer, tune the parameters, and clean up floaters before export. Postshot exports .ply, .splat, and .ksplat — covering every browser viewer in current use.
Polycam
Polycam started as a photogrammetry app and added Gaussian Splatting in 2024. The capture experience is excellent — the app guides you through coverage, warns when you’re moving too fast, and uploads automatically. Processing happens in their cloud, so a phone with a basic GPU is fine.
The catch is the free tier. Free captures get a watermark and limited export. The Plus tier ($20/mo) removes both and adds higher quality processing. For occasional captures, the free tier is fine; for client work, you’ll pay.
Polycam also keeps your capture history online, which doubles as a backup. It’s a good fit for AEC users who already use Polycam for room scans and want to add splats to the same library.
Luma AI
Luma is the easiest of the three. Open the app, point the phone, walk around. The capture coaching is the most polished I’ve used — it shows you which angles you’ve covered and which you haven’t, in real time. Processing is cloud-based and free, with unlimited captures on the free tier.
The trade-off is control. You can’t tune training parameters, you can’t easily clean up the output, and the export options are narrower than Postshot’s. But for “I need a splat of this thing today,” Luma is the fastest route.
Luma also supports text-to-3D and image-to-3D generation alongside its splat workflow — separate features, but worth knowing they’re in the same app.
Step-by-step: Postshot
- Capture footage: 1-3 minute video walkthrough or 100-400 photos. Save to your machine.
- Open Postshot, click New Project, drag your video or photos in.
- Run SfM: Postshot uses an internal SfM implementation. Hit Process — this takes 5-15 minutes for a typical capture.
- Inspect cameras: Confirm the SfM solution looks correct (camera positions form a smooth path around the subject). Bad SfM means a bad splat.
- Train: Set the target Gaussian count (start with 1 million for a small object, 3-5 million for a room) and hit Start Training. Watch the live preview converge over 30-90 minutes.
- Clean up: Use the bounding box and floater removal tools to crop the scene and delete stray Gaussians.
- Export: Choose
.splatfor browser delivery,.ksplatfor the Three.js Gaussian Splatting renderer, or.plyfor maximum compatibility.
Step-by-step: Polycam
- Open Polycam, tap Capture, choose Gaussian Splat mode.
- Walk around the subject following the on-screen guidance. The app turns the coverage indicator green as you go.
- Tap Process when coverage is complete. Upload runs in the background; processing happens in Polycam’s cloud.
- Wait 15-45 minutes for the splat to finish. You’ll get a push notification.
- Open in the web viewer to inspect. Polycam’s web viewer is decent but not the best — export and view elsewhere for client delivery.
- Export: Tap the share menu, choose
.plyor.splat. GLB export wraps the splat in a glTF container — useful for some 3D engines, not for browser splat viewers.
Step-by-step: Luma AI
- Open Luma AI, tap Capture, select Free Form or Object mode (Object guides you to orbit a central subject; Free Form is for rooms or larger scenes).
- Follow the coverage UI — Luma’s is the most explicit, showing you a sphere of camera positions to fill.
- Tap Process when ready. Upload happens automatically.
- Wait 15-30 minutes. Luma typically processes faster than Polycam.
- View in the Luma web app to QA the result.
- Export:
.plyfor splat delivery; GLB or USDZ if you need a mesh fallback (Luma also generates a mesh approximation alongside the splat).
Output file formats
The three formats you’ll see in practice:
| Format | Compression | Typical size (1M Gaussians) | Viewer support |
|---|---|---|---|
.ply | None (binary) | 200-300 MB | Universal — every splat viewer |
.splat | Light packing | 150-250 MB | SuperSplat, Spark, mkkellogg, most browser viewers |
.ksplat | Optimised for streaming | 80-150 MB | Three.js Gaussian Splatting (mkkellogg) |
.spz | Niantic compressed | 30-60 MB | Spark, growing support |
For a future-friendly delivery format, .spz from Niantic is the most compact — typically 2-5x smaller than .splat for the same scene. Postshot and the open-source splat-transform tool can convert .ply or .splat to .spz. Expect deeper coverage in a follow-up post on compressed splat formats.
For now: deliver .splat if you want the broadest viewer compatibility, .ksplat if you know the client viewer is mkkellogg, and .spz if file size matters more than universal support.
Common pitfalls
Motion blur in video frames. Cell-phone video at low light shutter speeds produces blurry frames. SfM throws those frames out and the optimiser gets less data. Capture in good light or use a camera with proper image stabilisation.
Reflective surfaces eat your splat. A car bonnet, a polished floor, a window — these reflect the environment differently from each viewpoint, so the optimiser places Gaussians at the reflection rather than the surface. The result is floaters in front of the reflective object. Capture more angles around the reflective surface to give the optimiser enough information to separate reflection from geometry.
Scene scale is unitless. A Gaussian splat has no real-world units by default. The output is dimensionless. If you need to measure anything from the result, that’s the wrong tool — capture with photogrammetry instead. See Gaussian Splats vs Photogrammetry vs NeRF for the full comparison.
Bounded scenes work best. A single room, a single building, a single object. Splatting an entire city block produces a splat that’s too sparse to look good. Capture bounded scenes one at a time.
Don’t try to splat large outdoor sites. Drone-based splatting of a 10-hectare quarry will produce a low-quality splat with massive file sizes. Use photogrammetry or LiDAR for sites at that scale.
Delivering the splat
Once you have a .splat or .ply, the next problem is getting it to a client. Splat files are large (100-300 MB) and need a specialised browser viewer. A Dropbox link to a .splat doesn’t work — there’s nothing on the client’s machine that opens it.
The practical options:
- Host the file yourself and link to a public splat viewer (works, but you’re responsible for the page, the viewer, and the hosting).
- Use the splat viewer built into the capture tool (Polycam and Luma both have web viewers — fine for casual sharing, not branded).
- Use a delivery platform that renders splats in the browser with your brand.
Swyvl accepts .splat, .ply, and .spz uploads and renders them in a sandboxed browser viewer (SuperSplat or Spark, depending on the file). You organise the splat under a site and a capture session alongside the rest of the project — photos, video, point clouds, orthomosaics — and share a single branded link. The client opens the link and navigates the splat in their browser. No app, no download, no separate tool.
For more on splat delivery alongside other spatial data, see How to Share a 3D Model Online.
Gaussian Splatting has moved from research project to practical deliverable in under three years. The three tools above cover almost every realistic capture scenario. For quality and control, use Postshot. For mobile capture and AEC integration, use Polycam. For the fastest, lowest-friction path, use Luma. All three produce splats that a modern browser can render — the rest is just delivery.