This lab connects image-based training to a Unity scene. The trained model stores coloured, transparent 3D Gaussians rather than a triangle mesh. Each Gaussian has a position, scale, rotation and opacity; overlapping splats form the image seen by the camera.

Two reconstructed hotdogs on a plate, rendered by the tested Unity Windows player using the filtered Gaussian model.

Actual Unity camera capture, with the desktop control overlay excluded. Soft edges and stretched details are still visible.

Sparse reconstruction with COLMAP Link to heading

A separate run used official PyCOLMAP 4.2.1 on the same 100 Hotdog training views. These were the original 800 × 800 images, composited onto black and saved as RGB. The ten validation views were excluded.

The COLMAP SfM pipeline ran SIFT extraction, exhaustive matching, geometric verification, incremental camera registration, triangulation and bundle adjustment. The run used CPU processing with eight threads and seed 20261021. A shared pinhole camera started with focal length 1111.11 pixels from the supplied field of view. No camera positions or rotations were given to COLMAP.

Two original Hotdog training views with 50 geometrically verified SIFT matches drawn between corresponding bread details.

The pair r_16.png / r_99.png has 634 verified inliers; 50 are shown. Coordinates and matches come from the actual COLMAP database.

Recorded resultValue
Extracted SIFT keypoints124,205
Candidate image pairs4,950
Pairs with at least 15 verified inliers2,010
Registered images96 / 100
Triangulated sparse points8,425
Mean reprojection error0.529 pixels
Mean track length9.01 observations
Total process time72.68 s
Measured COLMAP sparse reconstruction: coloured points forming the hotdogs in a close view, with 96 estimated camera positions surrounding the scene in an overview.

This is the SfM cloud, separate from the Gaussian debug points later in the post. A similarity fit to the supplied camera centres only orients this plot after reconstruction. The close view uses 1st–99th coordinate bounds plus a margin; the full-scene panel and exported PLY retain every point.

Four views did not register: r_15.png, r_69.png, r_79.png and r_91.png. The cloud has gaps and outliers, with more points on textured bread than on the smooth plate. It is a sparse feature reconstruction, not a dense surface. Reloading both the binary and text exports confirmed the recorded image and point counts.

Input and training Link to heading

The course slides introduce capture, training and importing a Gaussian asset into Unity. For this reproducible run, the input is the public NeRF Synthetic Hotdog scene: 100 training images and ten validation images with supplied camera poses. The original model is by erickfree, released as CC0; the rendered views come from a public dataset mirror.

The original Brush run below used the supplied poses rather than the new COLMAP estimates. Personal photography has not been carried out. The supplied poses let that experiment concentrate on training and Unity integration.

Images were resized from 800 × 800 to 400 × 400. Validation uses every tenth frame from the original validation split, giving ten views separate from the 100 training views. The source manifest records the original file hashes.

Brush v0.3.0 trained for 3,000 steps on an NVIDIA RTX 3060 Laptop GPU, using Vulkan. Settings: seed 20261019, spherical harmonics degree 3, refinement every 100 steps, growth stopping at step 2,500, and a cap of 100,000 splats. The process took 38.94 seconds including startup, evaluation and exports; Brush reported 33 seconds for training.

StepValidation PSNRValidation SSIM
1,00023.61 dB0.8682
2,00028.69 dB0.9406
3,00030.40 dB0.9542
One held-out reference image beside actual Brush renders at 1,000 and 3,000 training steps, showing improved shape and surface detail.

Same validation camera at both checkpoints. The final render recovers more of the bread, sausage and plate, though fine texture remains blurred.

An independent RGB check of the ten saved final renders gives mean per-image PSNR 30.3958 dB, with transparent reference pixels composited on black. These are validation measurements used during training. They are neither an untouched final test nor measurements of the Unity renderer.

Filtering and importing Link to heading

The final PLY contains 9,020 Gaussians. A small Python filter removes splats with opacity below 0.01 or a centre more than two scene units from the median centre. It removes 200 splats, leaving 8,820. There are 199 low-opacity splats and three distant splats, with two in both groups.

The raw export is preserved. These thresholds are specific to this experiment, and removing splats alone does not demonstrate better image quality. The raw and filtered Unity captures look very similar at this scale. This cleanup was scripted; no SuperSplat editing session is claimed.

The Unity project uses 6000.0.23f1 and aras-p’s Gaussian Splatting viewer, pinned to commit 2c6fed37da67a217367261fcfcd3316d34c73e76 (package 1.1.1). Both PLY files were imported with its Medium preset. The viewer source and MIT licence are included in the download.

A minimal package manifest first failed because the renderer references XRSettings. Adding the Unity VR module alongside XR resolved compilation. The Windows player uses Direct3D 12, Linear colour and no MSAA; this viewer does not support Direct3D 11. Reflecting Z for both the model and the provided camera poses keeps them in the same Unity coordinate system.

Checking the running scene Link to heading

The Windows build completed and the actual player rendered both models from three cameras: six captures in total. Runtime records confirm Direct3D 12 on the RTX 3060, with the expected 9,020 and 8,820 splats. A debug-point capture also shows the Gaussian centres.

A second camera angle of the filtered reconstruction rendered in the running Unity player. Unity debug view showing the reconstructed object's individual Gaussian centres as coloured points.

Left/Right selects the three cameras, C switches raw/filtered data, and P switches splats/debug points. The camera captures were inspected for visible content and consistent orientation. This check does not establish a frame rate, VR support or mobile compatibility.

The editor reported two persistent allocations when exiting after import. The build and player checks passed, but that importer warning remains in the local log.

Files and remaining work Link to heading

Open UnityProject/Assets/Scenes/SplatLab.unity in Unity 6000.0.23f1. The archive includes the imported assets, so viewing the scene does not require retraining. Its README explains downloading the input images and Brush separately for a new training run.

The next useful extension is a personally captured object with estimated camera poses. That would check the capture stage, where coverage, lighting and pose errors are less controlled than in this synthetic scene.