A web-based Gaussian Splat viewer with camera path recording and MP4 video export.
npm install
npm run devThis starts both the frontend viewer (localhost:5173) and export server (localhost:5000).
- Load and view 3D Gaussian Splat scenes (
.ply/.splatfiles) - Record camera keyframes to create animation paths
- Export the path as an MP4 video
| Feature | Description |
|---|---|
| Timeline Editor | Draggable keyframes, scrubber preview, camera frustum gizmos |
| Deterministic Export | Save/load path.json — re-export produces identical MP4 |
| Progress + Cancellation | Visible % complete, cancel button without corrupting output |
| Mode | Control | Action |
|---|---|---|
| Orbit | Left-drag | Rotate |
| Orbit | Right-drag | Pan |
| Orbit | Scroll | Zoom |
| Walk | W/A/S/D/Q/E | Move |
| Walk | Mouse | Look |
| Walk | Esc | Exit |
React 19 · Vite · Three.js · GaussianSplats3D · Tailwind CSS · Node.js · FFmpeg
Usage Guide
- Drag and drop a
.plyor.splatfile, OR - Click Select .PLY File
- Navigate to desired position
- Click + Add Keyframe
- Repeat (minimum 2 keyframes)
- Drag to reorder, × to delete
- ▶ Preview Play — watch animation
- Timeline scrubber — drag to preview any point
- Duration — adjustable 1–30 seconds
- Click 🎬 Export MP4
- Select duration → Start Export
- Wait for progress → save file
- 💾 Save — export keyframes + settings to
.json - 📂 Load — restore from saved file
Export System Details
- Frames render offscreen at fixed resolution (1280×720)
- JPEG frames sent to Node.js server
- FFmpeg encodes to MP4 (H.264)
- File streamed to browser, temp deleted
| Setting | Default |
|---|---|
| Resolution | 1280×720 |
| FPS | 30 |
| Duration | 1–30 sec |
| Codec | H.264 |
Deterministic Export
{
"schemaVersion": 1,
"keyframes": [
{ "position": {...}, "quaternion": {...}, "fov": 60 }
],
"exportSettings": { "duration": 5, "fps": 30, "width": 1280, "height": 720 }
}Same path file + same scene + same encoder = identical MP4 output
Architecture
Frontend (React + Vite) Export Server (Node.js)
├─ Viewer (3D rendering) ├─ Receives frames
├─ Editor (keyframes, timeline) ├─ FFmpeg encoding
└─ Export (offscreen render) └─ Serves MP4
| Mode | Gizmos | Controls | Target |
|---|---|---|---|
| Edit | Visible | Enabled | Screen |
| Preview | Hidden | Disabled | Screen |
| Export | Hidden | Disabled | Offscreen |
MIT