The new 3D scene viewer (scripts/view_scene_3d.py, added on main) renders a static PNG: ground plane + camera frustums + object trajectory. Add motion so coverage can be inspected from any angle.
Scope
- An
--animate (or --orbit) mode that either (a) exports a rotating GIF/MP4 (azimuth sweep around the scene), and/or (b) plays the object moving frame-by-frame along its trajectory (a growing/marker-highlighted polyline).
- Keep the existing static-PNG default untouched; animation is opt-in.
- Follow the repo's lazy-import + headless pattern (matplotlib imported inside main; Agg for headless, see
scripts/record_multiview.py for the imageio GIF pattern).
Acceptance
python scripts/view_scene_3d.py --animate --out scene.gif writes a non-empty GIF on macOS/Linux headless.
- Static PNG path unchanged. A tiny smoke test (headless export is non-empty). ruff + mypy clean per repo config.
Pointers
scripts/view_scene_3d.py, scripts/record_multiview.py (GIF/imageio lazy-import), src/multicam_sim/handoff_ltr.py / assembly_line.py (scenes to view).
The new 3D scene viewer (
scripts/view_scene_3d.py, added on main) renders a static PNG: ground plane + camera frustums + object trajectory. Add motion so coverage can be inspected from any angle.Scope
--animate(or--orbit) mode that either (a) exports a rotating GIF/MP4 (azimuth sweep around the scene), and/or (b) plays the object moving frame-by-frame along its trajectory (a growing/marker-highlighted polyline).scripts/record_multiview.pyfor the imageio GIF pattern).Acceptance
python scripts/view_scene_3d.py --animate --out scene.gifwrites a non-empty GIF on macOS/Linux headless.Pointers
scripts/view_scene_3d.py,scripts/record_multiview.py(GIF/imageio lazy-import),src/multicam_sim/handoff_ltr.py/assembly_line.py(scenes to view).