@franzenzenhofer/asanakit 0.1.0 → 0.2.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.
Files changed (199) hide show
  1. package/README.md +78 -46
  2. package/dist/anatomy/muscles.d.ts +10 -7
  3. package/dist/anatomy/muscles.d.ts.map +1 -1
  4. package/dist/anatomy/muscles.js +21 -17
  5. package/dist/anatomy/muscles.js.map +1 -1
  6. package/dist/anatomy/validate.d.ts.map +1 -1
  7. package/dist/anatomy/validate.js +16 -10
  8. package/dist/anatomy/validate.js.map +1 -1
  9. package/dist/cli/commands/export.d.ts.map +1 -1
  10. package/dist/cli/commands/export.js +24 -2
  11. package/dist/cli/commands/export.js.map +1 -1
  12. package/dist/cli/commands/info.d.ts.map +1 -1
  13. package/dist/cli/commands/info.js +3 -1
  14. package/dist/cli/commands/info.js.map +1 -1
  15. package/dist/cli/commands/render.d.ts.map +1 -1
  16. package/dist/cli/commands/render.js +12 -3
  17. package/dist/cli/commands/render.js.map +1 -1
  18. package/dist/cli/commands/view.d.ts +3 -0
  19. package/dist/cli/commands/view.d.ts.map +1 -0
  20. package/dist/cli/commands/view.js +40 -0
  21. package/dist/cli/commands/view.js.map +1 -0
  22. package/dist/cli/index.js +7 -2
  23. package/dist/cli/index.js.map +1 -1
  24. package/dist/cli/resolve.d.ts +6 -0
  25. package/dist/cli/resolve.d.ts.map +1 -1
  26. package/dist/cli/resolve.js +40 -0
  27. package/dist/cli/resolve.js.map +1 -1
  28. package/dist/core/camera.d.ts +56 -0
  29. package/dist/core/camera.d.ts.map +1 -0
  30. package/dist/core/camera.js +20 -0
  31. package/dist/core/camera.js.map +1 -0
  32. package/dist/core/joints.d.ts +18 -0
  33. package/dist/core/joints.d.ts.map +1 -0
  34. package/dist/core/joints.js +27 -0
  35. package/dist/core/joints.js.map +1 -0
  36. package/dist/core/quat.d.ts +18 -0
  37. package/dist/core/quat.d.ts.map +1 -0
  38. package/dist/core/quat.js +25 -0
  39. package/dist/core/quat.js.map +1 -0
  40. package/dist/core/rig.d.ts +1 -6
  41. package/dist/core/rig.d.ts.map +1 -1
  42. package/dist/core/rig.js +45 -74
  43. package/dist/core/rig.js.map +1 -1
  44. package/dist/core/skeleton.d.ts +4 -13
  45. package/dist/core/skeleton.d.ts.map +1 -1
  46. package/dist/core/skeleton.js +39 -69
  47. package/dist/core/skeleton.js.map +1 -1
  48. package/dist/core/types.d.ts +62 -55
  49. package/dist/core/types.d.ts.map +1 -1
  50. package/dist/core/types.js.map +1 -1
  51. package/dist/core/vec3.d.ts +13 -0
  52. package/dist/core/vec3.d.ts.map +1 -0
  53. package/dist/core/vec3.js +26 -0
  54. package/dist/core/vec3.js.map +1 -0
  55. package/dist/export3d/gltf.d.ts +11 -0
  56. package/dist/export3d/gltf.d.ts.map +1 -0
  57. package/dist/export3d/gltf.js +28 -0
  58. package/dist/export3d/gltf.js.map +1 -0
  59. package/dist/export3d/index.d.ts +3 -0
  60. package/dist/export3d/index.d.ts.map +1 -0
  61. package/dist/export3d/index.js +3 -0
  62. package/dist/export3d/index.js.map +1 -0
  63. package/dist/export3d/shims.d.ts +7 -0
  64. package/dist/export3d/shims.d.ts.map +1 -0
  65. package/dist/export3d/shims.js +27 -0
  66. package/dist/export3d/shims.js.map +1 -0
  67. package/dist/index.d.ts +9 -0
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +9 -0
  70. package/dist/index.js.map +1 -1
  71. package/dist/library/index.js +4 -4
  72. package/dist/library/index.js.map +1 -1
  73. package/dist/model/pose.d.ts +11 -5
  74. package/dist/model/pose.d.ts.map +1 -1
  75. package/dist/model/pose.js +30 -16
  76. package/dist/model/pose.js.map +1 -1
  77. package/dist/model/schema.d.ts +69 -28
  78. package/dist/model/schema.d.ts.map +1 -1
  79. package/dist/model/schema.js +57 -17
  80. package/dist/model/schema.js.map +1 -1
  81. package/dist/physics/index.d.ts +3 -0
  82. package/dist/physics/index.d.ts.map +1 -0
  83. package/dist/physics/index.js +3 -0
  84. package/dist/physics/index.js.map +1 -0
  85. package/dist/physics/rapier-types.d.ts +60 -0
  86. package/dist/physics/rapier-types.d.ts.map +1 -0
  87. package/dist/physics/rapier-types.js +12 -0
  88. package/dist/physics/rapier-types.js.map +1 -0
  89. package/dist/physics/settle.d.ts +3 -0
  90. package/dist/physics/settle.d.ts.map +1 -0
  91. package/dist/physics/settle.js +108 -0
  92. package/dist/physics/settle.js.map +1 -0
  93. package/dist/physics/world.d.ts +4 -0
  94. package/dist/physics/world.d.ts.map +1 -0
  95. package/dist/physics/world.js +18 -0
  96. package/dist/physics/world.js.map +1 -0
  97. package/dist/render/anatomy.js +1 -1
  98. package/dist/render/anatomy.js.map +1 -1
  99. package/dist/render/annotations.d.ts +3 -2
  100. package/dist/render/annotations.d.ts.map +1 -1
  101. package/dist/render/annotations.js.map +1 -1
  102. package/dist/render/camera.d.ts +43 -0
  103. package/dist/render/camera.d.ts.map +1 -0
  104. package/dist/render/camera.js +57 -0
  105. package/dist/render/camera.js.map +1 -0
  106. package/dist/render/context.d.ts +5 -3
  107. package/dist/render/context.d.ts.map +1 -1
  108. package/dist/render/figure.d.ts +4 -2
  109. package/dist/render/figure.d.ts.map +1 -1
  110. package/dist/render/figure.js +29 -43
  111. package/dist/render/figure.js.map +1 -1
  112. package/dist/render/index.d.ts +1 -0
  113. package/dist/render/index.d.ts.map +1 -1
  114. package/dist/render/index.js +1 -0
  115. package/dist/render/index.js.map +1 -1
  116. package/dist/render/props.d.ts +4 -3
  117. package/dist/render/props.d.ts.map +1 -1
  118. package/dist/render/props.js.map +1 -1
  119. package/dist/render/scene.d.ts +7 -1
  120. package/dist/render/scene.d.ts.map +1 -1
  121. package/dist/render/scene.js +8 -1
  122. package/dist/render/scene.js.map +1 -1
  123. package/dist/render/sheet.d.ts +3 -0
  124. package/dist/render/sheet.d.ts.map +1 -1
  125. package/dist/render/sheet.js +2 -0
  126. package/dist/render/sheet.js.map +1 -1
  127. package/dist/solve.d.ts +14 -0
  128. package/dist/solve.d.ts.map +1 -0
  129. package/dist/solve.js +17 -0
  130. package/dist/solve.js.map +1 -0
  131. package/dist/standards/keypoints.d.ts +2 -10
  132. package/dist/standards/keypoints.d.ts.map +1 -1
  133. package/dist/standards/keypoints.js +33 -14
  134. package/dist/standards/keypoints.js.map +1 -1
  135. package/dist/three/index.d.ts +2 -0
  136. package/dist/three/index.d.ts.map +1 -0
  137. package/dist/three/index.js +2 -0
  138. package/dist/three/index.js.map +1 -0
  139. package/dist/three/scene.d.ts +22 -0
  140. package/dist/three/scene.d.ts.map +1 -0
  141. package/dist/three/scene.js +90 -0
  142. package/dist/three/scene.js.map +1 -0
  143. package/dist/viewer/html.d.ts +16 -0
  144. package/dist/viewer/html.d.ts.map +1 -0
  145. package/dist/viewer/html.js +59 -0
  146. package/dist/viewer/html.js.map +1 -0
  147. package/dist/viewer/index.d.ts +2 -0
  148. package/dist/viewer/index.d.ts.map +1 -0
  149. package/dist/viewer/index.js +2 -0
  150. package/dist/viewer/index.js.map +1 -0
  151. package/dist/viewer/viewer.bundle.js +4119 -0
  152. package/docs/AUTHORING.md +119 -58
  153. package/package.json +20 -5
  154. package/poses/surf/bottom-turn.pose.yaml +24 -24
  155. package/poses/surf/cutback.pose.yaml +24 -24
  156. package/poses/surf/duck-dive.pose.yaml +23 -23
  157. package/poses/surf/noseride.pose.yaml +23 -25
  158. package/poses/surf/paddling.pose.yaml +24 -24
  159. package/poses/surf/pop-up.pose.yaml +24 -24
  160. package/poses/surf/takeoff.pose.yaml +24 -24
  161. package/poses/surf/tube-stance.pose.yaml +24 -24
  162. package/poses/yoga/ashtanga/adho-mukha-svanasana.pose.yaml +22 -22
  163. package/poses/yoga/ashtanga/ardha-uttanasana.pose.yaml +22 -22
  164. package/poses/yoga/ashtanga/baddha-konasana.pose.yaml +21 -23
  165. package/poses/yoga/ashtanga/balasana.pose.yaml +23 -23
  166. package/poses/yoga/ashtanga/chaturanga-dandasana.pose.yaml +21 -21
  167. package/poses/yoga/ashtanga/dandasana.pose.yaml +21 -23
  168. package/poses/yoga/ashtanga/halasana.pose.yaml +23 -23
  169. package/poses/yoga/ashtanga/janu-sirsasana-a.pose.yaml +22 -22
  170. package/poses/yoga/ashtanga/karnapidasana.pose.yaml +23 -23
  171. package/poses/yoga/ashtanga/marichyasana-a.pose.yaml +22 -22
  172. package/poses/yoga/ashtanga/marichyasana-c.pose.yaml +21 -23
  173. package/poses/yoga/ashtanga/matsyasana.pose.yaml +23 -23
  174. package/poses/yoga/ashtanga/navasana.pose.yaml +22 -22
  175. package/poses/yoga/ashtanga/padahastasana.pose.yaml +22 -22
  176. package/poses/yoga/ashtanga/padangusthasana.pose.yaml +22 -22
  177. package/poses/yoga/ashtanga/padmasana.pose.yaml +22 -24
  178. package/poses/yoga/ashtanga/parsvottanasana.pose.yaml +22 -22
  179. package/poses/yoga/ashtanga/paschimottanasana.pose.yaml +22 -22
  180. package/poses/yoga/ashtanga/prasarita-padottanasana-a.pose.yaml +26 -26
  181. package/poses/yoga/ashtanga/prasarita-padottanasana-c.pose.yaml +26 -26
  182. package/poses/yoga/ashtanga/primary.seq.yaml +2 -4
  183. package/poses/yoga/ashtanga/purvottanasana.pose.yaml +22 -22
  184. package/poses/yoga/ashtanga/salamba-sarvangasana.pose.yaml +23 -23
  185. package/poses/yoga/ashtanga/samasthiti.pose.yaml +10 -10
  186. package/poses/yoga/ashtanga/savasana.pose.yaml +21 -21
  187. package/poses/yoga/ashtanga/setu-bandhasana.pose.yaml +22 -22
  188. package/poses/yoga/ashtanga/sirsasana.pose.yaml +23 -23
  189. package/poses/yoga/ashtanga/supta-padangusthasana.pose.yaml +22 -22
  190. package/poses/yoga/ashtanga/upavistha-konasana.pose.yaml +22 -22
  191. package/poses/yoga/ashtanga/urdhva-dhanurasana.pose.yaml +23 -23
  192. package/poses/yoga/ashtanga/urdhva-hastasana.pose.yaml +22 -22
  193. package/poses/yoga/ashtanga/urdhva-mukha-svanasana.pose.yaml +22 -22
  194. package/poses/yoga/ashtanga/utkatasana.pose.yaml +22 -22
  195. package/poses/yoga/ashtanga/uttanasana.pose.yaml +22 -22
  196. package/poses/yoga/ashtanga/utthita-parsvakonasana.pose.yaml +24 -24
  197. package/poses/yoga/ashtanga/utthita-trikonasana.pose.yaml +24 -24
  198. package/poses/yoga/ashtanga/virabhadrasana-a.pose.yaml +22 -22
  199. package/poses/yoga/ashtanga/virabhadrasana-b.pose.yaml +21 -23
