Skip to content

feat: camera follow for scene objects (declarative SystemCameraCfg.follow + SimRenderer.set_camera_view) - #65

Open
wlgys8 wants to merge 1 commit into
mainfrom
feat/camera-follow-issue-64
Open

wlgys8 wants to merge 1 commit into
mainfrom
feat/camera-follow-issue-64

Conversation

@wlgys8

@wlgys8 wlgys8 commented Sep 21, 2026

Copy link
Copy Markdown
Contributor

Implements #64.

Summary

  • Declarative follow config: SystemCameraCfg gains a follow: str | None field naming a body object (BodyCfg/RobotCfg field name) in SceneCfg.objs. validate_scene_cfg resolves the name at scene validation time — undeclared names or non-body objects (e.g. terrain) produce a clear error, mirroring query name resolution.
  • Per-frame follow refresh in the renderer: MotrixSimRenderer resolves the follow target's attach-root link once at construction and compiles a one-field LinkPosition query plan; render() / capture() refresh the system-camera lookat from live state (env row 0 + its render offset) on every rendered frame while distance / elevation / azimuth keep their configured values. No rendering → zero overhead; frontend and core stay unaware.
  • Script-level escape hatch: SimRenderer.set_camera_view(lookat, distance, elevation, azimuth) — a pure value method with no backend camera object crossing the boundary. MotrixSimRenderer implements it for both windowed and headless modes.
  • Script migration: scripts/view.py robot viewing and scripts/motion/replay.py now use MotrixSimRenderer, removing their hand-wired RenderApp / system_camera.set_view code.

Non-goals (per issue)

  • No camera property returning backend-native objects; no abstract Camera interface.

Tests

  • Follow name-resolution contract: accepts a declared body object, rejects undeclared names and non-body objects (test_scene_cfg.py).
  • Per-frame follow refresh in windowed render() and headless capture(), static view unchanged without follow, set_camera_view passthrough + lookat shape validation (test_renderer.py).
  • No numeric viewpoint assertions, per repo test policy.
  • Full suites pass: core+motrixsim 190 passed, motrix_envs 307 passed; ruff check/format clean; live headless follow capture smoke-tested against real MotrixSim.

Closes #64

…llow + SimRenderer.set_camera_view)

Implements #64:

- SystemCameraCfg gains a declarative `follow` field naming a body object
  in SceneCfg.objs; validate_scene_cfg rejects undeclared or non-body
  follow targets at scene validation time.
- MotrixSimRenderer resolves the follow target's attach-root link once at
  construction and refreshes the system-camera lookat from live state on
  every rendered frame (windowed render, headless capture) while keeping
  the configured distance/elevation/azimuth; no update when not rendering.
- SimRenderer gains a pure-value set_camera_view method as the script-level
  escape hatch; MotrixSimRenderer implements it for both modes.
- scripts/view.py robot viewing and scripts/motion/replay.py migrate onto
  MotrixSimRenderer, removing direct RenderApp/system_camera wiring.
- Tests cover the follow name-resolution contract and per-frame follow
  refresh; no numeric viewpoint assertions.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Renderer: support camera follow for scene objects (declarative SystemCameraCfg.follow + SimRenderer.set_camera_view)

1 participant