How to fetch and render the DISCOVERSE indoor 3DGS captures used by the multi-camera AndroidTwin demo (see the showcase section of the top-level README).
No scenes are tracked in this repo — assets/scenes/*.ply is .gitignored.
The download script is the only path.
Four indoor 3DGS captures from the DISCOVERSE project:
| Scene | Description | Packed (HF) | Unpacked |
|---|---|---|---|
lab3 |
Robotics lab corner (cabinet, desk) | ~5.5 MB | ~23 MB |
flower_table |
Indoor scene with a flower table | ~7.9 MB | ~33 MB |
discover_operation_studio |
Operation studio room | ~8.4 MB | ~36 MB |
tsimf_library_0 |
Library reading area | ~22 MB | ~92 MB |
Source: tatp/DISCOVERSE-models
on Hugging Face, paths under 3dgs/scene/<name>/point_cloud.ply.
DISCOVERSE ships scenes in PlayCanvas SuperSplat compressed PLY format
(chunked uint32 packed fields), not the official 3DGS schema. MuGS's
GaussianSensor only consumes the unpacked layout (x/y/z, f_dc_*,
scale_*, rot_*, opacity), so the script runs
decompress_supersplat.py once per scene right after download.
# default: lab3 only
bash scripts/data_collection/download_discoverse_scenes.sh
# everything
bash scripts/data_collection/download_discoverse_scenes.sh --all
# pick a subset
bash scripts/data_collection/download_discoverse_scenes.sh lab3 flower_tableOutputs land in:
assets/scenes/discoverse/<scene>/point_cloud.ply # packed (archival)
assets/scenes/discoverse_unpacked/<scene>/point_cloud.ply # unpacked (renderable)
Override with --dst-root <dir> or env DISCOVERSE_SCENE_ROOT=…. The
unpacked directory always appends _unpacked to the chosen root.
curl(orwget) for download.python3withnumpyandplyfilefor the decompressor.
from mugs.sensors import GaussianSensor, GaussianSensorConfig
cfg = GaussianSensorConfig(
width=480,
height=360,
background_ply_path="assets/scenes/discoverse_unpacked/lab3/point_cloud.ply",
render_mode="3dgs_only", # or "hybrid" with a MuJoCo foreground
)
sensor = GaussianSensor(cfg)Pair with MuGSRecorder (in the AndroidTwin repo) for a full
hybrid 3DGS + MuJoCo + MuJoCo-cam-tracking pipeline.
- Don't render the packed PLY directly.
GaussianSensorwill load it and silently render noise. Always go through the unpack step. - Use
bbox.centerfor xy,percentile(z, 5)for floor. COLMAP leaves a small number of sub-floor splats that dragbbox.min[2]~1 m below the actual floor; the 5th-percentile reading is robust. The median xy is biased toward the densest splat cluster (e.g. lab3median_y=+0.72vsbbox_center_y=+0.20) which can push virtual cameras outside the training-cam convex hull — use the bbox center. gs_intrinsics ≠ MuJoCo intrinsics. Feed the GS scene's training focal length (lab3 ≈ 380 px at 480×360) to the renderer, not the MuJoCo camera's ownfx/fy. A mismatch shows up as squashed or stretched backgrounds.- GS coverage ≠ scene bbox. Each capture only renders cleanly
inside the convex hull of the training cameras. lab3's training
cams are biased toward the GS
-Xhalf — virtual cameras placed in the+Xhalf will render dim/blurry noise. Use AndroidTwin'sexamples/dump_cam_params.pyto isolate a single camera's GS-only render before composing a full multi-cam rollout.