package/README.md CHANGED
@@ -1,44 +1,66 @@
1
1
  # asanakit
2
2
 
3
- **Programmatic stick-figure and anatomical infographics for yoga and surf postures.**
3
+ **Programmatic stick-figure and body-posture visualization for yoga and surf, in 2D and 3D.**
4
4
 
5
- Describe a posture as data. Get a correct, deterministic, machine-readable illustration.
5
+ Describe a posture as data. Get a correct, deterministic, machine-readable illustration -
6
+ from any camera angle - plus an interactive 3D viewer, a GLB model, and physics-correct
7
+ positioning when you ask for it.
6
8
 
7
9
  ```bash
8
10
  npx @franzenzenhofer/asanakit render adho-mukha-svanasana -o downdog.svg --style anatomy --title
11
+ npx @franzenzenhofer/asanakit render virabhadrasana-b --camera three-quarter -o warrior.png
12
+ npx @franzenzenhofer/asanakit view utthita-trikonasana --open # orbit it in 3D, offline
13
+ npx @franzenzenhofer/asanakit gltf navasana -o boat.glb # a model any 3D viewer opens
9
14
  npx @franzenzenhofer/asanakit sheet --sequence ashtanga-primary -o primary-series.png --columns 6 --numbered
10
15
  ```
11
16
 
