You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
During 3D swing/impact playback the moving clubhead can leave the useful camera focus after the user zooms. The animation also lacks deterministic camera presets for the standard golf-analysis views, making comparisons and online demonstrations harder than they should be.
Scope
Implement one shared camera-command contract and matched PyQt6/React adapters for every 3D swing and impact animation. Do not duplicate camera convention logic inside individual plots.
Acceptance criteria
Add an explicit Track Clubhead control. While enabled, camera target/focus follows the clubhead using bounded, stable updates so the entire representative head remains visible without jitter or runaway rescaling.
Preserve the user's zoom distance while tracking whenever possible; apply a documented minimum clearance and an opt-in Auto Fit fallback if the head would be clipped.
Manual pan/orbit temporarily suspends tracking or updates the tracking offset predictably; the control clearly shows the active state and can re-center in one action.
Add discoverable Face On, Down the Line, and Overhead snap-view buttons plus Reset/Auto Fit. Each command has one stable ID, tooltip, focus state, and keyboard-accessible action.
Define all presets in the canonical target frame x=downrange, y=up, z=right: Down the Line looks from behind along +x, Overhead looks along -y, and Face On uses a documented lateral-side default with a deliberate handedness/side option rather than an implicit sign.
Snap views preserve a useful subject target, scale, near/far clipping planes, and vertical axis. Repeated activation is idempotent and does not accumulate camera drift.
Camera state is isolated per viewport so Impact, Swing, and multi-view layouts do not overwrite one another.
Playback, pause, replay-from-end, loop, frame-step, granular speed, wheel zoom, and snap commands work in every combination without losing the clubhead or leaving controls stale.
PyQt6 headless interaction tests and React component/Playwright tests cover command parity, focus tracking over the complete animation, manual override, resize/high-DPI behavior, and all three exact camera orientations.
Rendered computer-control review is recorded at desktop and constrained window sizes; no clubhead clipping, camera jump, control collision, or inaccessible tooltip remains.
User documentation, parity registry, and durable handoff files are updated in the same implementation commits.
Engineering constraints
Use RED-GREEN-REFACTOR TDD, a UI-neutral camera command/state contract, Design by Contract for finite camera vectors and valid frames, DRY adapters, and Law of Demeter boundaries. Do not infer a view convention from the current arbitrary camera pose.
Parent: #4218
Problem
During 3D swing/impact playback the moving clubhead can leave the useful camera focus after the user zooms. The animation also lacks deterministic camera presets for the standard golf-analysis views, making comparisons and online demonstrations harder than they should be.
Scope
Implement one shared camera-command contract and matched PyQt6/React adapters for every 3D swing and impact animation. Do not duplicate camera convention logic inside individual plots.
Acceptance criteria
x=downrange, y=up, z=right: Down the Line looks from behind along +x, Overhead looks along -y, and Face On uses a documented lateral-side default with a deliberate handedness/side option rather than an implicit sign.Engineering constraints
Use RED-GREEN-REFACTOR TDD, a UI-neutral camera command/state contract, Design by Contract for finite camera vectors and valid frames, DRY adapters, and Law of Demeter boundaries. Do not infer a view convention from the current arbitrary camera pose.