Switch viewer playback from Magnum Math::slerp() to Math::slerpShortestPath() when interpolating adjacent OpenSim frame orientations.
Why:
- Adjacent OpenSim quaternions can cross sign while representing nearly identical orientations.
- Non-shortest-path interpolation can create artificial long-arc spins between valid sampled poses.
- That makes playback exaggerate or invent visible bone flips that are not present in the sampled frame states.
What changed:
- Updated playback interpolation in src/ViewerApp.cpp to use shortest-path quaternion slerp.
- Added docs/motion-troubleshooting.md documenting the distinction between viewer interpolation artifacts and upstream IK discontinuities.
- Added a README pointer to the troubleshooting note.
Investigation log:
- Verified the viewer loads .mot through OpenSim state storage and renders PhysicalFrame transforms directly.
- Reproduced the target Sports2D/Pose2Sim/OpenSim clip and confirmed the .mot already contains large coordinate discontinuities and limit clamping, indicating upstream IK failure.
- Confirmed the viewer also had a separate interpolation issue due to non-shortest-path quaternion slerp.
Validation:
- Rebuilt with: cmake --build build -j
- Relaunched the viewer successfully against the problematic .osim/.mot pair after the fix.