12
- asanakit is CLI-first, has no browser and no DOM, and renders the same bytes on every
13
- machine. It ships with the **full Ashtanga Primary Series** - 37 asanas, 60 steps - authored
14
- in its own pose format, plus 8 surf postures.
17
+ Every pose solves to a real **3D skeleton** (quaternion forward kinematics over a 20-bone
18
+ rig). The 2D pictures are camera projections of that solve - front, back, side, any azimuth
19
+ and elevation - rendered without a browser or a GPU, byte-identical on every machine. It
20
+ ships with the **full Ashtanga Primary Series** - 37 asanas, 60 steps - plus 8 surf postures.
15
21
 
16
22
  ![The Ashtanga Primary Series rendered by asanakit](examples/ashtanga-primary-series.png)
17
23
 
24
+ ## One pose, any viewpoint
25
+
26
+ The posture is the data; the viewpoint is just a parameter:
27
+
28
+ ![Warrior II orbited through five cameras](examples/orbit.png)
29
+
18
30
  ---
19
31
 
20
32
  ## Why it exists
21
33
 
22
34
  Every other option is a dead end. Traced SVG artwork is unposeable. Pose-estimation
23
35
  datasets give you keypoints scraped from photos, with no joint angles, no licence you can
24
- use, and no way to say "now bend that knee ten degrees more". 3D mannequin libraries are
25
- GPL, or need a GPU, or both.
36
+ use, and no way to say "now bend that knee ten degrees more". 3D mannequin tools are GPL,
37
+ or need a GPU, or both.
26
38
 
27
- asanakit takes the third path: a **20-bone kinematic rig** plus a **declarative pose format**.
28
- The posture is the data. The picture is a pure function of it.
39
+ asanakit takes the third path: a **20-bone 3D kinematic rig** plus a **declarative pose
40
+ format**. The posture is the data. Every picture - flat or interactive - is a pure
41
+ function of it.
29
42
 
