@franzenzenhofer/asanakit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +153 -0
- package/dist/anatomy/muscles.d.ts +55 -0
- package/dist/anatomy/muscles.d.ts.map +1 -0
- package/dist/anatomy/muscles.js +79 -0
- package/dist/anatomy/muscles.js.map +1 -0
- package/dist/anatomy/validate.d.ts +11 -0
- package/dist/anatomy/validate.d.ts.map +1 -0
- package/dist/anatomy/validate.js +94 -0
- package/dist/anatomy/validate.js.map +1 -0
- package/dist/cli/commands/export.d.ts +3 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +45 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/info.d.ts +3 -0
- package/dist/cli/commands/info.d.ts.map +1 -0
- package/dist/cli/commands/info.js +101 -0
- package/dist/cli/commands/info.js.map +1 -0
- package/dist/cli/commands/render.d.ts +3 -0
- package/dist/cli/commands/render.d.ts.map +1 -0
- package/dist/cli/commands/render.js +103 -0
- package/dist/cli/commands/render.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +31 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/resolve.d.ts +12 -0
- package/dist/cli/resolve.d.ts.map +1 -0
- package/dist/cli/resolve.js +46 -0
- package/dist/cli/resolve.js.map +1 -0
- package/dist/core/angles.d.ts +12 -0
- package/dist/core/angles.d.ts.map +1 -0
- package/dist/core/angles.js +27 -0
- package/dist/core/angles.js.map +1 -0
- package/dist/core/rig.d.ts +8 -0
- package/dist/core/rig.d.ts.map +1 -0
- package/dist/core/rig.js +97 -0
- package/dist/core/rig.js.map +1 -0
- package/dist/core/skeleton.d.ts +17 -0
- package/dist/core/skeleton.d.ts.map +1 -0
- package/dist/core/skeleton.js +144 -0
- package/dist/core/skeleton.js.map +1 -0
- package/dist/core/types.d.ts +105 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +47 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/vec2.d.ts +19 -0
- package/dist/core/vec2.d.ts.map +1 -0
- package/dist/core/vec2.js +41 -0
- package/dist/core/vec2.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/library/index.d.ts +27 -0
- package/dist/library/index.d.ts.map +1 -0
- package/dist/library/index.js +75 -0
- package/dist/library/index.js.map +1 -0
- package/dist/model/index.d.ts +4 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +4 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/parse.d.ts +12 -0
- package/dist/model/parse.d.ts.map +1 -0
- package/dist/model/parse.js +43 -0
- package/dist/model/parse.js.map +1 -0
- package/dist/model/pose.d.ts +11 -0
- package/dist/model/pose.d.ts.map +1 -0
- package/dist/model/pose.js +26 -0
- package/dist/model/pose.js.map +1 -0
- package/dist/model/schema.d.ts +1122 -0
- package/dist/model/schema.d.ts.map +1 -0
- package/dist/model/schema.js +178 -0
- package/dist/model/schema.js.map +1 -0
- package/dist/render/anatomy.d.ts +10 -0
- package/dist/render/anatomy.d.ts.map +1 -0
- package/dist/render/anatomy.js +77 -0
- package/dist/render/anatomy.js.map +1 -0
- package/dist/render/annotations.d.ts +9 -0
- package/dist/render/annotations.d.ts.map +1 -0
- package/dist/render/annotations.js +185 -0
- package/dist/render/annotations.js.map +1 -0
- package/dist/render/context.d.ts +16 -0
- package/dist/render/context.d.ts.map +1 -0
- package/dist/render/context.js +2 -0
- package/dist/render/context.js.map +1 -0
- package/dist/render/figure.d.ts +8 -0
- package/dist/render/figure.d.ts.map +1 -0
- package/dist/render/figure.js +138 -0
- package/dist/render/figure.js.map +1 -0
- package/dist/render/index.d.ts +7 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +7 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/project.d.ts +18 -0
- package/dist/render/project.d.ts.map +1 -0
- package/dist/render/project.js +35 -0
- package/dist/render/project.js.map +1 -0
- package/dist/render/props.d.ts +9 -0
- package/dist/render/props.d.ts.map +1 -0
- package/dist/render/props.js +178 -0
- package/dist/render/props.js.map +1 -0
- package/dist/render/raster.d.ts +19 -0
- package/dist/render/raster.d.ts.map +1 -0
- package/dist/render/raster.js +39 -0
- package/dist/render/raster.js.map +1 -0
- package/dist/render/scene.d.ts +26 -0
- package/dist/render/scene.d.ts.map +1 -0
- package/dist/render/scene.js +144 -0
- package/dist/render/scene.js.map +1 -0
- package/dist/render/sheet.d.ts +20 -0
- package/dist/render/sheet.d.ts.map +1 -0
- package/dist/render/sheet.js +74 -0
- package/dist/render/sheet.js.map +1 -0
- package/dist/render/styles.d.ts +77 -0
- package/dist/render/styles.d.ts.map +1 -0
- package/dist/render/styles.js +122 -0
- package/dist/render/styles.js.map +1 -0
- package/dist/render/svg.d.ts +19 -0
- package/dist/render/svg.d.ts.map +1 -0
- package/dist/render/svg.js +40 -0
- package/dist/render/svg.js.map +1 -0
- package/dist/standards/keypoints.d.ts +31 -0
- package/dist/standards/keypoints.d.ts.map +1 -0
- package/dist/standards/keypoints.js +118 -0
- package/dist/standards/keypoints.js.map +1 -0
- package/docs/AUTHORING.md +144 -0
- package/package.json +94 -0
- package/poses/surf/bottom-turn.pose.yaml +47 -0
- package/poses/surf/cutback.pose.yaml +47 -0
- package/poses/surf/duck-dive.pose.yaml +47 -0
- package/poses/surf/noseride.pose.yaml +48 -0
- package/poses/surf/paddling.pose.yaml +48 -0
- package/poses/surf/pop-up.pose.yaml +47 -0
- package/poses/surf/takeoff.pose.yaml +47 -0
- package/poses/surf/tube-stance.pose.yaml +47 -0
- package/poses/yoga/ashtanga/adho-mukha-svanasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/ardha-uttanasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/baddha-konasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/balasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/chaturanga-dandasana.pose.yaml +41 -0
- package/poses/yoga/ashtanga/dandasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/halasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/janu-sirsasana-a.pose.yaml +42 -0
- package/poses/yoga/ashtanga/karnapidasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/marichyasana-a.pose.yaml +42 -0
- package/poses/yoga/ashtanga/marichyasana-c.pose.yaml +42 -0
- package/poses/yoga/ashtanga/matsyasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/navasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/padahastasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/padangusthasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/padmasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/parsvottanasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/paschimottanasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/prasarita-padottanasana-a.pose.yaml +46 -0
- package/poses/yoga/ashtanga/prasarita-padottanasana-c.pose.yaml +46 -0
- package/poses/yoga/ashtanga/primary.seq.yaml +74 -0
- package/poses/yoga/ashtanga/purvottanasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/salamba-sarvangasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/samasthiti.pose.yaml +29 -0
- package/poses/yoga/ashtanga/savasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/setu-bandhasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/sirsasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/supta-padangusthasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/upavistha-konasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/urdhva-dhanurasana.pose.yaml +43 -0
- package/poses/yoga/ashtanga/urdhva-hastasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/urdhva-mukha-svanasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/utkatasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/uttanasana.pose.yaml +42 -0
- package/poses/yoga/ashtanga/utthita-parsvakonasana.pose.yaml +44 -0
- package/poses/yoga/ashtanga/utthita-trikonasana.pose.yaml +44 -0
- package/poses/yoga/ashtanga/virabhadrasana-a.pose.yaml +42 -0
- package/poses/yoga/ashtanga/virabhadrasana-b.pose.yaml +42 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { add, fromPolar, lerp, sub } from '../core/vec2.js';
|
|
2
|
+
export const MEDIAPIPE_33 = [
|
|
3
|
+
'nose', 'left_eye_inner', 'left_eye', 'left_eye_outer', 'right_eye_inner', 'right_eye', 'right_eye_outer',
|
|
4
|
+
'left_ear', 'right_ear', 'mouth_left', 'mouth_right',
|
|
5
|
+
'left_shoulder', 'right_shoulder', 'left_elbow', 'right_elbow', 'left_wrist', 'right_wrist',
|
|
6
|
+
'left_pinky', 'right_pinky', 'left_index', 'right_index', 'left_thumb', 'right_thumb',
|
|
7
|
+
'left_hip', 'right_hip', 'left_knee', 'right_knee', 'left_ankle', 'right_ankle',
|
|
8
|
+
'left_heel', 'right_heel', 'left_foot_index', 'right_foot_index',
|
|
9
|
+
];
|
|
10
|
+
export const COCO_17 = [
|
|
11
|
+
'nose', 'left_eye', 'right_eye', 'left_ear', 'right_ear',
|
|
12
|
+
'left_shoulder', 'right_shoulder', 'left_elbow', 'right_elbow', 'left_wrist', 'right_wrist',
|
|
13
|
+
'left_hip', 'right_hip', 'left_knee', 'right_knee', 'left_ankle', 'right_ankle',
|
|
14
|
+
];
|
|
15
|
+
const COCO_EDGES = [
|
|
16
|
+
[0, 1], [0, 2], [1, 3], [2, 4], [5, 6], [5, 7], [7, 9], [6, 8], [8, 10],
|
|
17
|
+
[5, 11], [6, 12], [11, 12], [11, 13], [13, 15], [12, 14], [14, 16],
|
|
18
|
+
];
|
|
19
|
+
const MEDIAPIPE_EDGES = [
|
|
20
|
+
[0, 2], [0, 5], [2, 7], [5, 8], [9, 10],
|
|
21
|
+
[11, 12], [11, 13], [13, 15], [15, 17], [15, 19], [15, 21],
|
|
22
|
+
[12, 14], [14, 16], [16, 18], [16, 20], [16, 22],
|
|
23
|
+
[11, 23], [12, 24], [23, 24], [23, 25], [25, 27], [27, 29], [27, 31],
|
|
24
|
+
[24, 26], [26, 28], [28, 30], [28, 32],
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* The rig has no facial bones, so eyes, ears and mouth are derived from the head
|
|
28
|
+
* bone's axis. They are approximations by construction - honest ones, and enough
|
|
29
|
+
* for a consumer that only needs head orientation.
|
|
30
|
+
*/
|
|
31
|
+
const facePoints = (skeleton) => {
|
|
32
|
+
const head = skeleton.bones.head;
|
|
33
|
+
const axis = sub(head.end, head.start);
|
|
34
|
+
const forward = fromPolar(head.worldAngle - 90, 1);
|
|
35
|
+
const centre = lerp(head.start, head.end, 0.55);
|
|
36
|
+
const size = Math.hypot(axis[0], axis[1]);
|
|
37
|
+
const at = (fwd, up, side) => add(add(centre, fromPolar(head.worldAngle, up * size)), fromPolar(head.worldAngle - 90, (fwd + side) * size));
|
|
38
|
+
return {
|
|
39
|
+
nose: add(centre, fromPolar(head.worldAngle - 90, 0.42 * size)),
|
|
40
|
+
left_eye: at(0.3, 0.12, 0.08),
|
|
41
|
+
left_eye_inner: at(0.32, 0.12, 0.03),
|
|
42
|
+
left_eye_outer: at(0.26, 0.12, 0.14),
|
|
43
|
+
right_eye: at(0.3, 0.12, -0.08),
|
|
44
|
+
right_eye_inner: at(0.32, 0.12, -0.03),
|
|
45
|
+
right_eye_outer: at(0.26, 0.12, -0.14),
|
|
46
|
+
left_ear: at(-0.1, 0.06, 0.22),
|
|
47
|
+
right_ear: at(-0.1, 0.06, -0.22),
|
|
48
|
+
mouth_left: at(0.3, -0.18, 0.09),
|
|
49
|
+
mouth_right: at(0.3, -0.18, -0.09),
|
|
50
|
+
_forward: forward,
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
const heel = (skeleton, side) => {
|
|
54
|
+
const foot = skeleton.bones[side === 'L' ? 'footL' : 'footR'];
|
|
55
|
+
return add(foot.start, fromPolar(foot.worldAngle + 180, foot.length * 0.35));
|
|
56
|
+
};
|
|
57
|
+
const hand = (skeleton, side, spread) => {
|
|
58
|
+
const h = skeleton.bones[side === 'L' ? 'handL' : 'handR'];
|
|
59
|
+
return add(h.end, fromPolar(h.worldAngle + spread, h.length * 0.3));
|
|
60
|
+
};
|
|
61
|
+
const pointFor = (name, skeleton, face) => {
|
|
62
|
+
const l = skeleton.landmarks;
|
|
63
|
+
const table = {
|
|
64
|
+
left_shoulder: l.shoulderL,
|
|
65
|
+
right_shoulder: l.shoulderR,
|
|
66
|
+
left_elbow: l.elbowL,
|
|
67
|
+
right_elbow: l.elbowR,
|
|
68
|
+
left_wrist: l.wristL,
|
|
69
|
+
right_wrist: l.wristR,
|
|
70
|
+
left_index: l.handTipL,
|
|
71
|
+
right_index: l.handTipR,
|
|
72
|
+
left_pinky: hand(skeleton, 'L', 55),
|
|
73
|
+
right_pinky: hand(skeleton, 'R', 55),
|
|
74
|
+
left_thumb: hand(skeleton, 'L', -55),
|
|
75
|
+
right_thumb: hand(skeleton, 'R', -55),
|
|
76
|
+
left_hip: l.hipJointL,
|
|
77
|
+
right_hip: l.hipJointR,
|
|
78
|
+
left_knee: l.kneeL,
|
|
79
|
+
right_knee: l.kneeR,
|
|
80
|
+
left_ankle: l.ankleL,
|
|
81
|
+
right_ankle: l.ankleR,
|
|
82
|
+
left_foot_index: l.toeL,
|
|
83
|
+
right_foot_index: l.toeR,
|
|
84
|
+
left_heel: heel(skeleton, 'L'),
|
|
85
|
+
right_heel: heel(skeleton, 'R'),
|
|
86
|
+
};
|
|
87
|
+
const point = table[name] ?? face[name];
|
|
88
|
+
if (point === undefined)
|
|
89
|
+
throw new Error(`No geometry for keypoint "${name}"`);
|
|
90
|
+
return point;
|
|
91
|
+
};
|
|
92
|
+
export const toKeypoints = (skeleton, format, options = {}) => {
|
|
93
|
+
const names = format === 'coco17' ? COCO_17 : MEDIAPIPE_33;
|
|
94
|
+
const face = facePoints(skeleton);
|
|
95
|
+
const raw = names.map((name) => pointFor(name, skeleton, face));
|
|
96
|
+
const normalize = options.normalize === true;
|
|
97
|
+
const xs = raw.map((p) => p[0]);
|
|
98
|
+
const ys = raw.map((p) => p[1]);
|
|
99
|
+
const minX = Math.min(...xs);
|
|
100
|
+
const minY = Math.min(...ys);
|
|
101
|
+
const span = Math.max(Math.max(...xs) - minX, Math.max(...ys) - minY, 1e-6);
|
|
102
|
+
return {
|
|
103
|
+
format,
|
|
104
|
+
space: normalize ? 'normalized' : 'stature',
|
|
105
|
+
edges: format === 'coco17' ? COCO_EDGES : MEDIAPIPE_EDGES,
|
|
106
|
+
keypoints: names.map((name, index) => {
|
|
107
|
+
const p = raw[index];
|
|
108
|
+
return {
|
|
109
|
+
index,
|
|
110
|
+
name,
|
|
111
|
+
// Image space is y-down, so normalising also flips the axis.
|
|
112
|
+
x: normalize ? (p[0] - minX) / span : p[0],
|
|
113
|
+
y: normalize ? 1 - (p[1] - minY) / span : p[1],
|
|
114
|
+
};
|
|
115
|
+
}),
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=keypoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keypoints.js","sourceRoot":"","sources":["../../src/standards/keypoints.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# Authoring poses
|
|
2
|
+
|
|
3
|
+
A pose is a YAML file. Nothing is drawn imperatively: you describe a body, and asanakit
|
|
4
|
+
solves and renders it. This guide is written to be followed by a person or by a model.
|
|
5
|
+
|
|
6
|
+
## The coordinate system
|
|
7
|
+
|
|
8
|
+
Angles are **degrees**, measured **counter-clockwise from the +x axis**:
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
90 (up)
|
|
12
|
+
|
|
|
13
|
+
180 -------+------- 0 (right, and the way a side-view figure faces)
|
|
14
|
+
|
|
|
15
|
+
-90 (down)
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
The figure is one unit tall (sole to crown). The ground is `y = 0`.
|
|
19
|
+
|
|
20
|
+
## The two ways to angle a bone
|
|
21
|
+
|
|
22
|
+
| Block | Meaning | Use it for |
|
|
23
|
+
|---|---|---|
|
|
24
|
+
| `joints:` | rotation **relative to the parent bone**, from anatomical neutral (standing, arms down) | small deviations from standing |
|
|
25
|
+
| `world:` | the bone's **absolute direction** on the page | everything else |
|
|
26
|
+
|
|
27
|
+
`world` is what you want almost always. "The front thigh points down and back at -125°"
|
|
28
|
+
is something you can reason about and check by eye. Chaining five relative rotations is not.
|
|
29
|
+
|
|
30
|
+
A bone listed in `world` ignores its rest angle and its parent's rotation. Its **children
|
|
31
|
+
still hang off it**, so pinning the thigh and then flexing the knee with `joints: {shinL: 40}`
|
|
32
|
+
works exactly as you would expect.
|
|
33
|
+
|
|
34
|
+
> **The single most common mistake:** you tilt the pelvis with `root.rotation` and forget
|
|
35
|
+
> that every unpinned limb rotates with it. Tilt the pelvis to fold forward, and the legs
|
|
36
|
+
> swing up into the air. **If you set `root.rotation`, pin the legs in `world`.**
|
|
37
|
+
|
|
38
|
+
## Bones you can angle
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
pelvis spine neck head
|
|
42
|
+
clavicleL/R upperArmL/R forearmL/R handL/R
|
|
43
|
+
hipL/R thighL/R shinL/R footL/R
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
`root.rotation` aims the pelvis (90 = upright). Rotating a bone rotates everything below it.
|
|
47
|
+
|
|
48
|
+
Positive `shinL` **flexes the knee** (heel toward the buttock). Positive `forearmL` flexes
|
|
49
|
+
the elbow. Neither joint bends the other way, and the validator will tell you so.
|
|
50
|
+
|
|
51
|
+
## Landmarks you can point at
|
|
52
|
+
|
|
53
|
+
Used by `contact`, annotations and props:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
hipCenter waist chest neckBase headCenter headTop
|
|
57
|
+
shoulderL/R elbowL/R wristL/R handTipL/R
|
|
58
|
+
hipJointL/R kneeL/R ankleL/R toeL/R
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Views
|
|
62
|
+
|
|
63
|
+
| view | what it means |
|
|
64
|
+
|---|---|
|
|
65
|
+
| `front` | the figure faces you. Left and right limbs **mirror**: `upperArmL: 90` and `upperArmR: 90` raise both arms outward. |
|
|
66
|
+
| `side` | profile, facing **+x** (to the right). Limbs **do not mirror** - both arms swing the same way, because you see both from the same side. The left/right offset becomes depth and nearly vanishes. |
|
|
67
|
+
| `back` | like `front`. |
|
|
68
|
+
| `three-quarter` | between the two. |
|
|
69
|
+
|
|
70
|
+
Set `flip: true` to face the other way. Set `mirror: true` to swap which limb does what
|
|
71
|
+
(the other side of an asymmetric asana). Sequences apply both to render "second side".
|
|
72
|
+
|
|
73
|
+
## Contact points: the thing that keeps you honest
|
|
74
|
+
|
|
75
|
+
```yaml
|
|
76
|
+
contact: [toeL, toeR, handTipL, handTipR]
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
This is the pose's claim about which parts of the body are on the floor. `asanakit lint`
|
|
80
|
+
checks it against the solved figure and fails if a hand that was supposed to reach the mat
|
|
81
|
+
is hovering 9 cm above it. **Every pose must declare its contact points.**
|
|
82
|
+
|
|
83
|
+
## The loop
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
npx tsx src/cli/index.ts lint my-pose # anatomy + contact check
|
|
87
|
+
npx tsx src/cli/index.ts render my-pose -o out/p.png -w 500 -h 500 --scale 500
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Then **look at the PNG**. Lint proves the pose is physically possible; only your eye proves
|
|
91
|
+
it is the right posture. Iterate until both agree.
|
|
92
|
+
|
|
93
|
+
## A complete example
|
|
94
|
+
|
|
95
|
+
```yaml
|
|
96
|
+
asanakit: 1
|
|
97
|
+
id: adho-mukha-svanasana
|
|
98
|
+
name: Downward-Facing Dog
|
|
99
|
+
sanskrit: Adho Mukha Śvānāsana
|
|
100
|
+
discipline: yoga
|
|
101
|
+
family: inversion
|
|
102
|
+
difficulty: 2
|
|
103
|
+
description: An inverted V. Hips lift back and up, heels press down.
|
|
104
|
+
tags: [ashtanga, surya-namaskara-a, inversion]
|
|
105
|
+
breath: exhale
|
|
106
|
+
drishti: nabi-chakra
|
|
107
|
+
cues:
|
|
108
|
+
- Lift the sit bones, lengthen the spine
|
|
109
|
+
contact: [toeL, toeR, handTipL, handTipR]
|
|
110
|
+
figure:
|
|
111
|
+
view: side
|
|
112
|
+
grounded: true
|
|
113
|
+
root:
|
|
114
|
+
rotation: -48 # pelvis aims down-and-forward: the torso ramps to the hands
|
|
115
|
+
world:
|
|
116
|
+
thighL: -125 # legs ramp down-and-back to the feet
|
|
117
|
+
thighR: -125
|
|
118
|
+
shinL: -125 # straight leg: shin collinear with thigh
|
|
119
|
+
shinR: -125
|
|
120
|
+
footL: -20
|
|
121
|
+
footR: -20
|
|
122
|
+
spine: -48
|
|
123
|
+
neck: -48
|
|
124
|
+
head: -48 # head hangs between the arms, in line with the spine
|
|
125
|
+
upperArmL: -50 # arms continue the line of the spine to the floor
|
|
126
|
+
upperArmR: -50
|
|
127
|
+
forearmL: -50
|
|
128
|
+
forearmR: -50
|
|
129
|
+
handL: -8 # palm flat
|
|
130
|
+
handR: -8
|
|
131
|
+
props:
|
|
132
|
+
- type: mat
|
|
133
|
+
muscles:
|
|
134
|
+
engaged: [deltoid, triceps, quadriceps, serratus]
|
|
135
|
+
stretched: [hamstrings, gastrocnemius, latissimus]
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Reference
|
|
139
|
+
|
|
140
|
+
- `asanakit vocab` prints every joint, landmark, muscle, style and view name.
|
|
141
|
+
- `asanakit schema` prints the JSON Schema for the format.
|
|
142
|
+
- Props: `mat`, `ground`, `block`, `strap`, `wall`, `surfboard`, `wave`.
|
|
143
|
+
- Annotations: `angle`, `line`, `plumb`, `arrow`, `label`, `point`.
|
|
144
|
+
- Muscles for `engaged`/`stretched`: run `asanakit vocab`.
|
package/package.json
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@franzenzenhofer/asanakit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Programmatic stick-figure and anatomical infographic engine for yoga and surf postures. Declarative pose format, deterministic SVG/PNG output, CLI-first, AI-driveable.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"yoga",
|
|
7
|
+
"surf",
|
|
8
|
+
"asana",
|
|
9
|
+
"stick-figure",
|
|
10
|
+
"anatomy",
|
|
11
|
+
"infographic",
|
|
12
|
+
"svg",
|
|
13
|
+
"png",
|
|
14
|
+
"pose",
|
|
15
|
+
"skeleton",
|
|
16
|
+
"kinematics",
|
|
17
|
+
"cli",
|
|
18
|
+
"typescript"
|
|
19
|
+
],
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"author": "Franz Enzenhofer",
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/franzenzenhofer/asanakit.git"
|
|
25
|
+
},
|
|
26
|
+
"homepage": "https://github.com/franzenzenhofer/asanakit#readme",
|
|
27
|
+
"bugs": {
|
|
28
|
+
"url": "https://github.com/franzenzenhofer/asanakit/issues"
|
|
29
|
+
},
|
|
30
|
+
"type": "module",
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=20"
|
|
33
|
+
},
|
|
34
|
+
"bin": {
|
|
35
|
+
"asanakit": "dist/cli/index.js"
|
|
36
|
+
},
|
|
37
|
+
"main": "./dist/index.js",
|
|
38
|
+
"types": "./dist/index.d.ts",
|
|
39
|
+
"exports": {
|
|
40
|
+
".": {
|
|
41
|
+
"types": "./dist/index.d.ts",
|
|
42
|
+
"default": "./dist/index.js"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"files": [
|
|
46
|
+
"dist",
|
|
47
|
+
"poses",
|
|
48
|
+
"docs/AUTHORING.md",
|
|
49
|
+
"README.md",
|
|
50
|
+
"LICENSE"
|
|
51
|
+
],
|
|
52
|
+
"scripts": {
|
|
53
|
+
"build": "tsc -p tsconfig.build.json && chmod +x dist/cli/index.js",
|
|
54
|
+
"dev": "tsx src/cli/index.ts",
|
|
55
|
+
"typecheck": "tsc --noEmit",
|
|
56
|
+
"lint": "eslint .",
|
|
57
|
+
"lint:fix": "eslint . --fix",
|
|
58
|
+
"test": "vitest run",
|
|
59
|
+
"test:watch": "vitest",
|
|
60
|
+
"coverage": "vitest run --coverage",
|
|
61
|
+
"gallery": "tsx scripts/gallery.ts",
|
|
62
|
+
"verify": "npm run typecheck && npm run lint && npm run test && npm run build",
|
|
63
|
+
"prepublishOnly": "npm run verify"
|
|
64
|
+
},
|
|
65
|
+
"dependencies": {
|
|
66
|
+
"@resvg/resvg-js": "^2.6.2",
|
|
67
|
+
"commander": "^14.0.1",
|
|
68
|
+
"culori": "^4.0.2",
|
|
69
|
+
"d3-path": "^3.1.0",
|
|
70
|
+
"d3-shape": "^3.2.0",
|
|
71
|
+
"gl-matrix": "^3.4.4",
|
|
72
|
+
"svgo": "^4.0.2",
|
|
73
|
+
"xmlbuilder2": "^4.0.3",
|
|
74
|
+
"yaml": "^2.8.1",
|
|
75
|
+
"zod": "^4.1.12"
|
|
76
|
+
},
|
|
77
|
+
"devDependencies": {
|
|
78
|
+
"@eslint/js": "^9.38.0",
|
|
79
|
+
"@types/d3-path": "^3.1.1",
|
|
80
|
+
"@types/d3-shape": "^3.1.8",
|
|
81
|
+
"@types/node": "^24.9.2",
|
|
82
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
83
|
+
"eslint": "^9.38.0",
|
|
84
|
+
"tsx": "^4.20.6",
|
|
85
|
+
"typescript": "^5.9.3",
|
|
86
|
+
"typescript-eslint": "^8.46.2",
|
|
87
|
+
"vitest": "^3.2.4"
|
|
88
|
+
},
|
|
89
|
+
"allowScripts": {
|
|
90
|
+
"sharp@0.34.5": true,
|
|
91
|
+
"esbuild@0.28.1": true,
|
|
92
|
+
"@resvg/resvg-js@2.6.2": true
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
asanakit: 1
|
|
2
|
+
id: bottom-turn
|
|
3
|
+
name: Bottom Turn
|
|
4
|
+
english: Bottom Turn
|
|
5
|
+
discipline: surf
|
|
6
|
+
family: turning
|
|
7
|
+
difficulty: 4
|
|
8
|
+
description: The turn at the base of the wave that sets up everything after it. The surfer compresses deep, drives the weight through the heels and the rail, and reaches the inside arm toward the wave face while the eyes go back up to the lip.
|
|
9
|
+
tags: [surf, turning, rail, power]
|
|
10
|
+
cues:
|
|
11
|
+
- Compress low and drive from the heels
|
|
12
|
+
- Look where you want to go - back up at the lip
|
|
13
|
+
contact: [toeL, toeR]
|
|
14
|
+
figure:
|
|
15
|
+
view: side
|
|
16
|
+
grounded: true
|
|
17
|
+
root:
|
|
18
|
+
rotation: 55
|
|
19
|
+
world:
|
|
20
|
+
spine: 45
|
|
21
|
+
neck: 68
|
|
22
|
+
head: 82
|
|
23
|
+
thighL: -25
|
|
24
|
+
shinL: -100
|
|
25
|
+
footL: -15
|
|
26
|
+
thighR: -60
|
|
27
|
+
shinR: -145
|
|
28
|
+
footR: -10
|
|
29
|
+
upperArmL: -5
|
|
30
|
+
forearmL: 15
|
|
31
|
+
handL: 20
|
|
32
|
+
upperArmR: -150
|
|
33
|
+
forearmR: -140
|
|
34
|
+
handR: -135
|
|
35
|
+
props:
|
|
36
|
+
- type: wave
|
|
37
|
+
amplitude: 0.45
|
|
38
|
+
length: 3.4
|
|
39
|
+
y: -0.2
|
|
40
|
+
- type: surfboard
|
|
41
|
+
under: [ankleL, ankleR]
|
|
42
|
+
rotation: 10
|
|
43
|
+
length: 1.15
|
|
44
|
+
offset: [0, -0.1]
|
|
45
|
+
muscles:
|
|
46
|
+
engaged: [quadriceps, gluteus, obliques, erectorSpinae, adductors]
|
|
47
|
+
stretched: [hipFlexors, latissimus]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
asanakit: 1
|
|
2
|
+
id: cutback
|
|
3
|
+
name: Cutback
|
|
4
|
+
english: Cutback
|
|
5
|
+
discipline: surf
|
|
6
|
+
family: turning
|
|
7
|
+
difficulty: 4
|
|
8
|
+
description: The turn that takes the surfer back to the power source. Out on the shoulder the board is swung around by the torso - the chest and both arms lead the rotation back toward the breaking part of the wave, the weight settles over the tail and the front leg extends.
|
|
9
|
+
tags: [surf, turning, rotation, flow]
|
|
10
|
+
cues:
|
|
11
|
+
- Turn your chest and arms first, the board follows
|
|
12
|
+
- Weight back over the tail to pivot, not the nose
|
|
13
|
+
contact: [toeL, toeR]
|
|
14
|
+
figure:
|
|
15
|
+
view: side
|
|
16
|
+
grounded: true
|
|
17
|
+
root:
|
|
18
|
+
rotation: 82
|
|
19
|
+
world:
|
|
20
|
+
spine: 100
|
|
21
|
+
neck: 118
|
|
22
|
+
head: 145
|
|
23
|
+
thighL: -45
|
|
24
|
+
shinL: -105
|
|
25
|
+
footL: -20
|
|
26
|
+
thighR: -85
|
|
27
|
+
shinR: -135
|
|
28
|
+
footR: -15
|
|
29
|
+
upperArmL: -178
|
|
30
|
+
forearmL: -172
|
|
31
|
+
handL: -170
|
|
32
|
+
upperArmR: 132
|
|
33
|
+
forearmR: 158
|
|
34
|
+
handR: 162
|
|
35
|
+
props:
|
|
36
|
+
- type: wave
|
|
37
|
+
amplitude: 0.42
|
|
38
|
+
length: 3.4
|
|
39
|
+
y: -0.22
|
|
40
|
+
- type: surfboard
|
|
41
|
+
under: [ankleL, ankleR]
|
|
42
|
+
rotation: 4
|
|
43
|
+
length: 1.15
|
|
44
|
+
offset: [0, -0.1]
|
|
45
|
+
muscles:
|
|
46
|
+
engaged: [obliques, erectorSpinae, gluteus, quadriceps, deltoid]
|
|
47
|
+
stretched: [pectoralis, hamstrings]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
asanakit: 1
|
|
2
|
+
id: duck-dive
|
|
3
|
+
name: Duck Dive
|
|
4
|
+
english: Duck Dive
|
|
5
|
+
discipline: surf
|
|
6
|
+
family: prone
|
|
7
|
+
difficulty: 3
|
|
8
|
+
description: How a shortboarder gets under a broken wave. Both arms straighten and drive the nose deep under the water, the head follows it down, and one knee then punches into the tail to sink the whole board while the wave passes overhead.
|
|
9
|
+
tags: [surf, prone, paddling, defensive, shortboard]
|
|
10
|
+
cues:
|
|
11
|
+
- Straight arms - push the nose down, do not pull it toward you
|
|
12
|
+
- Knee into the tail only once the nose is already under
|
|
13
|
+
contact: [handTipL, handTipR]
|
|
14
|
+
figure:
|
|
15
|
+
view: side
|
|
16
|
+
grounded: true
|
|
17
|
+
root:
|
|
18
|
+
rotation: -30
|
|
19
|
+
world:
|
|
20
|
+
spine: -38
|
|
21
|
+
neck: -34
|
|
22
|
+
head: -30
|
|
23
|
+
upperArmL: -56
|
|
24
|
+
forearmL: -56
|
|
25
|
+
handL: -56
|
|
26
|
+
upperArmR: -50
|
|
27
|
+
forearmR: -50
|
|
28
|
+
handR: -50
|
|
29
|
+
thighL: 168
|
|
30
|
+
shinL: 142
|
|
31
|
+
footL: 150
|
|
32
|
+
thighR: -175
|
|
33
|
+
shinR: 95
|
|
34
|
+
footR: 70
|
|
35
|
+
props:
|
|
36
|
+
- type: wave
|
|
37
|
+
amplitude: 0.5
|
|
38
|
+
length: 3.2
|
|
39
|
+
y: 0.55
|
|
40
|
+
facing: left
|
|
41
|
+
- type: surfboard
|
|
42
|
+
at: [0.023, 0.108]
|
|
43
|
+
rotation: -32
|
|
44
|
+
length: 1.35
|
|
45
|
+
muscles:
|
|
46
|
+
engaged: [triceps, deltoid, latissimus, rectusAbdominis, hipFlexors]
|
|
47
|
+
stretched: [pectoralis, quadriceps]
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
asanakit: 1
|
|
2
|
+
id: noseride
|
|
3
|
+
name: Noseride
|
|
4
|
+
english: Noseride
|
|
5
|
+
discipline: surf
|
|
6
|
+
family: trim
|
|
7
|
+
difficulty: 4
|
|
8
|
+
description: The longboard reward. With the tail held in the wave the surfer walks to the front of the board and stands tall and still on the nose, legs long, arms loose, doing as little as possible while the board trims along the face.
|
|
9
|
+
tags: [surf, longboard, trim, nose, style]
|
|
10
|
+
cues:
|
|
11
|
+
- Stand tall and quiet - do nothing and let the board trim
|
|
12
|
+
- Stay behind the tail's hold, never lunge at the nose
|
|
13
|
+
contact: [toeL, toeR]
|
|
14
|
+
figure:
|
|
15
|
+
view: side
|
|
16
|
+
grounded: true
|
|
17
|
+
root:
|
|
18
|
+
rotation: 90
|
|
19
|
+
world:
|
|
20
|
+
spine: 95
|
|
21
|
+
neck: 90
|
|
22
|
+
head: 88
|
|
23
|
+
thighL: -80
|
|
24
|
+
shinL: -95
|
|
25
|
+
footL: -15
|
|
26
|
+
thighR: -100
|
|
27
|
+
shinR: -112
|
|
28
|
+
footR: -12
|
|
29
|
+
upperArmL: -60
|
|
30
|
+
forearmL: -50
|
|
31
|
+
handL: -45
|
|
32
|
+
upperArmR: -112
|
|
33
|
+
forearmR: -102
|
|
34
|
+
handR: -100
|
|
35
|
+
props:
|
|
36
|
+
- type: wave
|
|
37
|
+
amplitude: 0.3
|
|
38
|
+
length: 3.6
|
|
39
|
+
y: -0.18
|
|
40
|
+
breaking: false
|
|
41
|
+
- type: surfboard
|
|
42
|
+
under: [ankleL, ankleR]
|
|
43
|
+
rotation: -2
|
|
44
|
+
length: 1.7
|
|
45
|
+
offset: [-0.5, -0.1]
|
|
46
|
+
muscles:
|
|
47
|
+
engaged: [gastrocnemius, tibialisAnterior, quadriceps, erectorSpinae]
|
|
48
|
+
stretched: [hamstrings, pectoralis]
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
asanakit: 1
|
|
2
|
+
id: paddling
|
|
3
|
+
name: Paddling
|
|
4
|
+
english: Paddling
|
|
5
|
+
discipline: surf
|
|
6
|
+
family: prone
|
|
7
|
+
difficulty: 1
|
|
8
|
+
description: Where ninety percent of surfing actually happens. The surfer lies prone and centred on the deck, chest lifted off the board, legs together over the tail, and pulls through the water one long arm at a time while the other arm recovers.
|
|
9
|
+
tags: [surf, prone, paddling, fundamental, endurance]
|
|
10
|
+
cues:
|
|
11
|
+
- Chest up, back long - do not lie flat
|
|
12
|
+
- Reach past your head and pull the water all the way to the hip
|
|
13
|
+
contact: [hipCenter, kneeL, ankleL, ankleR]
|
|
14
|
+
figure:
|
|
15
|
+
view: side
|
|
16
|
+
grounded: true
|
|
17
|
+
root:
|
|
18
|
+
rotation: 0
|
|
19
|
+
world:
|
|
20
|
+
spine: 34
|
|
21
|
+
neck: 44
|
|
22
|
+
head: 28
|
|
23
|
+
upperArmL: 4
|
|
24
|
+
forearmL: -2
|
|
25
|
+
handL: -8
|
|
26
|
+
upperArmR: 145
|
|
27
|
+
forearmR: 196
|
|
28
|
+
handR: 200
|
|
29
|
+
thighL: 180
|
|
30
|
+
shinL: 180
|
|
31
|
+
footL: 180
|
|
32
|
+
thighR: 177
|
|
33
|
+
shinR: 176
|
|
34
|
+
footR: 176
|
|
35
|
+
props:
|
|
36
|
+
- type: wave
|
|
37
|
+
amplitude: 0.22
|
|
38
|
+
length: 3.6
|
|
39
|
+
y: -0.35
|
|
40
|
+
breaking: false
|
|
41
|
+
- type: surfboard
|
|
42
|
+
under: [hipCenter, chest]
|
|
43
|
+
rotation: 0
|
|
44
|
+
length: 1.5
|
|
45
|
+
offset: [-0.12, -0.13]
|
|
46
|
+
muscles:
|
|
47
|
+
engaged: [latissimus, deltoid, trapezius, erectorSpinae, triceps]
|
|
48
|
+
stretched: [pectoralis, rectusAbdominis]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
asanakit: 1
|
|
2
|
+
id: pop-up
|
|
3
|
+
name: Pop-Up
|
|
4
|
+
english: Pop-Up
|
|
5
|
+
discipline: surf
|
|
6
|
+
family: transition
|
|
7
|
+
difficulty: 3
|
|
8
|
+
description: The one explosive move that turns a paddler into a surfer. The hands press down on the deck under the chest, the hips lift, the back foot loads the tail and the front foot swings through under the body to land in the stance. It happens in one beat, without a knee ever touching the deck.
|
|
9
|
+
tags: [surf, transition, dynamic, fundamental]
|
|
10
|
+
cues:
|
|
11
|
+
- Press the deck away and lift the hips first
|
|
12
|
+
- Swing the front foot under your chest - never through a knee
|
|
13
|
+
contact: [handTipL, handTipR, toeR]
|
|
14
|
+
figure:
|
|
15
|
+
view: side
|
|
16
|
+
grounded: true
|
|
17
|
+
root:
|
|
18
|
+
rotation: 30
|
|
19
|
+
world:
|
|
20
|
+
spine: 26
|
|
21
|
+
neck: 18
|
|
22
|
+
head: 10
|
|
23
|
+
upperArmL: -80
|
|
24
|
+
forearmL: -85
|
|
25
|
+
handL: -88
|
|
26
|
+
upperArmR: -94
|
|
27
|
+
forearmR: -91
|
|
28
|
+
handR: -88
|
|
29
|
+
thighL: -2
|
|
30
|
+
shinL: -114
|
|
31
|
+
footL: 5
|
|
32
|
+
thighR: -145
|
|
33
|
+
shinR: -152
|
|
34
|
+
footR: -178
|
|
35
|
+
props:
|
|
36
|
+
- type: wave
|
|
37
|
+
amplitude: 0.35
|
|
38
|
+
length: 3.4
|
|
39
|
+
y: -0.3
|
|
40
|
+
- type: surfboard
|
|
41
|
+
under: [handTipL, toeR]
|
|
42
|
+
rotation: 0
|
|
43
|
+
length: 1.3
|
|
44
|
+
offset: [0, -0.09]
|
|
45
|
+
muscles:
|
|
46
|
+
engaged: [triceps, pectoralis, deltoid, rectusAbdominis, hipFlexors, serratus]
|
|
47
|
+
stretched: [hamstrings, gluteus]
|