Fix figure IK snapping and gate the library on a fail-hard motion checker

Three solver defects made limbs teleport, twist, or windmill: write-back
angles wrapped at ±180 and lerped the long way around; branch flips landed
on configurations the anatomical write-back cannot represent, silently
pulling pinned extremities off their pins; and the degenerate straight-limb
bend plane fell back to the camera axis instead of the anatomical anterior.
solve_limb now verifies each branch reproduces the solved end before
accepting it, resolve unwraps written-back angles toward the pose they
replace, and the degenerate plane comes from the parent's anterior axis.

render.py --check replays every exercise's full tween loop and fails hard
on six invariants (pin fidelity, continuity, wraps, authored-vs-resolved
drift, ground penetration, resolved ROM); --export refuses to ship a
failing exercise. All 66 motions re-authored or retouched to pass: honest
authored angles where pins used to override them silently, grounded feet
on the seated machines, a vertical bench-press bar path, straight-armed
child's pose, a butterfly stretch seated on the mat, and FK arms where
pins forced impossible reaches. MotionSolver.swift mirrors the solver
changes line for line, held by regenerated fixtures.

Claude-Session: https://claude.ai/code/session_01PKptrgbx74peTwHGRxBojv
This commit is contained in:
2026-07-12 00:37:23 -04:00
parent 400601283e
commit 79e75a9127
303 changed files with 3114 additions and 2272 deletions
+89 -31
View File
@@ -352,45 +352,81 @@ enum MotionSolver {
/// Analytic two-bone IK in 3D: reach from `attach` toward `target` in the plane
/// picked by the authored (FK) mid joint, then convert back to anatomical angles.
///
/// The two bend solutions are tried in preference order (arm: nearest the FK guess;
/// leg: the authored/anterior side first). The write-back keeps only a branch whose
/// recovered angles forward-kinematic back to the solved end a branch the angle
/// representation cannot express (acos loses the bend sign, a near-sagittal limb
/// loses its axial rotation) would silently move the pinned extremity, so it is
/// rejected in favor of the flip.
private static func solveLimb(_ limb: FigureLimb, attach: Vec3, target: Vec3, guessMid: Vec3, lengths: (Double, Double), parent: Mat3) -> (BallJoint, Hinge) {
let (a, b) = lengths
let toTarget = target - attach
let d = clampUnit(toTarget.length, abs(a - b) + 0.5, a + b - 0.01)
let dirTarget = toTarget.length > 1e-9 ? toTarget.normalized : Vec3(0, -1, 0)
var normal = dirTarget.cross(guessMid - attach)
if normal.length < 1e-6 {
normal = dirTarget.cross(Vec3(0, 0, 1))
if normal.length < 1e-6 { normal = dirTarget.cross(Vec3(0, 1, 0)) }
// Guess reliability: how far the authored mid sits off the attachtarget line.
// Below kneeStraightFrac the two bend solutions straddle the line and the guess
// (near-parallel) can pick neither a plane nor a side.
let gm = guessMid - attach
let gmPerp = gm - dirTarget.scaled(gm.dot(dirTarget))
let reliable = gmPerp.length >= Self.kneeStraightFrac * a
var normal: Vec3
if reliable {
normal = dirTarget.cross(gm)
} else {
// Degenerate guess: bow the joint along the anatomical anterior axis.
let anterior = parent.apply(Vec3(1, 0, 0))
let ap = anterior - dirTarget.scaled(anterior.dot(dirTarget))
normal = dirTarget.cross(ap)
if normal.length < 1e-6 { // target along the anterior axis: any plane works
normal = dirTarget.cross(Vec3(0, 0, 1))
if normal.length < 1e-6 { normal = dirTarget.cross(Vec3(0, 1, 0)) }
}
}
normal = normal.normalized
let perp = normal.cross(dirTarget)
let along = (a * a + d * d - b * b) / (2 * d)
let h = max(a * a - along * along, 0).squareRoot()
let mid: Vec3
let base = attach + dirTarget.scaled(along)
let signs: (Double, Double)
if limb.isArm {
var best: (distance: Double, mid: Vec3)?
for sign in [1.0, -1.0] {
let m = attach + (dirTarget.scaled(along) + perp.scaled(sign * h))
let distance = (m - guessMid).length
if best == nil || distance < best!.distance { best = (distance, m) }
}
mid = best!.mid
// Prefer the mid nearest the FK guess; the flip is the fallback.
let d1 = (base + perp.scaled(h) - guessMid).length
let d2 = (base + perp.scaled(-h) - guessMid).length
signs = d1 <= d2 ? (1.0, -1.0) : (-1.0, 1.0)
} else {
// A knee bends one way only. Near full extension the two knee solutions
// straddle the hipankle line and the authored guess (also near it) can't
// reliably pick a side the bend plane's normal is a cross of two
// near-parallel vectors, so its sign is noise and the knee can flip behind
// the leg, swinging the thigh backward. When the authored knee sits within
// `kneeStraightFrac` of the line, treat the leg as straight and bend the
// knee anatomically forward (anterior); otherwise honor the authored side.
let gm = guessMid - attach
let gmPerp = gm - dirTarget.scaled(gm.dot(dirTarget))
let ref = gmPerp.length < Self.kneeStraightFrac * a ? parent.apply(Vec3(1, 0, 0)) : gmPerp
let sign = perp.dot(ref) >= 0 ? 1.0 : -1.0
mid = attach + (dirTarget.scaled(along) + perp.scaled(sign * h))
// A knee bends one way only. Honor the authored side when it is reliable,
// else bend anatomically forward (anterior); the flip is the fallback.
let ref = reliable ? gmPerp : parent.apply(Vec3(1, 0, 0))
let first = perp.dot(ref) >= 0 ? 1.0 : -1.0
signs = (first, -first)
}
let end = mid + (target - mid).normalized.scaled(b)
return invertLimb(limb, attach: attach, mid: mid, end: end, parent: parent)
var fallback: (BallJoint, Hinge)?
for sign in [signs.0, signs.1] {
let mid = base + perp.scaled(sign * h)
let end = mid + (target - mid).normalized.scaled(b)
let (upper, lower) = invertLimb(limb, attach: attach, mid: mid, end: end, parent: parent)
// Re-pose the recovered angles (fkLimb's math, upperlower) and accept this
// branch only if the pinned end lands back on the solved point in the screen
// plane that is where the pin lives. A branch the write-back mirrors leaves
// the pin in the drawing and is rejected; one off only in depth (rotation
// gated at rotMinLateral) still holds its pin. Solving is unpitched, so
// view-space (x, y) is the canvas projection (the anchor offset cancels in
// the difference).
let fu = parent.times(ballMatrix(upper, limb.sigma))
let fl = limb.isArm ? fu.times(Mat3.rotZ(lower.flexion)) : fu.times(Mat3.rotZ(-lower.flexion))
let reMid = attach + fu.apply(Vec3(0, -a, 0))
let reEnd = reMid + fl.apply(Vec3(0, -b, 0))
if fallback == nil { fallback = (upper, lower) }
if hypot(reEnd.x - end.x, reEnd.y - end.y) <= Self.branchReproTol {
return (upper, lower)
}
}
return fallback!
}
/// Axial rotation of a two-bone limb is recoverable only from the lower bone's
@@ -398,12 +434,25 @@ enum MotionSolver {
/// rotation is left at 0 (see `invertLimb`).
private static let rotMinLateral = 0.08
/// When a leg's authored knee sits within this fraction of the thigh length off
/// the hipankle line (~sin 8.6°), the leg is treated as straight and its IK knee
/// is bent anatomically forward rather than trusting the (unreliable) authored
/// side (see `solveLimb`).
/// When an authored mid joint (knee or elbow) sits within this fraction of the
/// upper bone length off the attachtarget line (~sin 8.6°), the FK guess is
/// unreliable: the two bend solutions straddle the line and the near-parallel guess
/// can pick neither a side nor a plane. The bend plane is then taken from the
/// anatomical anterior axis (knees forward, elbow flexion carries the forearm
/// anterior) instead of the guess, for both arms and legs (see `solveLimb`).
private static let kneeStraightFrac = 0.15
/// A recovered IK branch is kept only if its re-posed extremity lands within this
/// many canvas units of the solved point, measured in the screen plane where the
/// pin lives (see `solveLimb`). A branch the anatomical write-back cannot
/// represent the acos bend-sign loss or a rotation gated at `rotMinLateral`
/// mirrors the lower bone and misses by a wide margin; the small residual a
/// correctly-authored, on-pin branch leaves when its rotation grazes the gating
/// boundary is only a couple of units, so this margin flips genuine mirrors while
/// leaving well-authored branches on their FK-guess side (a tighter margin would
/// flip them too, shifting sound geometry).
private static let branchReproTol = 4.0
/// Recover anatomical angles from limb joint positions (the inverse of `fkLimb`,
/// ignoring the foot). Assumes |abduction| < 90; the leg's rotation sign flips
/// because knees hinge backward.
@@ -449,7 +498,16 @@ enum MotionSolver {
let target = viewFromCanvas(pin, anchor: anchor, depth: chainPts[2].z)
let lengths: (Double, Double) = limb.isArm ? (prof.upperArm, prof.foreArm) : (prof.thigh, prof.shin)
let parent = limb.isArm ? p.f2 : p.fRoot
let (upper, lower) = solveLimb(limb, attach: attach, target: target, guessMid: chainPts[1], lengths: lengths, parent: parent)
var upper: BallJoint
let lower: Hinge
(upper, lower) = solveLimb(limb, attach: attach, target: target, guessMid: chainPts[1], lengths: lengths, parent: parent)
// invertLimb returns principal-value angles (atan2/asin); unwrap the
// flexion/rotation toward the pose being replaced so key frames lerp the
// short way and tween ticks stay continuous. Abduction is asin-ranged and
// cannot wrap.
let prev = frame.ball(for: limb)
upper.flexion += 360 * ((prev.flexion - upper.flexion) / 360).rounded()
upper.rotation += 360 * ((prev.rotation - upper.rotation) / 360).rounded()
frame.setUpper(upper, for: limb)
frame.setLower(lower, for: limb)
solved = true
@@ -18,10 +18,10 @@
"root": {"pos": [128, 126], "pitch": -4},
"spine": [0, 4],
"neck": 8,
"shoulder_r": 78, "elbow_r": 40,
"shoulder_l": 78, "elbow_l": 40,
"hip_r": 66, "knee_r": 70,
"hip_l": 66, "knee_l": 70,
"shoulder_r": 3, "elbow_r": 105,
"shoulder_l": 3, "elbow_l": 105,
"hip_r": 66, "knee_r": 115,
"hip_l": 66, "knee_l": 119,
"pins": {"hand_r": [155, 62], "hand_l": [161, 64], "foot_r": [168, 150], "foot_l": [172, 150]}
},
{
@@ -29,10 +29,10 @@
"root": {"pos": [128, 126], "pitch": 10},
"spine": [0, 40],
"neck": 18, "head": -26,
"shoulder_r": 128, "elbow_r": 40,
"shoulder_l": 128, "elbow_l": 40,
"hip_r": 80, "knee_r": 70,
"hip_l": 80, "knee_l": 70,
"shoulder_r": 39, "elbow_r": 121,
"shoulder_l": 39, "elbow_l": 121,
"hip_r": 80, "knee_r": 115,
"hip_l": 80, "knee_l": 119,
"pins": {"hand_r": [190, 76], "hand_l": [196, 78], "foot_r": [168, 150], "foot_l": [172, 150]}
}
]
@@ -20,8 +20,8 @@
"neck": 0,
"shoulder_r": {"flexion": 10, "abduction": 18}, "elbow_r": 25,
"shoulder_l": {"flexion": 10, "abduction": 18}, "elbow_l": 25,
"hip_r": {"flexion": 78, "abduction": 7}, "knee_r": 62,
"hip_l": {"flexion": 78, "abduction": 7}, "knee_l": 62
"hip_r": {"flexion": 96, "abduction": 7}, "knee_r": 100,
"hip_l": {"flexion": 96, "abduction": 7}, "knee_l": 100
},
{
"hold": 0.5, "tween": 1.1,
@@ -30,8 +30,8 @@
"neck": 0,
"shoulder_r": {"flexion": 10, "abduction": 18}, "elbow_r": 25,
"shoulder_l": {"flexion": 10, "abduction": 18}, "elbow_l": 25,
"hip_r": {"flexion": 78, "abduction": 30}, "knee_r": 62,
"hip_l": {"flexion": 78, "abduction": 30}, "knee_l": 62
"hip_r": {"flexion": 96, "abduction": 30}, "knee_r": 100,
"hip_l": {"flexion": 96, "abduction": 30}, "knee_l": 100
}
]
}
@@ -20,8 +20,8 @@
"neck": 0,
"shoulder_r": {"flexion": 10, "abduction": 18}, "elbow_r": 25,
"shoulder_l": {"flexion": 10, "abduction": 18}, "elbow_l": 25,
"hip_r": {"flexion": 78, "abduction": 30}, "knee_r": 62,
"hip_l": {"flexion": 78, "abduction": 30}, "knee_l": 62
"hip_r": {"flexion": 96, "abduction": 30}, "knee_r": 100,
"hip_l": {"flexion": 96, "abduction": 30}, "knee_l": 100
},
{
"hold": 0.5, "tween": 1.1,
@@ -30,8 +30,8 @@
"neck": 0,
"shoulder_r": {"flexion": 10, "abduction": 18}, "elbow_r": 25,
"shoulder_l": {"flexion": 10, "abduction": 18}, "elbow_l": 25,
"hip_r": {"flexion": 78, "abduction": 7}, "knee_r": 62,
"hip_l": {"flexion": 78, "abduction": 7}, "knee_l": 62
"hip_r": {"flexion": 96, "abduction": 7}, "knee_r": 100,
"hip_l": {"flexion": 96, "abduction": 7}, "knee_l": 100
}
]
}
@@ -15,9 +15,9 @@
"hold": 0.4, "tween": 1.0,
"root": {"pos": [150, 102], "pitch": 112},
"spine": [0, 12],
"neck": 10, "head": -30,
"shoulder_r": 30, "elbow_r": 140,
"shoulder_l": 30, "elbow_l": 140,
"neck": 1, "head": -30,
"shoulder_r": -10, "elbow_r": 114,
"shoulder_l": -10, "elbow_l": 114,
"hip_r": 48, "knee_r": 12, "ankle_r": 12,
"hip_l": 48, "knee_l": 12, "ankle_l": 12,
"pins": {"foot_r": [72, 136], "foot_l": [76, 138]}
@@ -12,24 +12,22 @@
"root": {"pos": [160, 64], "pitch": 6},
"spine": [0, 0],
"neck": 2, "head": -6,
"shoulder_r": 28, "elbow_r": 140,
"shoulder_l": 28, "elbow_l": 140,
"shoulder_r": {"flexion": -12, "abduction": 35, "rotation": -45}, "elbow_r": 150,
"shoulder_l": {"flexion": -12, "abduction": 35, "rotation": -45}, "elbow_l": 150,
"hip_r": 5, "knee_r": 4, "ankle_r": 0,
"hip_l": 5, "knee_l": 4, "ankle_l": 0,
"pins": {"foot_r": [160, 148], "foot_l": [164, 150],
"hand_r": [166, -16], "hand_l": [170, -14]}
"pins": {"foot_r": [160, 148], "foot_l": [164, 148]}
},
{
"hold": 0.4, "tween": 1.1,
"root": {"pos": [117, 108], "pitch": 35},
"spine": [0, -4],
"neck": 5, "head": -28,
"shoulder_r": 55, "elbow_r": 140,
"shoulder_l": 55, "elbow_l": 140,
"shoulder_r": {"flexion": -12, "abduction": 35, "rotation": -45}, "elbow_r": 150,
"shoulder_l": {"flexion": -12, "abduction": 35, "rotation": -45}, "elbow_l": 150,
"hip_r": 100, "knee_r": 118, "ankle_r": 22,
"hip_l": 100, "knee_l": 118, "ankle_l": 22,
"pins": {"foot_r": [160, 148], "foot_l": [164, 150],
"hand_r": [163, 30], "hand_l": [167, 32]}
"pins": {"foot_r": [160, 148], "foot_l": [164, 148]}
}
]
}
@@ -18,10 +18,10 @@
"neck": 8, "head": 0,
"shoulder_r": 15, "elbow_r": 100,
"shoulder_l": 15, "elbow_l": 100,
"hip_r": 78, "knee_r": 82, "ankle_r": 5,
"hip_l": 78, "knee_l": 82, "ankle_l": 5,
"hip_r": 10, "knee_r": 99, "ankle_r": 5,
"hip_l": 10, "knee_l": 102, "ankle_l": 5,
"pins": {"foot_r": [196, 148], "foot_l": [200, 150],
"hand_r": [93, 100], "hand_l": [97, 102]}
"hand_r": [73, 98], "hand_l": [77, 100]}
},
{
"hold": 0.4, "tween": 1.2,
@@ -29,9 +29,9 @@
"spine": [0, 0],
"neck": 8, "head": 0,
"shoulder_r": 90, "elbow_r": 5,
"shoulder_l": 90, "elbow_l": 5,
"hip_r": 78, "knee_r": 82, "ankle_r": 5,
"hip_l": 78, "knee_l": 82, "ankle_l": 5,
"shoulder_l": {"flexion": 90, "rotation": -90}, "elbow_l": 5,
"hip_r": 10, "knee_r": 99, "ankle_r": 5,
"hip_l": 10, "knee_l": 102, "ankle_l": 5,
"pins": {"foot_r": [196, 148], "foot_l": [200, 150],
"hand_r": [67, 57], "hand_l": [71, 59]}
}
@@ -10,8 +10,8 @@
"neck": 16, "head": -72,
"shoulder_r": 81, "elbow_r": 0,
"shoulder_l": 81, "elbow_l": 0,
"hip_r": 74, "knee_r": 83, "ankle_r": -55,
"hip_l": 74, "knee_l": 83, "ankle_l": -55,
"hip_r": 74, "knee_r": 92, "ankle_r": -55,
"hip_l": 74, "knee_l": 92, "ankle_l": -55,
"pins": {"hand_l": [105, 152], "hand_r": [111, 154]}
},
{
@@ -22,7 +22,7 @@
"shoulder_r": 81, "elbow_r": 0,
"shoulder_l": 190, "elbow_l": 0,
"hip_r": -24, "knee_r": 0, "ankle_r": -25,
"hip_l": 74, "knee_l": 83, "ankle_l": -55,
"hip_l": 74, "knee_l": 92, "ankle_l": -55,
"pins": {"hand_r": [111, 154]}
},
{
@@ -32,8 +32,8 @@
"neck": 16, "head": -72,
"shoulder_r": 81, "elbow_r": 0,
"shoulder_l": 81, "elbow_l": 0,
"hip_r": 74, "knee_r": 83, "ankle_r": -55,
"hip_l": 74, "knee_l": 83, "ankle_l": -55,
"hip_r": 74, "knee_r": 92, "ankle_r": -55,
"hip_l": 74, "knee_l": 92, "ankle_l": -55,
"pins": {"hand_l": [105, 152], "hand_r": [111, 154]}
},
{
@@ -43,7 +43,7 @@
"neck": 16, "head": -82,
"shoulder_r": 190, "elbow_r": 0,
"shoulder_l": 81, "elbow_l": 0,
"hip_r": 74, "knee_r": 83, "ankle_r": -55,
"hip_r": 74, "knee_r": 92, "ankle_r": -55,
"hip_l": -24, "knee_l": 0, "ankle_l": -25,
"pins": {"hand_l": [105, 152]}
}
@@ -13,7 +13,7 @@
"shoulder_l": 6, "elbow_l": 5,
"hip_r": 4, "knee_r": 3, "ankle_r": 0,
"hip_l": 4, "knee_l": 3, "ankle_l": 0,
"pins": {"foot_r": [160, 148], "foot_l": [164, 150]}
"pins": {"foot_r": [160, 148], "foot_l": [164, 147]}
},
{
"hold": 0.4, "tween": 0.9,
@@ -24,7 +24,7 @@
"shoulder_l": 118, "elbow_l": 8,
"hip_r": 98, "knee_r": 118, "ankle_r": 22,
"hip_l": 98, "knee_l": 118, "ankle_l": 22,
"pins": {"foot_r": [160, 148], "foot_l": [164, 150]}
"pins": {"foot_r": [160, 148], "foot_l": [164, 147]}
}
]
}
@@ -1,30 +1,119 @@
{
"name": "Butterfly Stretch",
"primary": 2,
"camera": {"yaw": 52},
"working": ["leg_r", "leg_l"],
"camera": {
"yaw": 52
},
"working": [
"leg_r",
"leg_l"
],
"frames": [
{
"hold": 2.2, "tween": 1.8,
"root": {"pos": [160, 118], "pitch": 4},
"spine": [20, 18],
"neck": 12, "head": -14,
"shoulder_r": {"flexion": 94, "abduction": 12}, "elbow_r": 40,
"shoulder_l": {"flexion": 94, "abduction": 12}, "elbow_l": 40,
"hip_r": {"flexion": 82, "abduction": 38, "rotation": 44}, "knee_r": 108,
"hip_l": {"flexion": 82, "abduction": 38, "rotation": 44}, "knee_l": 108,
"pins": {"hand_r": [178, 158], "hand_l": [198, 159]}
"hold": 2.2,
"tween": 1.8,
"root": {
"pos": [
160,
143
],
"pitch": 5
},
"spine": [
24,
18
],
"neck": 6,
"head": -8,
"shoulder_r": {
"flexion": 45.5,
"abduction": 25.1,
"rotation": 0.0
},
"elbow_r": 2.0,
"shoulder_l": {
"flexion": 31.0,
"abduction": 40.4,
"rotation": -67.7
},
"elbow_l": 63.5,
"hip_r": {
"flexion": 120,
"abduction": 35,
"rotation": 50
},
"knee_r": 128,
"ankle_r": 0,
"hip_l": {
"flexion": 120,
"abduction": 35,
"rotation": 50
},
"knee_l": 128,
"ankle_l": 0,
"pins": {
"hand_r": [
162,
134
],
"hand_l": [
209,
128
]
}
},
{
"hold": 2.4, "tween": 1.8,
"root": {"pos": [160, 118], "pitch": 4},
"spine": [26, 24],
"neck": 14, "head": -16,
"shoulder_r": {"flexion": 98, "abduction": 12}, "elbow_r": 34,
"shoulder_l": {"flexion": 98, "abduction": 12}, "elbow_l": 34,
"hip_r": {"flexion": 82, "abduction": 44, "rotation": 46}, "knee_r": 110,
"hip_l": {"flexion": 82, "abduction": 44, "rotation": 46}, "knee_l": 110,
"pins": {"hand_r": [176, 159], "hand_l": [200, 160]}
"hold": 2.4,
"tween": 1.8,
"root": {
"pos": [
160,
143
],
"pitch": 5
},
"spine": [
28,
21
],
"neck": 8,
"head": -10,
"shoulder_r": {
"flexion": 40.4,
"abduction": 33.1,
"rotation": -24.7
},
"elbow_r": 18.7,
"shoulder_l": {
"flexion": 32.1,
"abduction": 48.3,
"rotation": -70.7
},
"elbow_l": 80.6,
"hip_r": {
"flexion": 120,
"abduction": 35,
"rotation": 50
},
"knee_r": 128,
"ankle_r": 0,
"hip_l": {
"flexion": 120,
"abduction": 35,
"rotation": 50
},
"knee_l": 128,
"ankle_l": 0,
"pins": {
"hand_r": [
162,
134
],
"hand_l": [
209,
128
]
}
}
]
}
@@ -22,8 +22,8 @@
"neck": 16,
"shoulder_r": 44, "elbow_r": 25,
"shoulder_l": 44, "elbow_l": 25,
"hip_r": 62, "knee_r": -10, "ankle_r": 12,
"hip_l": 62, "knee_l": -10, "ankle_l": 12,
"hip_r": 62, "knee_r": 50, "ankle_r": 12,
"hip_l": 62, "knee_l": 56, "ankle_l": 12,
"pins": {"hand_r": [166, 74], "hand_l": [170, 76], "foot_r": [212, 148], "foot_l": [216, 150]}
},
{
@@ -33,8 +33,8 @@
"neck": 16,
"shoulder_r": 44, "elbow_r": 25,
"shoulder_l": 44, "elbow_l": 25,
"hip_r": 66, "knee_r": -8, "ankle_r": -18,
"hip_l": 66, "knee_l": -8, "ankle_l": -18,
"hip_r": 66, "knee_r": 59, "ankle_r": -18,
"hip_l": 66, "knee_l": 64, "ankle_l": -18,
"pins": {"hand_r": [166, 74], "hand_l": [170, 76], "foot_r": [212, 139], "foot_l": [216, 141]}
}
]
@@ -10,8 +10,8 @@
"neck": 30, "head": -111,
"shoulder_r": 65, "elbow_r": 0,
"shoulder_l": 65, "elbow_l": 0,
"hip_r": 91, "knee_r": 83, "ankle_r": -55,
"hip_l": 91, "knee_l": 83, "ankle_l": -55,
"hip_r": 91, "knee_r": 93, "ankle_r": -55,
"hip_l": 91, "knee_l": 93, "ankle_l": -55,
"pins": {"hand_l": [105, 152], "hand_r": [111, 154]}
},
{
@@ -21,8 +21,8 @@
"neck": 23, "head": -80,
"shoulder_r": 102, "elbow_r": 0,
"shoulder_l": 102, "elbow_l": 0,
"hip_r": 58, "knee_r": 83, "ankle_r": -55,
"hip_l": 58, "knee_l": 83, "ankle_l": -55,
"hip_r": 58, "knee_r": 93, "ankle_r": -55,
"hip_l": 58, "knee_l": 93, "ankle_l": -55,
"pins": {"hand_l": [105, 152], "hand_r": [111, 154]}
}
]
@@ -13,7 +13,7 @@
"shoulder_l": -26, "elbow_l": 34,
"hip_r": 2, "knee_r": 2, "ankle_r": 0,
"hip_l": 2, "knee_l": 2, "ankle_l": 0,
"pins": {"foot_r": [158, 150], "foot_l": [162, 150]}
"pins": {"foot_r": [158, 148], "foot_l": [162, 148]}
},
{
"hold": 2.4, "tween": 1.8,
@@ -24,7 +24,7 @@
"shoulder_l": -55, "elbow_l": 20,
"hip_r": 2, "knee_r": 2, "ankle_r": 0,
"hip_l": 2, "knee_l": 2, "ankle_l": 0,
"pins": {"foot_r": [158, 150], "foot_l": [162, 150],
"pins": {"foot_r": [158, 148], "foot_l": [162, 148],
"hand_r": [150, 41], "hand_l": [154, 42]}
}
]
@@ -19,8 +19,8 @@
"neck": 16, "head": -11,
"shoulder_r": -20, "elbow_r": 140,
"shoulder_l": -20, "elbow_l": 140,
"hip_r": 54, "knee_r": 50,
"hip_l": 54, "knee_l": 50,
"hip_r": 90, "knee_r": 108,
"hip_l": 91, "knee_l": 111,
"pins": {"foot_r": [158, 151], "foot_l": [162, 152]}
},
{
@@ -30,8 +30,8 @@
"neck": 16, "head": -11,
"shoulder_r": 74, "elbow_r": -8,
"shoulder_l": 74, "elbow_l": -8,
"hip_r": 54, "knee_r": 50,
"hip_l": 54, "knee_l": 50,
"hip_r": 90, "knee_r": 108,
"hip_l": 91, "knee_l": 111,
"pins": {"foot_r": [158, 151], "foot_l": [162, 152]}
}
]
@@ -5,25 +5,25 @@
"frames": [
{
"hold": 2.4, "tween": 2.0,
"root": {"pos": [201, 108], "yaw": 180, "pitch": 89},
"root": {"pos": [201, 104], "yaw": 180, "pitch": 87},
"spine": [15, 20],
"neck": 15, "head": -13,
"neck": 25, "head": -13,
"shoulder_r": 168, "elbow_r": 8,
"shoulder_l": 168, "elbow_l": 8,
"hip_r": 86, "knee_r": 104, "ankle_r": -52,
"hip_l": 86, "knee_l": 104, "ankle_l": -52,
"pins": {"hand_r": [80, 150], "hand_l": [84, 151]}
"pins": {"hand_r": [72, 151], "hand_l": [66.5, 151]}
},
{
"hold": 2.6, "tween": 2.0,
"root": {"pos": [202, 110], "yaw": 180, "pitch": 92},
"root": {"pos": [202, 103], "yaw": 180, "pitch": 84},
"spine": [16, 22],
"neck": 17, "head": -15,
"neck": 36, "head": -15,
"shoulder_r": 172, "elbow_r": 6,
"shoulder_l": 172, "elbow_l": 6,
"hip_r": 90, "knee_r": 108, "ankle_r": -52,
"hip_l": 90, "knee_l": 108, "ankle_l": -52,
"pins": {"hand_r": [78, 150], "hand_l": [82, 151]}
"pins": {"hand_r": [73.3, 151], "hand_l": [67.9, 151]}
}
]
}
@@ -8,24 +8,24 @@
"root": {"pos": [188, 147], "yaw": 180, "pitch": 76},
"spine": [0, 6],
"neck": 6, "head": -46,
"shoulder_r": 92, "elbow_r": 100,
"shoulder_l": 92, "elbow_l": 100,
"hip_r": 0, "knee_r": 0, "ankle_r": -50,
"hip_l": 0, "knee_l": 0, "ankle_l": -50,
"pins": {"hand_r": [104, 150], "hand_l": [108, 151],
"foot_r": [270, 150], "foot_l": [274, 151]}
"shoulder_r": 129, "elbow_r": 52,
"shoulder_l": 126, "elbow_l": 52,
"hip_r": 0, "knee_r": 0, "ankle_r": -65,
"hip_l": 0, "knee_l": 0, "ankle_l": -65,
"pins": {"hand_r": [59.2, 149], "hand_l": [53.9, 149],
"foot_r": [281, 148], "foot_l": [274, 149]}
},
{
"hold": 1.3, "tween": 1.1,
"root": {"pos": [188, 147], "yaw": 180, "pitch": 68},
"spine": [-13, -16],
"root": {"pos": [188, 147], "yaw": 180, "pitch": 76},
"spine": [-2, -2],
"neck": -10, "head": -18,
"shoulder_r": 95, "elbow_r": 14,
"shoulder_l": 95, "elbow_l": 14,
"hip_r": 0, "knee_r": 0, "ankle_r": -50,
"hip_l": 0, "knee_l": 0, "ankle_l": -50,
"pins": {"hand_r": [104, 150], "hand_l": [108, 151],
"foot_r": [270, 150], "foot_l": [274, 151]}
"shoulder_r": 127, "elbow_r": 21,
"shoulder_l": 126, "elbow_l": 18,
"hip_r": 0, "knee_r": 0, "ankle_r": -65,
"hip_l": 0, "knee_l": 0, "ankle_l": -65,
"pins": {"hand_r": [59.2, 149], "hand_l": [53.9, 149],
"foot_r": [281, 148], "foot_l": [274, 149]}
}
]
}
@@ -8,8 +8,8 @@
"root": {"pos": [166, 146], "pitch": -90},
"spine": [0, 0],
"neck": 12, "head": 0,
"shoulder_r": 155, "elbow_r": 140,
"shoulder_l": 155, "elbow_l": 140,
"shoulder_r": 125, "elbow_r": 125,
"shoulder_l": 125, "elbow_l": 125,
"hip_r": 75, "knee_r": 85, "ankle_r": 5,
"hip_l": 75, "knee_l": 85, "ankle_l": 5,
"pins": {"foot_r": [205, 148], "foot_l": [209, 150]}
@@ -9,27 +9,25 @@
"frames": [
{
"hold": 0.4, "tween": 1.0,
"root": {"pos": [92, 90], "pitch": 78},
"root": {"pos": [100, 82], "pitch": 72},
"spine": [0, -6],
"neck": 5, "head": -70,
"shoulder_r": 75, "elbow_r": 5,
"shoulder_l": 75, "elbow_l": 5,
"hip_r": 115, "knee_r": 30, "ankle_r": 15,
"hip_l": 115, "knee_l": 30, "ankle_l": 15,
"pins": {"foot_r": [150, 147], "foot_l": [154, 149],
"hand_r": [156, 130], "hand_l": [160, 132]}
"shoulder_r": 35, "elbow_r": 8,
"shoulder_l": 35, "elbow_l": 8,
"hip_r": 122, "knee_r": 30, "ankle_r": 15,
"hip_l": 122, "knee_l": 30, "ankle_l": 15,
"pins": {"foot_r": [150, 148], "foot_l": [154, 149]}
},
{
"hold": 0.4, "tween": 1.2,
"root": {"pos": [150, 64], "pitch": 10},
"root": {"pos": [150, 62], "pitch": 8},
"spine": [0, 0],
"neck": 2, "head": -8,
"shoulder_r": 10, "elbow_r": 3,
"shoulder_l": 10, "elbow_l": 3,
"hip_r": 8, "knee_r": 5, "ankle_r": 0,
"hip_l": 8, "knee_l": 5, "ankle_l": 0,
"pins": {"foot_r": [150, 147], "foot_l": [154, 149],
"hand_r": [161, 38], "hand_l": [165, 40]}
"shoulder_r": -6, "elbow_r": 8,
"shoulder_l": -6, "elbow_l": 8,
"hip_r": 6, "knee_r": 8, "ankle_r": 0,
"hip_l": 6, "knee_l": 8, "ankle_l": 0,
"pins": {"foot_r": [150, 148], "foot_l": [154, 149]}
}
]
}
@@ -19,10 +19,10 @@
"neck": 8, "head": 0,
"shoulder_r": 12, "elbow_r": 105,
"shoulder_l": 12, "elbow_l": 105,
"hip_r": 78, "knee_r": 82, "ankle_r": 5,
"hip_l": 78, "knee_l": 82, "ankle_l": 5,
"hip_r": 10, "knee_r": 99, "ankle_r": 5,
"hip_l": 10, "knee_l": 102, "ankle_l": 5,
"pins": {"foot_r": [196, 148], "foot_l": [200, 150],
"hand_r": [90, 104], "hand_l": [98, 106]}
"hand_r": [72, 102], "hand_l": [80, 104]}
},
{
"hold": 0.4, "tween": 1.2,
@@ -31,8 +31,8 @@
"neck": 8, "head": 0,
"shoulder_r": 90, "elbow_r": 5,
"shoulder_l": 90, "elbow_l": 5,
"hip_r": 78, "knee_r": 82, "ankle_r": 5,
"hip_l": 78, "knee_l": 82, "ankle_l": 5,
"hip_r": 10, "knee_r": 99, "ankle_r": 5,
"hip_l": 10, "knee_l": 102, "ankle_l": 5,
"pins": {"foot_r": [196, 148], "foot_l": [200, 150],
"hand_r": [66, 57], "hand_l": [72, 59]}
}
@@ -20,9 +20,9 @@
"neck": 8, "head": 0,
"shoulder_r": 88, "elbow_r": 12,
"shoulder_l": 88, "elbow_l": 12,
"hip_r": {"flexion": 78, "abduction": 10}, "knee_r": 82, "ankle_r": 5,
"hip_l": {"flexion": 78, "abduction": 10}, "knee_l": 82, "ankle_l": 5,
"pins": {"foot_r": [142, 148], "foot_l": [178, 150]}
"hip_r": {"flexion": 10, "abduction": 15}, "knee_r": 93, "ankle_r": 5,
"hip_l": {"flexion": 7, "abduction": 16}, "knee_l": 91, "ankle_l": 5,
"pins": {"foot_r": [145, 148], "foot_l": [176, 150]}
},
{
"hold": 0.5, "tween": 1.3,
@@ -31,9 +31,9 @@
"neck": 8, "head": 0,
"shoulder_r": {"flexion": 16, "abduction": 84}, "elbow_r": 22,
"shoulder_l": {"flexion": 16, "abduction": 84}, "elbow_l": 22,
"hip_r": {"flexion": 78, "abduction": 10}, "knee_r": 82, "ankle_r": 5,
"hip_l": {"flexion": 78, "abduction": 10}, "knee_l": 82, "ankle_l": 5,
"pins": {"foot_r": [142, 148], "foot_l": [178, 150]}
"hip_r": {"flexion": 10, "abduction": 15}, "knee_r": 93, "ankle_r": 5,
"hip_l": {"flexion": 7, "abduction": 16}, "knee_l": 91, "ankle_l": 5,
"pins": {"foot_r": [145, 148], "foot_l": [176, 150]}
}
]
}
@@ -18,7 +18,7 @@
"neck": 10, "head": -50,
"shoulder_r": 75, "elbow_r": 8,
"shoulder_l": 72, "elbow_l": 5,
"hip_r": 25, "knee_r": 25, "ankle_r": 10,
"hip_r": 96, "knee_r": 76, "ankle_r": 30,
"hip_l": 80, "knee_l": 95, "ankle_l": -50,
"pins": {"foot_r": [196, 148], "foot_l": [202, 122],
"hand_l": [66, 120], "hand_r": [92, 125]}
@@ -28,9 +28,9 @@
"root": {"pos": [168, 82], "yaw": 180, "pitch": 80},
"spine": [0, 0],
"neck": 10, "head": -50,
"shoulder_r": 40, "elbow_r": 115,
"shoulder_r": -21, "elbow_r": 115,
"shoulder_l": 72, "elbow_l": 5,
"hip_r": 25, "knee_r": 25, "ankle_r": 10,
"hip_r": 96, "knee_r": 76, "ankle_r": 30,
"hip_l": 80, "knee_l": 95, "ankle_l": -50,
"pins": {"foot_r": [196, 148], "foot_l": [202, 122],
"hand_l": [66, 120], "hand_r": [100, 86]}
@@ -19,7 +19,7 @@
"shoulder_l": 95, "elbow_l": 10,
"hip_r": 6, "knee_r": 8, "ankle_r": 0,
"hip_l": 6, "knee_l": 8, "ankle_l": 0,
"pins": {"foot_r": [146, 148], "foot_l": [150, 150],
"pins": {"foot_r": [146, 148], "foot_l": [150, 148],
"hand_r": [214, -24], "hand_l": [218, -22]}
},
{
@@ -31,7 +31,7 @@
"shoulder_l": {"flexion": 95, "abduction": 15}, "elbow_l": 140,
"hip_r": 6, "knee_r": 8, "ankle_r": 0,
"hip_l": 6, "knee_l": 8, "ankle_l": 0,
"pins": {"foot_r": [146, 148], "foot_l": [150, 150],
"pins": {"foot_r": [146, 148], "foot_l": [150, 148],
"hand_r": [170, -26], "hand_l": [174, -24]}
}
]
@@ -10,8 +10,8 @@
"neck": 20, "head": -6,
"shoulder_r": -4, "elbow_r": 0,
"shoulder_l": -4, "elbow_l": 0,
"hip_r": 72, "knee_r": 82, "ankle_r": 5,
"hip_l": 72, "knee_l": 82, "ankle_l": 5,
"hip_r": 72, "knee_r": 129, "ankle_r": 5,
"hip_l": 72, "knee_l": 132, "ankle_l": 5,
"pins": {"foot_r": [205, 148], "foot_l": [209, 150]}
},
{
@@ -16,7 +16,7 @@
"shoulder_l": 5, "elbow_l": 140,
"hip_r": 5, "knee_r": 4, "ankle_r": 0,
"hip_l": 5, "knee_l": 4, "ankle_l": 0,
"pins": {"foot_r": [162, 148], "foot_l": [166, 150],
"pins": {"foot_r": [162, 148], "foot_l": [166, 147],
"hand_r": [185, -8], "hand_l": [189, -6]}
},
{
@@ -28,7 +28,7 @@
"shoulder_l": 15, "elbow_l": 135,
"hip_r": 96, "knee_r": 116, "ankle_r": 20,
"hip_l": 96, "knee_l": 116, "ankle_l": 20,
"pins": {"foot_r": [162, 148], "foot_l": [166, 150],
"pins": {"foot_r": [162, 148], "foot_l": [166, 147],
"hand_r": [196, 36], "hand_l": [200, 38]}
}
]
@@ -6,14 +6,14 @@
"frames": [
{
"hold": 0.12, "tween": 0.6,
"root": {"pos": [160, 72]},
"root": {"pos": [160, 61]},
"spine": [{"lateral": 0, "flexion": -2}, {"lateral": 0, "flexion": -2}],
"neck": 0, "head": 0,
"shoulder_r": {"flexion": -8, "abduction": 50}, "elbow_r": 125,
"shoulder_l": {"flexion": -8, "abduction": 50}, "elbow_l": 125,
"hip_r": 3, "knee_r": 5, "ankle_r": 0,
"hip_l": 3, "knee_l": 5, "ankle_l": 0,
"pins": {"foot_r": [154, 150], "foot_l": [166, 150]}
"hip_r": {"flexion": 0, "abduction": 1}, "knee_r": 2, "ankle_r": 0,
"hip_l": {"flexion": 8, "abduction": -2}, "knee_l": 20, "ankle_l": 0,
"pins": {"foot_r": [154, 147], "foot_l": [166, 147]}
},
{
"hold": 0.12, "tween": 0.6,
@@ -24,7 +24,7 @@
"shoulder_l": {"flexion": -8, "abduction": 50}, "elbow_l": 125,
"hip_r": 3, "knee_r": 5, "ankle_r": 0,
"hip_l": 3, "knee_l": 5, "ankle_l": 0,
"pins": {"foot_r": [154, 150], "foot_l": [166, 150]}
"pins": {"foot_r": [154, 147], "foot_l": [166, 147]}
},
{
"hold": 0.12, "tween": 0.6,
@@ -35,7 +35,7 @@
"shoulder_l": {"flexion": -8, "abduction": 50}, "elbow_l": 125,
"hip_r": 3, "knee_r": 5, "ankle_r": 0,
"hip_l": 3, "knee_l": 5, "ankle_l": 0,
"pins": {"foot_r": [154, 150], "foot_l": [166, 150]}
"pins": {"foot_r": [154, 147], "foot_l": [166, 147]}
},
{
"hold": 0.12, "tween": 0.6,
@@ -46,7 +46,7 @@
"shoulder_l": {"flexion": -8, "abduction": 50}, "elbow_l": 125,
"hip_r": 3, "knee_r": 5, "ankle_r": 0,
"hip_l": 3, "knee_l": 5, "ankle_l": 0,
"pins": {"foot_r": [154, 150], "foot_l": [166, 150]}
"pins": {"foot_r": [154, 147], "foot_l": [166, 147]}
}
]
}
@@ -6,23 +6,23 @@
{
"hold": 2.2, "tween": 1.8,
"root": {"pos": [160, 108], "pitch": 4},
"spine": [11, 11],
"spine": [40, 40],
"neck": 8, "head": -12,
"shoulder_r": 54, "elbow_r": 36,
"shoulder_l": 54, "elbow_l": 36,
"shoulder_r": 12, "elbow_r": 70,
"shoulder_l": 12, "elbow_l": 66,
"hip_r": 86, "knee_r": 90, "ankle_r": 6,
"hip_l": -16, "knee_l": 74, "ankle_l": -55,
"hip_l": -16, "knee_l": 80, "ankle_l": -55,
"pins": {"foot_r": [206, 150], "hand_r": [202, 112], "hand_l": [206, 114]}
},
{
"hold": 2.4, "tween": 1.8,
"root": {"pos": [162, 110], "pitch": 6},
"spine": [15, 15],
"spine": [42, 42],
"neck": 9, "head": -13,
"shoulder_r": 58, "elbow_r": 32,
"shoulder_l": 58, "elbow_l": 32,
"shoulder_r": -2, "elbow_r": 92,
"shoulder_l": -2, "elbow_l": 88,
"hip_r": 90, "knee_r": 90, "ankle_r": 6,
"hip_l": -28, "knee_l": 56, "ankle_l": -55,
"hip_l": -28, "knee_l": 62, "ankle_l": -55,
"pins": {"foot_r": [210, 150], "hand_r": [206, 110], "hand_l": [210, 112]}
}
]
@@ -5,8 +5,8 @@
"working": ["leg_r"],
"frames": [
{
"hold": 0.16, "tween": 0.72,
"root": {"pos": [156, 66], "pitch": 5},
"hold": 0.16, "tween": 0.83,
"root": {"pos": [156, 64], "pitch": 5},
"spine": [0, 0],
"neck": 2, "head": -6,
"shoulder_r": 6, "elbow_r": 10,
@@ -16,8 +16,8 @@
"pins": {"foot_l": [168, 150]}
},
{
"hold": 0.16, "tween": 0.72,
"root": {"pos": [156, 66], "pitch": 5},
"hold": 0.16, "tween": 0.83,
"root": {"pos": [156, 64], "pitch": 5},
"spine": [0, 0],
"neck": 2, "head": -6,
"shoulder_r": 6, "elbow_r": 10,
@@ -13,7 +13,7 @@
"shoulder_l": 5, "elbow_l": 8,
"hip_r": 25, "knee_r": 10, "ankle_r": 5,
"hip_l": -25, "knee_l": 10, "ankle_l": -12,
"pins": {"foot_r": [196, 148], "foot_l": [124, 147]}
"pins": {"foot_r": [195, 148], "foot_l": [125, 138]}
},
{
"hold": 0.4, "tween": 1.0,
@@ -24,7 +24,7 @@
"shoulder_l": 5, "elbow_l": 8,
"hip_r": 80, "knee_r": 95, "ankle_r": 15,
"hip_l": -12, "knee_l": 100, "ankle_l": -42,
"pins": {"foot_r": [196, 148], "foot_l": [124, 147]}
"pins": {"foot_r": [195, 148], "foot_l": [125, 145]}
}
]
}
@@ -7,24 +7,22 @@
{
"hold": 1.2, "tween": 2.6,
"root": {"pos": [160, 143], "pitch": 2},
"spine": [6, 2],
"neck": 4, "head": -8,
"shoulder_r": {"flexion": 30, "abduction": 8, "rotation": -25}, "elbow_r": 100,
"shoulder_l": {"flexion": 30, "abduction": 8, "rotation": -25}, "elbow_l": 100,
"hip_r": {"flexion": 88, "abduction": 45, "rotation": 50}, "knee_r": 146, "ankle_r": 0,
"hip_l": {"flexion": 88, "abduction": 45, "rotation": 50}, "knee_l": 146, "ankle_l": 0,
"pins": {"hand_r": [174, 95], "hand_l": [176, 96]}
"spine": [6, 4],
"neck": 5, "head": -9,
"shoulder_r": {"flexion": 5, "abduction": 0, "rotation": 0}, "elbow_r": 48,
"shoulder_l": {"flexion": 8, "abduction": -15, "rotation": -20}, "elbow_l": 39,
"hip_r": {"flexion": 118, "abduction": 38, "rotation": 48}, "knee_r": 130, "ankle_r": 0,
"hip_l": {"flexion": 118, "abduction": 38, "rotation": 48}, "knee_l": 130, "ankle_l": 0
},
{
"hold": 0.8, "tween": 2.8,
"root": {"pos": [160, 142], "pitch": 1},
"spine": [3, -2],
"neck": 2, "head": -6,
"shoulder_r": {"flexion": 33, "abduction": 8, "rotation": -25}, "elbow_r": 96,
"shoulder_l": {"flexion": 33, "abduction": 8, "rotation": -25}, "elbow_l": 96,
"hip_r": {"flexion": 88, "abduction": 45, "rotation": 50}, "knee_r": 146, "ankle_r": 0,
"hip_l": {"flexion": 88, "abduction": 45, "rotation": 50}, "knee_l": 146, "ankle_l": 0,
"pins": {"hand_r": [174, 93], "hand_l": [176, 94]}
"root": {"pos": [160, 143], "pitch": 2},
"spine": [3, 1],
"neck": 3, "head": -7,
"shoulder_r": {"flexion": 5, "abduction": 0, "rotation": 0}, "elbow_r": 48,
"shoulder_l": {"flexion": 8, "abduction": -15, "rotation": -20}, "elbow_l": 39,
"hip_r": {"flexion": 118, "abduction": 38, "rotation": 48}, "knee_r": 130, "ankle_r": 0,
"hip_l": {"flexion": 118, "abduction": 38, "rotation": 48}, "knee_l": 130, "ankle_l": 0
}
]
}
@@ -20,8 +20,8 @@
"neck": 0,
"shoulder_r": {"flexion": 18, "abduction": 82}, "elbow_r": 25,
"shoulder_l": {"flexion": 18, "abduction": 82}, "elbow_l": 25,
"hip_r": 78, "knee_r": 62,
"hip_l": 78, "knee_l": 62
"hip_r": 96, "knee_r": 100,
"hip_l": 96, "knee_l": 100
},
{
"hold": 0.5, "tween": 1.2,
@@ -30,8 +30,8 @@
"neck": 0,
"shoulder_r": {"flexion": 86, "abduction": 6}, "elbow_r": 25,
"shoulder_l": {"flexion": 86, "abduction": 6}, "elbow_l": 25,
"hip_r": 78, "knee_r": 62,
"hip_l": 78, "knee_l": 62
"hip_r": 96, "knee_r": 100,
"hip_l": 96, "knee_l": 100
}
]
}
@@ -10,18 +10,18 @@
"neck": 0, "head": -65,
"shoulder_r": 95, "elbow_r": 90,
"shoulder_l": 95, "elbow_l": 90,
"hip_r": 60, "knee_r": 55,
"hip_l": 60, "knee_l": 55
"hip_r": 60, "knee_r": 72,
"hip_l": 60, "knee_l": 72
},
{
"hold": 1.8, "tween": 0.7,
"root": {"pos": [168, 137], "yaw": 180, "pitch": 80},
"root": {"pos": [168, 136], "yaw": 180, "pitch": 80},
"spine": [0, 0],
"neck": 0, "head": -50,
"shoulder_r": 80, "elbow_r": 90,
"shoulder_l": 80, "elbow_l": 90,
"hip_r": 0, "knee_r": 0,
"hip_l": 0, "knee_l": 0
"shoulder_r": 82, "elbow_r": 90,
"shoulder_l": 82, "elbow_l": 90,
"hip_r": 0, "knee_r": 14, "ankle_r": -50,
"hip_l": 0, "knee_l": 14, "ankle_l": -50
}
]
}
@@ -10,10 +10,10 @@
"neck": 0, "head": -60,
"shoulder_r": 90, "elbow_r": 8,
"shoulder_l": 90, "elbow_l": 8,
"hip_r": 5, "knee_r": 3, "ankle_r": 25,
"hip_r": 5, "knee_r": 2, "ankle_r": 25,
"hip_l": 5, "knee_l": 3, "ankle_l": 25,
"pins": {"hand_r": [97, 148], "hand_l": [101, 150],
"foot_r": [256, 143], "foot_l": [260, 145]}
"foot_r": [268, 143], "foot_l": [260, 142]}
},
{
"hold": 0.4, "tween": 0.9,
@@ -21,11 +21,11 @@
"spine": [0, 0],
"neck": 0, "head": -55,
"shoulder_r": 60, "elbow_r": 110,
"shoulder_l": 60, "elbow_l": 110,
"hip_r": 5, "knee_r": 3, "ankle_r": 25,
"shoulder_l": 8, "elbow_l": 110,
"hip_r": 5, "knee_r": 33, "ankle_r": 25,
"hip_l": 5, "knee_l": 3, "ankle_l": 25,
"pins": {"hand_r": [97, 148], "hand_l": [101, 150],
"foot_r": [256, 143], "foot_l": [260, 145]}
"foot_r": [268, 143], "foot_l": [260, 142]}
}
]
}
@@ -20,8 +20,8 @@
"neck": 0,
"shoulder_r": {"flexion": 85, "abduction": 6}, "elbow_r": 15,
"shoulder_l": {"flexion": 85, "abduction": 6}, "elbow_l": 15,
"hip_r": 78, "knee_r": 62,
"hip_l": 78, "knee_l": 62
"hip_r": 96, "knee_r": 100,
"hip_l": 96, "knee_l": 100
},
{
"hold": 0.5, "tween": 1.2,
@@ -30,8 +30,8 @@
"neck": 0,
"shoulder_r": {"flexion": 12, "abduction": 84}, "elbow_r": 15,
"shoulder_l": {"flexion": 12, "abduction": 84}, "elbow_l": 15,
"hip_r": 78, "knee_r": 62,
"hip_l": 78, "knee_l": 62
"hip_r": 96, "knee_r": 100,
"hip_l": 96, "knee_l": 100
}
]
}
@@ -15,7 +15,7 @@
},
{
"hold": 0.8, "tween": 0.9,
"root": {"pos": [166, 136], "pitch": -105},
"root": {"pos": [166, 134], "pitch": -105},
"spine": [0, 20],
"neck": -7, "head": 2,
"shoulder_r": 3, "elbow_r": 0,
@@ -9,27 +9,25 @@
"frames": [
{
"hold": 0.4, "tween": 0.9,
"root": {"pos": [90, 92], "pitch": 68},
"root": {"pos": [100, 84], "pitch": 70},
"spine": [0, -6],
"neck": 5, "head": -62,
"shoulder_r": 66, "elbow_r": 4,
"shoulder_l": 66, "elbow_l": 4,
"hip_r": 112, "knee_r": 12, "ankle_r": 12,
"hip_l": 112, "knee_l": 12, "ankle_l": 12,
"pins": {"foot_r": [158, 147], "foot_l": [162, 149],
"hand_r": [167, 120], "hand_l": [171, 122]}
"neck": 5, "head": -66,
"shoulder_r": 35, "elbow_r": 8,
"shoulder_l": 35, "elbow_l": 8,
"hip_r": 116, "knee_r": 18, "ankle_r": 12,
"hip_l": 116, "knee_l": 18, "ankle_l": 12,
"pins": {"foot_r": [156, 148], "foot_l": [160, 149]}
},
{
"hold": 0.4, "tween": 1.4,
"root": {"pos": [158, 64], "pitch": 10},
"root": {"pos": [158, 64], "pitch": 8},
"spine": [0, 0],
"neck": 2, "head": -8,
"shoulder_r": 10, "elbow_r": 3,
"shoulder_l": 10, "elbow_l": 3,
"hip_r": 8, "knee_r": 8, "ankle_r": 0,
"hip_l": 8, "knee_l": 8, "ankle_l": 0,
"pins": {"foot_r": [158, 147], "foot_l": [162, 149],
"hand_r": [169, 38], "hand_l": [173, 40]}
"shoulder_r": -6, "elbow_r": 8,
"shoulder_l": -6, "elbow_l": 8,
"hip_r": 6, "knee_r": 10, "ankle_r": 0,
"hip_l": 6, "knee_l": 10, "ankle_l": 0,
"pins": {"foot_r": [156, 148], "foot_l": [160, 149]}
}
]
}
@@ -19,8 +19,8 @@
"neck": {"rotation": 18},
"shoulder_r": 70, "elbow_r": 10,
"shoulder_l": 70, "elbow_l": 10,
"hip_r": {"flexion": 82, "abduction": 16}, "knee_r": 70,
"hip_l": {"flexion": 82, "abduction": 16}, "knee_l": 70
"hip_r": {"flexion": 104, "abduction": 16}, "knee_r": 104,
"hip_l": {"flexion": 104, "abduction": 16}, "knee_l": 104
},
{
"hold": 0.4, "tween": 1.0,
@@ -29,8 +29,8 @@
"neck": {"rotation": -18},
"shoulder_r": 70, "elbow_r": 10,
"shoulder_l": 70, "elbow_l": 10,
"hip_r": {"flexion": 82, "abduction": 16}, "knee_r": 70,
"hip_l": {"flexion": 82, "abduction": 16}, "knee_l": 70
"hip_r": {"flexion": 104, "abduction": 16}, "knee_r": 104,
"hip_l": {"flexion": 104, "abduction": 16}, "knee_l": 104
}
]
}
@@ -0,0 +1,43 @@
# Running
Steady, easy-pace running — an upright posture with a slight forward lean from
the ankles, a light midfoot landing under the hips, and a relaxed, efficient
stride. Run in place, on a treadmill, or outdoors; your Apple Watch records
the real effort — heart rate, calories, and duration — as a running workout.
- **Category:** Cardio
- **Type:** Aerobic / conditioning
- **Targets:** Heart, lungs, legs, endurance
- **Prescription:** 1530 minutes at a conversational-to-brisk pace
- **Defaults:** 1 × 1200 s
## Setup
Stand tall with a slight forward lean from the ankles, not the waist. Let
your watch start the session so the effort is tracked on your wrist.
## Execution
1. Ease in for the first minute or two, letting your heart rate climb.
2. Land lightly on your midfoot, under your hips — not out in front.
3. Drive your knees forward and let your arms swing opposite your legs.
4. Favor a quicker cadence over a longer stride; settle into a pace you can
hold for the whole block.
5. Cool down with an easy minute before you stop.
## Cues
- Keep your posture tall, with the lean coming from the ankles.
- Relax your shoulders and keep your elbows around 90 degrees.
- Aim for a pace where you could speak in short sentences, not full paragraphs.
## Common Mistakes
- Overstriding — reaching the foot out ahead of the hips on landing.
- Starting too hard and fading long before the time is up.
- Hunching forward at the waist instead of leaning from the ankles.
## Progression
Add minutes, lift the pace, or fold in short faster intervals to raise the
challenge over time.
@@ -0,0 +1,50 @@
{
"name": "Running",
"primary": 4,
"camera": {"zoom": 0.7},
"working": ["leg_r", "leg_l"],
"frames": [
{
"hold": 0.08, "tween": 0.38,
"root": {"pos": [160, 65], "pitch": 10},
"spine": [0, 0],
"neck": 4, "head": -8,
"shoulder_r": -30, "elbow_r": 90,
"shoulder_l": 35, "elbow_l": 90,
"hip_r": 25, "knee_r": 30, "ankle_r": 0,
"hip_l": -12, "knee_l": 88, "ankle_l": -18,
"pins": {"foot_r": [161, 149]}
},
{
"hold": 0.06, "tween": 0.32,
"root": {"pos": [160, 62], "pitch": 10},
"spine": [0, 0],
"neck": 4, "head": -8,
"shoulder_r": 4, "elbow_r": 70,
"shoulder_l": 4, "elbow_l": 70,
"hip_r": -12, "knee_r": 55, "ankle_r": -5,
"hip_l": 56, "knee_l": 100, "ankle_l": -5
},
{
"hold": 0.08, "tween": 0.38,
"root": {"pos": [160, 65], "pitch": 10},
"spine": [0, 0],
"neck": 4, "head": -8,
"shoulder_r": 35, "elbow_r": 90,
"shoulder_l": -30, "elbow_l": 90,
"hip_l": 25, "knee_l": 30, "ankle_l": 0,
"hip_r": -12, "knee_r": 88, "ankle_r": -18,
"pins": {"foot_l": [159, 149]}
},
{
"hold": 0.06, "tween": 0.32,
"root": {"pos": [160, 62], "pitch": 10},
"spine": [0, 0],
"neck": 4, "head": -8,
"shoulder_r": 4, "elbow_r": 70,
"shoulder_l": 4, "elbow_l": 70,
"hip_l": -12, "knee_l": 55, "ankle_l": -5,
"hip_r": 56, "knee_r": 100, "ankle_r": -5
}
]
}
@@ -19,8 +19,8 @@
"neck": 24, "head": -18,
"shoulder_r": 16, "elbow_r": 150,
"shoulder_l": 16, "elbow_l": 150,
"hip_r": 45, "knee_r": 47,
"hip_l": 45, "knee_l": 47,
"hip_r": 94, "knee_r": 111,
"hip_l": 96, "knee_l": 115,
"pins": {"foot_r": [164, 151], "foot_l": [168, 152]}
},
{
@@ -30,8 +30,8 @@
"neck": 24, "head": -18,
"shoulder_r": 130, "elbow_r": -8,
"shoulder_l": 130, "elbow_l": -8,
"hip_r": 45, "knee_r": 47,
"hip_l": 45, "knee_l": 47,
"hip_r": 94, "knee_r": 111,
"hip_l": 96, "knee_l": 115,
"pins": {"foot_r": [164, 151], "foot_l": [168, 152]}
}
]
@@ -10,8 +10,8 @@
"neck": 0, "head": -77,
"shoulder_r": 2, "elbow_r": -5,
"shoulder_l": 72, "elbow_l": 90,
"hip_r": -17, "knee_r": 0,
"hip_l": -17, "knee_l": 0,
"hip_r": -17, "knee_r": 17,
"hip_l": -17, "knee_l": 17,
"pins": {"hand_l": [60, 152]}
},
{
@@ -21,8 +21,8 @@
"neck": 0, "head": -80,
"shoulder_r": -70, "elbow_r": 0,
"shoulder_l": 80, "elbow_l": 90,
"hip_r": 0, "knee_r": 0,
"hip_l": 0, "knee_l": 0,
"hip_r": 0, "knee_r": 19,
"hip_l": 0, "knee_l": 19,
"pins": {"hand_l": [60, 152]}
}
]
@@ -6,26 +6,27 @@
"frames": [
{
"hold": 2.2, "tween": 1.8,
"root": {"pos": [160, 66], "pitch": 12},
"spine": [4, 4],
"neck": 6, "head": -10,
"shoulder_r": 24, "elbow_r": 42,
"shoulder_l": 24, "elbow_l": 42,
"hip_r": 22, "knee_r": 22, "ankle_r": 6,
"knee_l": 2, "ankle_l": 10,
"pins": {"foot_r": [188, 150], "foot_l": [142, 150]}
"root": {"pos": [158, 70], "pitch": 30},
"spine": [6, 6],
"neck": 6, "head": -12,
"shoulder_r": {"flexion": 39, "abduction": 5, "rotation": 6}, "elbow_r": 64,
"shoulder_l": {"flexion": 36, "abduction": 4, "rotation": 6}, "elbow_l": 58,
"hip_r": 30, "knee_r": 34, "ankle_r": 6,
"hip_l": 5, "knee_l": 2, "ankle_l": 12,
"pins": {"foot_r": [178, 150], "foot_l": [128, 150],
"hand_r": [236, 48], "hand_l": [238, 54]}
},
{
"hold": 2.4, "tween": 1.8,
"root": {"pos": [160, 68], "pitch": 21},
"spine": [6, 6],
"neck": 9, "head": -17,
"shoulder_r": 40, "elbow_r": 34,
"shoulder_l": 40, "elbow_l": 34,
"hip_r": 44, "knee_r": 46, "ankle_r": 8,
"knee_l": 2, "ankle_l": 12,
"pins": {"foot_r": [198, 150], "foot_l": [132, 150],
"hand_r": [186, 110], "hand_l": [190, 112]}
"root": {"pos": [160, 71], "pitch": 36},
"spine": [7, 7],
"neck": 7, "head": -13,
"shoulder_r": {"flexion": 23, "abduction": -1, "rotation": 13}, "elbow_r": 100,
"shoulder_l": {"flexion": 20, "abduction": -4, "rotation": 15}, "elbow_l": 93,
"hip_r": 38, "knee_r": 40, "ankle_r": 6,
"hip_l": 5, "knee_l": 2, "ankle_l": 15,
"pins": {"foot_r": [181, 150], "foot_l": [128, 150],
"hand_r": [236, 48], "hand_l": [238, 54]}
}
]
}
@@ -5,7 +5,7 @@
"working": ["leg_r", "leg_l", "spine"],
"frames": [
{
"hold": 0.4, "tween": 1.2,
"hold": 0.5, "tween": 1.8,
"root": {"pos": [160, 64], "pitch": 5},
"spine": [0, 0],
"neck": 2, "head": -6,
@@ -16,16 +16,16 @@
"pins": {"foot_r": [158, 148], "foot_l": [162, 150]}
},
{
"hold": 0.6, "tween": 1.2,
"root": {"pos": [147, 66], "pitch": 134},
"spine": [11, 13],
"neck": 16, "head": -56,
"shoulder_r": 90, "elbow_r": 6,
"shoulder_l": 90, "elbow_l": 6,
"hip_r": 34, "knee_r": 14, "ankle_r": 10,
"hip_l": 34, "knee_l": 14, "ankle_l": 10,
"hold": 0.7, "tween": 1.8,
"root": {"pos": [148, 62], "pitch": 80},
"spine": [44, 52],
"neck": 32, "head": 0,
"shoulder_r": {"flexion": 74, "abduction": 9, "rotation": 0}, "elbow_r": 122,
"shoulder_l": {"flexion": 71, "abduction": 9, "rotation": 0}, "elbow_l": 121,
"hip_r": 87, "knee_r": 4, "ankle_r": 6,
"hip_l": 87, "knee_l": 4, "ankle_l": 6,
"pins": {"foot_r": [158, 148], "foot_l": [162, 150],
"hand_r": [159, 151], "hand_l": [163, 152]}
"hand_r": [168, 150], "hand_l": [172, 151]}
}
]
}
@@ -22,9 +22,9 @@
"neck": 2, "head": -6,
"shoulder_r": -46, "elbow_r": 72,
"shoulder_l": {"flexion": 122, "abduction": 14}, "elbow_l": 10,
"hip_r": -8, "knee_r": 145, "ankle_r": -48,
"hip_r": -15, "knee_r": 145, "ankle_r": -45,
"hip_l": 2, "knee_l": 2, "ankle_l": 0,
"pins": {"foot_l": [162, 150], "foot_r": [154, 38], "hand_r": [156, 36]}
"pins": {"foot_l": [162, 150]}
}
]
}
@@ -6,7 +6,7 @@
"frames": [
{
"hold": 0.5, "tween": 1.0,
"root": {"pos": [160, 72]},
"root": {"pos": [160, 64]},
"spine": [{"lateral": 16}, {"lateral": 15}],
"neck": 0,
"shoulder_l": {"flexion": 14, "abduction": 126}, "elbow_l": 50,
@@ -17,7 +17,7 @@
},
{
"hold": 0.3, "tween": 0.9,
"root": {"pos": [160, 72]},
"root": {"pos": [160, 64]},
"spine": [{"lateral": 0}, {"lateral": 0}],
"neck": 0,
"shoulder_l": {"flexion": 4, "abduction": 8}, "elbow_l": 14,
@@ -28,7 +28,7 @@
},
{
"hold": 0.5, "tween": 1.0,
"root": {"pos": [160, 72]},
"root": {"pos": [160, 64]},
"spine": [{"lateral": -16}, {"lateral": -15}],
"neck": 0,
"shoulder_r": {"flexion": 14, "abduction": 126}, "elbow_r": 50,
@@ -39,7 +39,7 @@
},
{
"hold": 0.3, "tween": 0.9,
"root": {"pos": [160, 72]},
"root": {"pos": [160, 64]},
"spine": [{"lateral": 0}, {"lateral": 0}],
"neck": 0,
"shoulder_l": {"flexion": 4, "abduction": 8}, "elbow_l": 14,
@@ -19,9 +19,9 @@
"neck": 12, "head": -10,
"shoulder_r": -26, "elbow_r": 120,
"shoulder_l": -26, "elbow_l": 120,
"hip_r": 56, "knee_r": 50,
"hip_l": 56, "knee_l": 50,
"pins": {"hand_r": [124, 62], "hand_l": [128, 64], "foot_r": [156, 151], "foot_l": [160, 152]}
"hip_r": 56, "knee_r": 115,
"hip_l": 56, "knee_l": 118,
"pins": {"hand_r": [124, 62], "hand_l": [128, 64], "foot_r": [156, 151], "foot_l": [160, 151]}
},
{
"hold": 0.4, "tween": 1.1,
@@ -30,9 +30,9 @@
"neck": 12, "head": -10,
"shoulder_r": 1, "elbow_r": 20,
"shoulder_l": 1, "elbow_l": 20,
"hip_r": 56, "knee_r": 50,
"hip_l": 56, "knee_l": 50,
"pins": {"hand_r": [124, 96], "hand_l": [128, 98], "foot_r": [156, 151], "foot_l": [160, 152]}
"hip_r": 56, "knee_r": 115,
"hip_l": 56, "knee_l": 118,
"pins": {"hand_r": [124, 96], "hand_l": [128, 98], "foot_r": [156, 151], "foot_l": [160, 151]}
}
]
}
@@ -16,12 +16,12 @@
"root": {"pos": [150, 66], "pitch": 8},
"spine": [0, 2],
"neck": 6, "head": -8,
"shoulder_r": 15, "elbow_r": 130,
"shoulder_l": 15, "elbow_l": 130,
"shoulder_r": -32, "elbow_r": 148,
"shoulder_l": -39, "elbow_l": 150,
"hip_r": 6, "knee_r": 5, "ankle_r": 0,
"hip_l": 6, "knee_l": 5, "ankle_l": 0,
"pins": {"foot_r": [146, 148], "foot_l": [150, 150],
"hand_r": [172, -10], "hand_l": [176, -8]}
"pins": {"foot_r": [146, 148], "foot_l": [150, 149],
"hand_r": [172, -4], "hand_l": [176, -2]}
},
{
"hold": 0.4, "tween": 1.1,
@@ -32,7 +32,7 @@
"shoulder_l": 8, "elbow_l": 10,
"hip_r": 6, "knee_r": 5, "ankle_r": 0,
"hip_l": 6, "knee_l": 5, "ankle_l": 0,
"pins": {"foot_r": [146, 148], "foot_l": [150, 150],
"pins": {"foot_r": [146, 148], "foot_l": [150, 149],
"hand_r": [168, 40], "hand_l": [172, 42]}
}
]
@@ -125,7 +125,7 @@
},
"ankle": {
"flexion": [
-60,
-70,
30
]
}