30
43
  ## What you get
31
44
 
32
- - **A pose format** (`.pose.yaml`) with a published JSON Schema. Joint angles, absolute bone
33
- directions, props, annotations, muscle activation, teaching cues.
34
- - **Forward kinematics** over a 20-bone humanoid rig with anatomical proportions.
45
+ - **A pose format** (`.pose.yaml`) with a published JSON Schema. Anatomical joint rotations
46
+ (`flex` / `abduct` / `twist`), absolute bone directions (`azimuth` / `elevation`), a
47
+ default camera, props, annotations, muscle activation, teaching cues.
48
+ - **3D forward kinematics** over a 20-bone humanoid rig with anatomical proportions. The
49
+ rotation axes live in the rig as data, so left and right are exact mirrors by construction.
50
+ - **Any-angle 2D rendering.** Orthographic camera, depth-sorted painter's algorithm,
51
+ deterministic SVG/PNG with `data-bone` / `data-muscle` / `data-annotation` hooks. No GPU.
52
+ - **An interactive 3D viewer.** `asanakit view` writes ONE self-contained offline HTML file
53
+ (three.js inlined): drag to orbit, scroll to zoom, white background.
54
+ - **GLB / glTF export** via three.js - open the posture in any 3D viewer, rotatable and
55
+ zoomable, muscles colored.
56
+ - **Physics when necessary.** `--settle` (or `physics: settle` in the pose) drops the figure
57
+ onto the ground plane with [Rapier](https://rapier.rs) and lets it rest on its true
58
+ support. The authored pose is preserved exactly; only position and orientation change.
35
59
  - **An anatomical validator.** Knees and elbows that bend backwards are rejected. A pose
36
60
  declares which parts of the body touch the floor, and asanakit checks that they do.
37
61
  - **Seven styles**, all pure token data: `stick`, `anatomy`, `silhouette`, `blueprint`,
38
62
  `ink`, `poster`, `minimal`.
39
- - **SVG and PNG.** Deterministic, HTML-safe, and every element carries `data-bone`,
40
- `data-muscle`, `data-annotation` hooks so the output stays machine-readable.
41
- - **Keypoint export** to MediaPipe-33 and COCO-17 for interop with pose-estimation tooling.
63
+ - **Keypoint export** to MediaPipe-33 and COCO-17 - now with real z.
42
64
  - **Contact sheets and sequences** - render a whole practice in one command.
43
65
 
44
66
  ## The same posture, seven ways
@@ -48,8 +70,8 @@ The posture is the data. The picture is a pure function of it.
48
70
  ## Anatomy, not decoration
49
71
 
50
72
  Muscles are displaced in two anatomical planes - lateral (left/right) and sagittal
51
- (front/back) - so the chest is never drawn behind the back. Engaged muscles shade one way,
52
- stretched muscles the other.
73
+ (front/back) - and fade between them continuously as the camera orbits, so the chest is
74
+ never drawn behind the back. Engaged muscles shade one way, stretched muscles the other.
53
75
 
54
76
  ![Downward dog with muscle activation](examples/anatomy.png)
55
77
 
@@ -70,33 +92,31 @@ The npm registry refuses the bare name `asanakit` (too close to the unrelated
70
92
  ## The format
71
93
 
72
94
  ```yaml
73
- asanakit: 1
95
+ asanakit: 2
74
96
  id: utthita-trikonasana
75
97
  name: Extended Triangle
76
98
  sanskrit: Utthita Trikoṇāsana
77
99
  discipline: yoga
78
100
  family: standing
79
- breath: inhale
101
+ breath: exhale
80
102
  drishti: hastagrai
81
103
  cues:
82
- - Lengthen both sides of the waist
83
- - Stack the top shoulder over the bottom one
84
- contact: [toeL, toeR, handTipR]
104
+ - Reach sideways out of the waist before you tilt down
105
+ contact: [toeL, toeR, handTipL]
106
+ camera: front # the pose's default viewpoint
85
107
  figure:
86
- view: front
87
- world: # absolute bone directions, in degrees
88
- thighL: -55 # 0 = right, 90 = up, -90 = down
89
- thighR: -125
90
- spine: 35
91
- upperArmL: 35
92
- upperArmR: -145
108
+ root:
109
+ roll: -65 # the torso cartwheels over the front leg
110
+ world: # absolute directions: azimuth on the body's
111
+ thighL: { azimuth: 90, elevation: -45 } # compass (0 = forward, 90 = the figure's left),
112
+ thighR: { azimuth: -90, elevation: -45 } # elevation from horizontal (90 = up)
113
+ spine: { azimuth: 90, elevation: 25 }
114
+ upperArmL: { azimuth: 90, elevation: -80 }
115
+ upperArmR: { azimuth: -90, elevation: 80 }
116
+ joints: # or anatomical rotations relative to the parent
117
+ footL: { abduct: 10 } # flex / abduct / twist, in degrees
93
118
  props:
94
119
  - type: mat
95
- annotations:
96
- - type: angle
97
- at: kneeL
98
- from: hipJointL
99
- to: ankleL
100
120
  muscles:
101
121
  engaged: [obliques, quadriceps]
102
122
  stretched: [hamstrings, adductors]
@@ -109,45 +129,57 @@ Full guide: **[docs/AUTHORING.md](docs/AUTHORING.md)**.
109
129
  | Command | What it does |
110
130
  |---|---|
111
131
  | `asanakit render <pose> -o out.svg` | render one pose (`.svg` or `.png`) |
132
+ | `asanakit render <pose> --camera back` | ...from any preset or `"azimuth=30,elevation=15"` |
133
+ | `asanakit view <pose> --open` | interactive 3D viewer: one offline HTML file |
134
+ | `asanakit gltf <pose> -o pose.glb` | export a 3D model (`.glb` or `.gltf`) |
112
135
  | `asanakit sheet --all -o sheet.png` | contact sheet of many poses |
113
136
  | `asanakit sequence <id> -o dir/` | every pose of a sequence, in practice order |
114
137
  | `asanakit lint [poses...]` | check poses against the limits of a real body |
115
138
  | `asanakit list` | what is in the library |
116
- | `asanakit vocab` | every joint, landmark, muscle and style name |
139
+ | `asanakit vocab` | every joint, landmark, muscle, style and camera name |
117
140
  | `asanakit schema` | the JSON Schema for the pose format |
118
- | `asanakit keypoints <pose>` | export as MediaPipe-33 / COCO-17 keypoints |
119
- | `asanakit landmarks <pose>` | the solved skeleton, as JSON |
141
+ | `asanakit keypoints <pose>` | export as MediaPipe-33 / COCO-17 keypoints (x, y, z) |
142
+ | `asanakit landmarks <pose>` | the solved 3D skeleton, as JSON |
120
143
 
121
- Options: `--style`, `--width`, `--height`, `--title`, `--caption`, `--muscles`,
122
- `--background`, `--optimize`, `--scale`, `--lib <dir>`.
144
+ Options: `--camera`, `--settle`, `--style`, `--width`, `--height`, `--title`, `--caption`,
145
+ `--muscles`, `--background`, `--optimize`, `--scale`, `--lib <dir>`.
123
146
 
124
147
  ## Library API
125
148
 
126
149
  ```ts
127
- import { parsePose, renderSvg, renderPng, validatePose, solveSkeleton } from '@franzenzenhofer/asanakit';
150
+ import { parsePose, renderSvg, renderPng, validatePose, solvePose, exportGlb, buildViewerHtml } from '@franzenzenhofer/asanakit';
128
151
 
129
152
  const pose = parsePose(yamlSource, 'triangle.pose.yaml');
130
153
 
131
- const issues = validatePose(pose); // [] means anatomically sound
132
- const svg = renderSvg(pose, { style: 'anatomy', title: true });
154
+ const issues = validatePose(pose); // [] means anatomically sound
155
+ const svg = renderSvg(pose, { style: 'anatomy', camera: 'three-quarter', title: true });
133
156
  const png = renderPng(svg, { width: 1200 });
157
+
158
+ const skeleton = await solvePose(pose, { settle: true }); // physics lives behind this await
159
+ const glb = await exportGlb(skeleton);
160
+ const html = await buildViewerHtml(skeleton, { title: pose.name, camera: { azimuth: 30, elevation: 15, roll: 0 } });
134
161
  ```
135
162
 
163
+ Physics is lazy: importing the package never loads the Rapier WASM; only `solvePose`
164
+ with settling (or `import '@franzenzenhofer/asanakit/physics'`) does.
165
+
136
166
  ## Built for machines as well as people
137
167
 
138
168
  - Errors name the field and the file, and report every problem at once.
139
169
  - `asanakit schema` and `asanakit vocab` are the full contract - a model can discover the
140
170
  entire vocabulary without reading the source.
141
171
  - `asanakit lint` turns "does this look right" into a check that either passes or fails.
142
- - Rendering is deterministic, so output diffs are meaningful in review.
172
+ - Rendering is deterministic, so output diffs are meaningful in review. (Physics-settled
173
+ output is deterministic per machine: fixed timestep, two runs are identical.)
143
174
 
144
175
  ## Licence
145
176
 
146
177
  MIT.
147
178
 
148
- Dependencies are all permissive: `gl-matrix` (MIT), `d3-shape`/`d3-path` (ISC),
149
- `xmlbuilder2` (MIT), `commander` (MIT), `zod` (MIT), `yaml` (ISC), `svgo` (MIT),
150
- `@resvg/resvg-js` (MPL-2.0, used unmodified as a dependency).
179
+ Dependencies are all permissive: `three` (MIT), `@dimforge/rapier3d-compat` (Apache-2.0),
180
+ `gl-matrix` (MIT), `d3-shape`/`d3-path` (ISC), `xmlbuilder2` (MIT), `commander` (MIT),
181
+ `zod` (MIT), `yaml` (ISC), `svgo` (MIT), `@resvg/resvg-js` (MPL-2.0, used unmodified as a
182
+ dependency).
151
183
 
152
184
  The MediaPipe-33 and COCO-17 keypoint layouts restate the public layouts published by the
153
185
  Apache-2.0 licensed MediaPipe and tfjs-models projects.
@@ -1,4 +1,4 @@
1
- import type { BoneId, ViewId } from '../core/types.js';
1
+ import type { BoneId } from '../core/types.js';
2
2
  /**
3
3
  * Muscles are modelled as capsules laid over the bone they act on: a span
4
4
  * `t0..t1` along the bone, pushed off it, and drawn `width` thick.
@@ -44,12 +44,15 @@ export interface MuscleInstance {
44
44
  readonly offset: number;
45
45
  }
46
46
  /**
47
- * Resolve a muscle to the concrete bellies drawn for a given view.
47
+ * Resolve a muscle to the concrete bellies drawn for a camera azimuth.
48
48
  *
49
- * Face-on, a paired torso muscle is two bellies either side of the spine and its
50
- * front/back displacement is invisible. In profile it is one belly, placed in
51
- * front of or behind the spine. Limb muscles are always drawn on both limbs -
52
- * in profile the two simply overlap, which is exactly what you see.
49
+ * The two displacement planes fade continuously with the viewpoint: the
50
+ * left/right split is fully visible face-on (azimuth 0) and collapses in
51
+ * profile; the front/back displacement does the opposite, signed by which
52
+ * profile the camera stands on. Face-on, a paired torso muscle is two bellies
53
+ * either side of the spine; in profile it is one belly, in front of or behind
54
+ * it. Limb muscles are always drawn on both limbs - in profile the two simply
55
+ * overlap, which is exactly what you see.
53
56
  */
54
- export declare const muscleInstances: (muscle: MuscleDef, view: ViewId) => MuscleInstance[];
57
+ export declare const muscleInstances: (muscle: MuscleDef, azimuthDeg: number) => MuscleInstance[];
55
58
  //# sourceMappingURL=muscles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"muscles.d.ts","sourceRoot":"","sources":["../../src/anatomy/muscles.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,QAAQ,GAChB,QAAQ,GACR,OAAO,GACP,MAAM,GACN,MAAM,GACN,UAAU,GACV,UAAU,GACV,SAAS,GACT,MAAM,GACN,KAAK,GACL,OAAO,GACP,MAAM,GACN,MAAM,CAAC;AAOX,eAAO,MAAM,UAAU,wRAoBb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,CAsB/C,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,KAAK,IAAI,QAA4B,CAAC;AAEjF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAID;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAAI,QAAQ,SAAS,EAAE,MAAM,MAAM,KAAG,cAAc,EAqB/E,CAAC"}
1
+ {"version":3,"file":"muscles.d.ts","sourceRoot":"","sources":["../../src/anatomy/muscles.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,QAAQ,GAChB,QAAQ,GACR,OAAO,GACP,MAAM,GACN,MAAM,GACN,UAAU,GACV,UAAU,GACV,SAAS,GACT,MAAM,GACN,KAAK,GACL,OAAO,GACP,MAAM,GACN,MAAM,CAAC;AAOX,eAAO,MAAM,UAAU,wRAoBb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,CAsB/C,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,KAAK,IAAI,QAA4B,CAAC;AAEjF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAOD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,GAAI,QAAQ,SAAS,EAAE,YAAY,MAAM,KAAG,cAAc,EAqBrF,CAAC"}
@@ -1,4 +1,4 @@
1
- import { VIEWS } from '../core/rig.js';
1
+ import { degToRad } from '../core/angles.js';
2
2
  /** Torso bones run upwards, limb bones hang downwards, so their left-normals point opposite ways. */
3
3
  const TORSO_BONES = ['pelvis', 'spine', 'neck', 'head', 'clavicle', 'hip'];
4
4
  const anteriorSign = (bone) => (TORSO_BONES.includes(bone) ? -1 : 1);
@@ -46,31 +46,35 @@ export const MUSCLES = {
46
46
  };
47
47
  export const isMuscleId = (value) => value in MUSCLES;
48
48
  const isTorsoMuscle = (muscle) => TORSO_BONES.includes(muscle.bone);
49
+ /** A pair of bellies this close together reads as one; draw it once. */
50
+ const PAIR_MERGE = 0.01;
49
51
  /**
50
- * Resolve a muscle to the concrete bellies drawn for a given view.
52
+ * Resolve a muscle to the concrete bellies drawn for a camera azimuth.
51
53
  *
52
- * Face-on, a paired torso muscle is two bellies either side of the spine and its
53
- * front/back displacement is invisible. In profile it is one belly, placed in
54
- * front of or behind the spine. Limb muscles are always drawn on both limbs -
55
- * in profile the two simply overlap, which is exactly what you see.
54
+ * The two displacement planes fade continuously with the viewpoint: the
55
+ * left/right split is fully visible face-on (azimuth 0) and collapses in
56
+ * profile; the front/back displacement does the opposite, signed by which
57
+ * profile the camera stands on. Face-on, a paired torso muscle is two bellies
58
+ * either side of the spine; in profile it is one belly, in front of or behind
59
+ * it. Limb muscles are always drawn on both limbs - in profile the two simply
60
+ * overlap, which is exactly what you see.
56
61
  */
57
- export const muscleInstances = (muscle, view) => {
58
- const profile = VIEWS[view].lateralScale < 1;
59
- const sagittal = muscle.sagittal * anteriorSign(muscle.bone);
62
+ export const muscleInstances = (muscle, azimuthDeg) => {
63
+ const az = degToRad(azimuthDeg);
64
+ const lateralVis = Math.cos(az);
65
+ const sagittalVis = -Math.sin(az);
66
+ const sagittal = muscle.sagittal * anteriorSign(muscle.bone) * sagittalVis;
60
67
  if (isTorsoMuscle(muscle)) {
61
68
  const bone = muscle.bone;
62
- if (profile)
69
+ const split = muscle.lateral * lateralVis;
70
+ if (Math.abs(split) < PAIR_MERGE)
63
71
  return [{ bone, offset: sagittal }];
64
- if (muscle.lateral === 0)
65
- return [{ bone, offset: 0 }];
66
72
  return [
67
- { bone, offset: muscle.lateral },
68
- { bone, offset: -muscle.lateral },
73
+ { bone, offset: sagittal + split },
74
+ { bone, offset: sagittal - split },
69
75
  ];
70
76
  }
71
- // A limb muscle rides its own bone; only its front/back displacement is ever
72
- // visible, and face-on that displacement points at the viewer and collapses.
73
- const offset = profile ? sagittal : muscle.lateral;
77
+ const offset = muscle.lateral * lateralVis + sagittal;
74
78
  return [
75
79
  { bone: `${muscle.bone}L`, offset },
76
80
  { bone: `${muscle.bone}R`, offset },
@@ -1 +1 @@
1
- {"version":3,"file":"muscles.js","sourceRoot":"","sources":["../../src/anatomy/muscles.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"muscles.js","sourceRoot":"","sources":["../../src/anatomy/muscles.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/anatomy/validate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAsB,GAAG,EAAY,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,MAAM,SAAS,GACjB,qBAAqB,GACrB,kBAAkB,GAClB,sBAAsB,GACtB,mBAAmB,GACnB,cAAc,GACd,mBAAmB,GACnB,oBAAoB,CAAC;AAEzB,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC;AA6GD,yFAAyF;AACzF,eAAO,MAAM,YAAY,GAAI,MAAM,QAAQ,EAAE,MAAK,GAAiB,KAAG,KAAK,EAG1E,CAAC"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/anatomy/validate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAsB,GAAG,EAAY,MAAM,kBAAkB,CAAC;AAE1E,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,MAAM,SAAS,GACjB,qBAAqB,GACrB,kBAAkB,GAClB,sBAAsB,GACtB,mBAAmB,GACnB,cAAc,GACd,mBAAmB,GACnB,oBAAoB,CAAC;AAEzB,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC;AAmHD,yFAAyF;AACzF,eAAO,MAAM,YAAY,GAAI,MAAM,QAAQ,EAAE,MAAK,GAAiB,KAAG,KAAK,EAG1E,CAAC"}
@@ -1,6 +1,8 @@
1
- import { normalizeDeg } from '../core/angles.js';
1
+ import { radToDeg } from '../core/angles.js';
2
2
  import { DEFAULT_RIG } from '../core/rig.js';
3
- import { sideSign, solveSkeleton } from '../core/skeleton.js';
3
+ import { rotateVec3 } from '../core/quat.js';
4
+ import { solveSkeleton } from '../core/skeleton.js';
5
+ import { cross3, dot3, normalize3, sub3 } from '../core/vec3.js';
4
6
  import { resolveFigure } from '../model/index.js';
5
7
  const KNEE = { maxFlexion: 160, hyper: 'knee-hyperextension', over: 'knee-overflexion' };
6
8
  const ELBOW = { maxFlexion: 155, hyper: 'elbow-hyperextension', over: 'elbow-overflexion' };
@@ -15,9 +17,10 @@ const HYPEREXTENSION_SLACK = 8;
15
17
  const GROUND_TOLERANCE = 0.02;
16
18
  const CONTACT_TOLERANCE = 0.035;
17
19
  /**
18
- * Flexion of a bone away from its parent, in the joint's own frame. Right-side
19
- * bones mirror, so their world delta runs the other way - undo that, and both
20
- * elbows report flexion as a positive number.
20
+ * Signed flexion of a bone away from its parent: the angle between the two
21
+ * bone directions, signed by the child's own flexion axis (carried into world
22
+ * space by the parent's orientation). Positive is the way the joint actually
23
+ * bends - the axis in the rig says which way that is.
21
24
  */
22
25
  const flexion = (skeleton, hinge, rig) => {
23
26
  const child = skeleton.bones[hinge.child];
@@ -25,9 +28,12 @@ const flexion = (skeleton, hinge, rig) => {
25
28
  const def = rig.bones.find((b) => b.id === hinge.child);
26
29
  if (def === undefined)
27
30
  throw new Error(`Rig "${rig.name}" has no bone "${hinge.child}"`);
28
- // Read the joint the same way the solver writes it, or a mirrored limb reports
29
- // a perfectly good elbow as bending backwards.
30
- return normalizeDeg(child.worldAngle - parent.worldAngle) * sideSign(def, skeleton.view) * (def.flexSign ?? 1);
31
+ const parentDir = normalize3(sub3(parent.end, parent.start));
32
+ const childDir = normalize3(sub3(child.end, child.start));
33
+ const cos = Math.min(1, Math.max(-1, dot3(parentDir, childDir)));
34
+ const angle = radToDeg(Math.acos(cos));
35
+ const axis = rotateVec3(parent.orientation, def.flexAxis);
36
+ return dot3(cross3(parentDir, childDir), axis) >= 0 ? angle : -angle;
31
37
  };
32
38
  const jointIssues = (skeleton, rig) => {
33
39
  const issues = [];
@@ -57,14 +63,14 @@ const groundIssues = (skeleton) => {
57
63
  issues.push({
58
64
  code: 'below-ground',
59
65
  severity: 'error',
60
- message: `The figure sinks ${Math.abs(lowest).toFixed(2)} below the ground line. Raise it, or set "grounded: true".`,
66
+ message: `The figure sinks ${Math.abs(lowest).toFixed(2)} below the ground plane. Raise it, or set "grounded: true".`,
61
67
  });
62
68
  }
63
69
  else if (lowest > GROUND_TOLERANCE) {
64
70
  issues.push({
65
71
  code: 'no-ground-contact',
66
72
  severity: 'error',
67
- message: `The figure floats ${lowest.toFixed(2)} above the ground line and touches nothing.`,
73
+ message: `The figure floats ${lowest.toFixed(2)} above the ground plane and touches nothing.`,
68
74
  });
69
75
  }
70
76
  return issues;
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/anatomy/validate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/anatomy/validate.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,eAAO,MAAM,sBAAsB,GAAI,SAAS,OAAO,KAAG,IAiDzD,CAAC"}
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,eAAO,MAAM,sBAAsB,GAAI,SAAS,OAAO,KAAG,IAmEzD,CAAC"}
@@ -1,10 +1,33 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import { dirname, extname } from 'node:path';
1
3
  import { DEFAULT_RIG } from '../../core/rig.js';
2
4
  import { solveSkeleton } from '../../core/skeleton.js';
5
+ import { exportGlb, exportGltf } from '../../export3d/index.js';
3
6
  import { resolveFigure } from '../../model/index.js';
7
+ import { solvePose } from '../../solve.js';
4
8
  import { toKeypoints } from '../../standards/keypoints.js';
5
9
  import { resolvePose } from '../resolve.js';
6
10
  const FORMATS = ['mediapipe33', 'coco17'];
7
11
  export const registerExportCommands = (program) => {
12
+ program
13
+ .command('gltf <pose>')
14
+ .description('Export a pose as a 3D model any glTF viewer can orbit and zoom (.glb or .gltf)')
15
+ .requiredOption('-o, --out <file>', 'output path; the extension picks binary .glb or JSON .gltf')
16
+ .option('--settle', 'drop the figure onto the ground with the physics engine first')
17
+ .option('--lib <dir>', 'load poses from this directory')
18
+ .action(async (ref, options) => {
19
+ const pose = await resolvePose(ref, options.lib);
20
+ const skeleton = await solvePose(pose, options.settle === undefined ? {} : { settle: options.settle });
21
+ const sceneOptions = { engaged: pose.muscles.engaged, stretched: pose.muscles.stretched };
22
+ await mkdir(dirname(options.out), { recursive: true });
23
+ if (extname(options.out).toLowerCase() === '.gltf') {
24
+ await writeFile(options.out, await exportGltf(skeleton, sceneOptions));
25
+ }
26
+ else {
27
+ await writeFile(options.out, await exportGlb(skeleton, sceneOptions));
28
+ }
29
+ process.stdout.write(`${options.out}\n`);
30
+ });
8
31
  program
9
32
  .command('keypoints <pose>')
10
33
  .description('Export a pose as pose-estimation keypoints (MediaPipe 33 or COCO 17)')
@@ -31,13 +54,12 @@ export const registerExportCommands = (program) => {
31
54
  const skeleton = solveSkeleton(resolveFigure(pose.figure), DEFAULT_RIG);
32
55
  process.stdout.write(`${JSON.stringify({
33
56
  pose: pose.id,
34
- view: skeleton.view,
35
57
  height: skeleton.height,
36
58
  bounds: skeleton.bounds,
37
59
  landmarks: skeleton.landmarks,
38
60
  bones: Object.fromEntries(Object.entries(skeleton.bones).map(([id, b]) => [
39
61
  id,
40
- { start: b.start, end: b.end, angle: b.worldAngle, length: b.length },
62
+ { start: b.start, end: b.end, orientation: b.orientation, length: b.length },
41
63
  ])),
42
64
  }, null, 2)}\n`);
43
65
  });
@@ -1 +1 @@
1
- {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/info.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,eAAO,MAAM,oBAAoB,GAAI,SAAS,OAAO,KAAG,IAgGvD,CAAC"}
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/info.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,eAAO,MAAM,oBAAoB,GAAI,SAAS,OAAO,KAAG,IAiGvD,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { MUSCLES, MUSCLE_IDS } from '../../anatomy/muscles.js';
3
3
  import { validatePose } from '../../anatomy/validate.js';
4
+ import { CAMERA_PRESET_IDS } from '../../core/camera.js';
4
5
  import { BONE_IDS, LANDMARK_IDS } from '../../core/types.js';
5
6
  import { parsePose, poseJsonSchema, sequenceJsonSchema } from '../../model/index.js';
6
7
  import { STYLES, STYLE_IDS } from '../../render/index.js';
@@ -91,10 +92,11 @@ export const registerInfoCommands = (program) => {
91
92
  .action(() => {
92
93
  json({
93
94
  joints: BONE_IDS,
95
+ jointAxes: ['flex', 'abduct', 'twist'],
94
96
  landmarks: LANDMARK_IDS,
95
97
  muscles: MUSCLE_IDS.map((id) => ({ id, label: MUSCLES[id].label, region: MUSCLES[id].region })),
96
98
  styles: STYLE_IDS.map((id) => ({ id, label: STYLES[id].label })),
97
- views: ['front', 'back', 'side', 'three-quarter'],
99
+ cameras: CAMERA_PRESET_IDS,
98
100
  });
99
101
  });
100
102
  };
@@ -1 +1 @@
1
- {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/cli/commands/info.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/cli/commands/info.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/render.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwDzC,eAAO,MAAM,sBAAsB,GAAI,SAAS,OAAO,KAAG,IAsFzD,CAAC"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/render.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8DzC,eAAO,MAAM,sBAAsB,GAAI,SAAS,OAAO,KAAG,IA4FzD,CAAC"}