The library's planar world-angle rig becomes a genuine 3D anatomical model: skeleton.json holds bone-length profiles (real shoulder/pelvis widths, feet, neutral/female/male) and per-joint ROM; motions pose joints with anatomical angles (flexion/abduction/rotation from neutral standing) under a per-exercise orthographic camera, resolved by kinematics.py (3D FK, analytic two-bone IK with anatomical write-back) and validated against physiological ranges. All 20 sagittal motions were migrated by planar decomposition with 0.00 px golden parity against the old renderer — relabeled to true anatomy, since shading is now near-dark/far-light by camera depth rather than by limb suffix — and the face-on machines are re-authored honestly: Abductor/Adductor with real hip abduction (the foreshortened "frontal" profile is retired) and Rotary with genuine spine axial rotation. Figures gain articulated feet; profiles swap without touching a single motion script; --orbit sweeps the camera 360° while a motion loops. The in-app SwiftUI renderer (iOS + watch) is ported to the same model and consumes the exported motions verbatim; figure-fixtures.json pins its geometry to the Python pipeline within 0.5 px across every exercise, key frame, tween, and orbit sample. Also makes the watch bridge logger nonisolated for the newer SDK's stricter isolation checking. Claude-Session: https://claude.ai/code/session_01LEoff8bXGBS83tK1c55Mf7
41 lines
1.3 KiB
JSON
41 lines
1.3 KiB
JSON
{
|
|
"name": "Leg Press",
|
|
"primary": 2,
|
|
"working": ["leg_r", "leg_l"],
|
|
"props": [
|
|
{"type": "scene", "shapes": [
|
|
{"kind": "line", "pts": [[134, 123], [96, 36]], "w": 9},
|
|
{"kind": "line", "pts": [[126, 127], [156, 122]], "w": 9},
|
|
{"kind": "line", "pts": [[138, 130], [138, 150]], "w": 5},
|
|
{"kind": "line", "pts": [[118, 150], [158, 150]], "w": 5},
|
|
{"kind": "line", "pts": [[142, 90], [142, 78]], "w": 3},
|
|
{"kind": "circle", "c": [142, 77], "r": 3.5, "fill": true, "color": "prop"}
|
|
]},
|
|
{"type": "pad", "at": ["foot_r", "foot_l"], "angle": 88, "halfLen": 20, "w": 6}
|
|
],
|
|
"frames": [
|
|
{
|
|
"hold": 0.4, "tween": 1.0,
|
|
"root": {"pos": [140, 116], "pitch": -26},
|
|
"spine": [0, 4],
|
|
"neck": 37,
|
|
"shoulder_r": -7, "elbow_r": 55,
|
|
"shoulder_l": -7, "elbow_l": 55,
|
|
"hip_r": 104, "knee_r": 98,
|
|
"hip_l": 104, "knee_l": 98,
|
|
"pins": {"foot_r": [185, 102], "foot_l": [189, 104]}
|
|
},
|
|
{
|
|
"hold": 0.4, "tween": 1.2,
|
|
"root": {"pos": [140, 116], "pitch": -26},
|
|
"spine": [0, 4],
|
|
"neck": 37,
|
|
"shoulder_r": -7, "elbow_r": 55,
|
|
"shoulder_l": -7, "elbow_l": 55,
|
|
"hip_r": 84, "knee_r": 25,
|
|
"hip_l": 84, "knee_l": 25,
|
|
"pins": {"foot_r": [220, 101], "foot_l": [224, 103]}
|
|
}
|
|
]
|
|
}
|