Gaussian Splatting Tutorial: From Photos to Interactive 3D Scene
Updated Mar 2026
This tutorial walks through creating a Gaussian Splatting scene from scratch — from taking photos to viewing an interactive 3D reconstruction in your browser. We will use a real example throughout: a park bench captured with 83 photos from an iPhone 15, trained with Nerfstudio on an RTX 3060 in 25 minutes, producing a 1.1 million Gaussian scene that renders at 90 fps. The raw PLY output was 178 MB; after SPZ compression at polyvia3d.com, it was 14.6 MB with no visible quality loss. You do not need prior experience with 3D reconstruction. You do need: a camera (any smartphone works), a computer with an NVIDIA GPU for training (or a free-tier cloud service), and about 2 hours for your first run. If you just want to view or convert existing 3DGS files without training your own, see our beginner guide instead.
Tools used in this guide
Step-by-Step Guide
- 1
Step 1: Capture your scene (15-30 minutes)
The golden rule of 3DGS capture: every surface must be visible from at least 3 different viewpoints. Walk around your subject in overlapping orbits — imagine you are tiling the scene with photographs where each photo overlaps its neighbors by 60-70%. For a single object (statue, furniture): 50-80 photos in a single orbit at eye level, plus 10-20 from above. For a room: 150-300 photos walking along each wall, plus corners. For an outdoor scene: 200-500 photos. Use your phone's default camera app — no special settings needed, but avoid HDR mode (it creates ghosting artifacts) and panorama mode (SfM cannot handle stitched images). Keep ISO low (100-400) to minimize noise, and avoid motion blur by pausing briefly before each shot. Overcast days produce the most uniform lighting, which helps reconstruction quality.
- 2
Step 2: Run COLMAP for camera estimation (20-60 minutes)
COLMAP is the standard Structure-from-Motion tool that estimates where each camera was when each photo was taken and produces an initial sparse point cloud. Install COLMAP from github.com/colmap/colmap (available for Windows, Mac, Linux). Create a project directory, put your photos in an images/ subfolder, then run: `colmap automatic_reconstructor --workspace_path . --image_path images`. On our 83-photo bench scene, COLMAP ran for 18 minutes on a Ryzen 7 5800X. The output is a sparse/ directory containing cameras.bin, images.bin, and points3D.bin — these are the camera parameters and initial point cloud that the 3DGS training will use. Common COLMAP failure: if your photos have too little overlap or too many repeated textures (like a brick wall), COLMAP will fail to register all cameras. The fix is usually more photos with more viewpoint diversity.
- 3
Step 3: Train your Gaussian Splatting model (20-90 minutes)
We recommend Nerfstudio for beginners — it wraps the training loop with sensible defaults and good visualization. Install: `pip install nerfstudio`. Then: `ns-train splatfacto --data . --output-dir outputs/`. Training starts by initializing a Gaussian at each COLMAP point, then iteratively optimizes Gaussian parameters by comparing rendered images to ground-truth photos. You will see the loss decrease rapidly in the first 5,000 iterations, then plateau around 15,000-30,000. Our bench scene trained for 30,000 iterations in 25 minutes on an RTX 3060 (6 GB VRAM). If you have an RTX 4090, expect about 8 minutes. Training VRAM requirements: 6 GB for scenes under 500 photos, 8-12 GB for larger scenes. If you hit VRAM limits, reduce image resolution with --downscale-factor 2.
- 4
Step 4: Export as PLY
After training, export the Gaussian Splatting scene as a PLY file. In Nerfstudio: `ns-export gaussian-splat --load-config outputs/splatfacto/config.yml --output-dir exports/`. This produces a point_cloud.ply containing all Gaussian parameters. Our bench scene exported as a 178 MB PLY with 1,102,847 Gaussians. If you used the original 3DGS implementation (INRIA) instead of Nerfstudio, the output is at point_cloud/iteration_30000/point_cloud.ply. If you used gsplat, check the output directory configured in your training script. The PLY file is your master copy — archive it. All downstream conversions (SPZ, SPLAT, etc.) can be regenerated from the PLY, but the PLY cannot be regenerated without re-training.
- 5
Step 5: View in your browser
Drag your PLY file into polyvia3d.com/splat-viewer/ply. The viewer automatically detects that this is a Gaussian Splatting PLY (not a mesh PLY) by checking for properties like f_dc_0, opacity, rot_0, and scale_0 in the file header. Our 178 MB bench scene loaded in 6.2 seconds on an M1 MacBook Air and rendered at 55 fps. Controls: left-click drag to orbit, scroll to zoom, right-click drag to pan. If your scene appears upside down, some training frameworks export with Z-up while the viewer expects Y-up — this is purely cosmetic and does not affect the data. Check the viewer's axis settings or flip the scene in your training tool's export config.
- 6
Step 6: Compress to SPZ (the most important step)
Go to polyvia3d.com/splat-convert/ply-to-spz and upload your PLY. SPZ compression uses vector quantization on Gaussian parameters and arithmetic coding on the result, achieving typical 10-12x compression with negligible quality loss. Our 178 MB bench PLY compressed to 14.6 MB SPZ — 12.2x compression. Processing took 9 seconds in the browser. The SPZ file preserves spherical harmonics (view-dependent color), unlike SPLAT format which strips them. This means your scene retains the realistic lighting shifts as you orbit around it. For web delivery, SPZ is the only format that makes sense: a 15 MB file loads in 1-2 seconds on broadband, while a 178 MB PLY would take 30+ seconds. SPZ is also on the Khronos glTF standardization track, ensuring long-term viewer support.
- 7
Step 7: Share and embed
With your SPZ file, you have several options. For quick sharing: host the SPZ on any web server or CDN (Cloudflare R2, S3, even GitHub Pages) and share the polyvia3d.com/splat-viewer/spz URL with instructions to drag-and-drop the file. For embedding on your website: use gsplat.js (~180 KB gzipped) with a simple script tag and canvas element. Or generate an iframe pointing to the polyvia3d viewer with your hosted file URL. For game engine integration: Unity and Unreal Engine both have 3DGS import plugins that accept PLY files — see our Unity/Unreal guide. For archival: keep the original PLY. For everything else: use SPZ.