@oyna360/lobby-sdk 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.
Files changed (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +123 -0
  3. package/dist/avatar-accessories.d.ts +16 -0
  4. package/dist/avatar-accessories.d.ts.map +1 -0
  5. package/dist/avatar-accessories.js +214 -0
  6. package/dist/avatar-accessories.js.map +1 -0
  7. package/dist/avatar-asset-manager.d.ts +54 -0
  8. package/dist/avatar-asset-manager.d.ts.map +1 -0
  9. package/dist/avatar-asset-manager.js +215 -0
  10. package/dist/avatar-asset-manager.js.map +1 -0
  11. package/dist/avatar-clips.d.ts +17 -0
  12. package/dist/avatar-clips.d.ts.map +1 -0
  13. package/dist/avatar-clips.js +47 -0
  14. package/dist/avatar-clips.js.map +1 -0
  15. package/dist/avatar-config.d.ts +4 -0
  16. package/dist/avatar-config.d.ts.map +1 -0
  17. package/dist/avatar-config.js +9 -0
  18. package/dist/avatar-config.js.map +1 -0
  19. package/dist/avatar-factory.d.ts +64 -0
  20. package/dist/avatar-factory.d.ts.map +1 -0
  21. package/dist/avatar-factory.js +464 -0
  22. package/dist/avatar-factory.js.map +1 -0
  23. package/dist/avatar-instance.d.ts +31 -0
  24. package/dist/avatar-instance.d.ts.map +1 -0
  25. package/dist/avatar-instance.js +56 -0
  26. package/dist/avatar-instance.js.map +1 -0
  27. package/dist/avatar-material-pipeline.d.ts +34 -0
  28. package/dist/avatar-material-pipeline.d.ts.map +1 -0
  29. package/dist/avatar-material-pipeline.js +580 -0
  30. package/dist/avatar-material-pipeline.js.map +1 -0
  31. package/dist/avatar-rig-builder.d.ts +74 -0
  32. package/dist/avatar-rig-builder.d.ts.map +1 -0
  33. package/dist/avatar-rig-builder.js +347 -0
  34. package/dist/avatar-rig-builder.js.map +1 -0
  35. package/dist/draco.d.ts +7 -0
  36. package/dist/draco.d.ts.map +1 -0
  37. package/dist/draco.js +82 -0
  38. package/dist/draco.js.map +1 -0
  39. package/dist/humanoid-animator.d.ts +35 -0
  40. package/dist/humanoid-animator.d.ts.map +1 -0
  41. package/dist/humanoid-animator.js +191 -0
  42. package/dist/humanoid-animator.js.map +1 -0
  43. package/dist/humanoid-bone-names.d.ts +35 -0
  44. package/dist/humanoid-bone-names.d.ts.map +1 -0
  45. package/dist/humanoid-bone-names.js +126 -0
  46. package/dist/humanoid-bone-names.js.map +1 -0
  47. package/dist/humanoid-locomotion.d.ts +101 -0
  48. package/dist/humanoid-locomotion.d.ts.map +1 -0
  49. package/dist/humanoid-locomotion.js +300 -0
  50. package/dist/humanoid-locomotion.js.map +1 -0
  51. package/dist/humanoid-rig.d.ts +51 -0
  52. package/dist/humanoid-rig.d.ts.map +1 -0
  53. package/dist/humanoid-rig.js +304 -0
  54. package/dist/humanoid-rig.js.map +1 -0
  55. package/dist/index.d.ts +60 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +42 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/lobby-chat-ui.d.ts +3 -0
  60. package/dist/lobby-chat-ui.d.ts.map +1 -0
  61. package/dist/lobby-chat-ui.js +258 -0
  62. package/dist/lobby-chat-ui.js.map +1 -0
  63. package/dist/lobby-colliders.d.ts +10 -0
  64. package/dist/lobby-colliders.d.ts.map +1 -0
  65. package/dist/lobby-colliders.js +225 -0
  66. package/dist/lobby-colliders.js.map +1 -0
  67. package/dist/lobby-connection-ui.d.ts +8 -0
  68. package/dist/lobby-connection-ui.d.ts.map +1 -0
  69. package/dist/lobby-connection-ui.js +68 -0
  70. package/dist/lobby-connection-ui.js.map +1 -0
  71. package/dist/lobby-debug.d.ts +50 -0
  72. package/dist/lobby-debug.d.ts.map +1 -0
  73. package/dist/lobby-debug.js +132 -0
  74. package/dist/lobby-debug.js.map +1 -0
  75. package/dist/lobby-font.d.ts +5 -0
  76. package/dist/lobby-font.d.ts.map +1 -0
  77. package/dist/lobby-font.js +35 -0
  78. package/dist/lobby-font.js.map +1 -0
  79. package/dist/lobby-music.d.ts +40 -0
  80. package/dist/lobby-music.d.ts.map +1 -0
  81. package/dist/lobby-music.js +250 -0
  82. package/dist/lobby-music.js.map +1 -0
  83. package/dist/lobby-orientation-ui.d.ts +10 -0
  84. package/dist/lobby-orientation-ui.d.ts.map +1 -0
  85. package/dist/lobby-orientation-ui.js +64 -0
  86. package/dist/lobby-orientation-ui.js.map +1 -0
  87. package/dist/lobby-perf-diag.d.ts +254 -0
  88. package/dist/lobby-perf-diag.d.ts.map +1 -0
  89. package/dist/lobby-perf-diag.js +775 -0
  90. package/dist/lobby-perf-diag.js.map +1 -0
  91. package/dist/lobby-plaza-diag.d.ts +103 -0
  92. package/dist/lobby-plaza-diag.d.ts.map +1 -0
  93. package/dist/lobby-plaza-diag.js +534 -0
  94. package/dist/lobby-plaza-diag.js.map +1 -0
  95. package/dist/lobby-presence-ui.d.ts +4 -0
  96. package/dist/lobby-presence-ui.d.ts.map +1 -0
  97. package/dist/lobby-presence-ui.js +89 -0
  98. package/dist/lobby-presence-ui.js.map +1 -0
  99. package/dist/lobby-real-device-diag.d.ts +119 -0
  100. package/dist/lobby-real-device-diag.d.ts.map +1 -0
  101. package/dist/lobby-real-device-diag.js +468 -0
  102. package/dist/lobby-real-device-diag.js.map +1 -0
  103. package/dist/lobby-spawn.d.ts +15 -0
  104. package/dist/lobby-spawn.d.ts.map +1 -0
  105. package/dist/lobby-spawn.js +18 -0
  106. package/dist/lobby-spawn.js.map +1 -0
  107. package/dist/lobby-ui-i18n.d.ts +11 -0
  108. package/dist/lobby-ui-i18n.d.ts.map +1 -0
  109. package/dist/lobby-ui-i18n.js +21 -0
  110. package/dist/lobby-ui-i18n.js.map +1 -0
  111. package/dist/lobby-voice-ui.d.ts +3 -0
  112. package/dist/lobby-voice-ui.d.ts.map +1 -0
  113. package/dist/lobby-voice-ui.js +105 -0
  114. package/dist/lobby-voice-ui.js.map +1 -0
  115. package/dist/local-player-controller.d.ts +80 -0
  116. package/dist/local-player-controller.d.ts.map +1 -0
  117. package/dist/local-player-controller.js +422 -0
  118. package/dist/local-player-controller.js.map +1 -0
  119. package/dist/name-tag.d.ts +3 -0
  120. package/dist/name-tag.d.ts.map +1 -0
  121. package/dist/name-tag.js +59 -0
  122. package/dist/name-tag.js.map +1 -0
  123. package/dist/network-client.d.ts +87 -0
  124. package/dist/network-client.d.ts.map +1 -0
  125. package/dist/network-client.js +182 -0
  126. package/dist/network-client.js.map +1 -0
  127. package/dist/platform-bridge.d.ts +17 -0
  128. package/dist/platform-bridge.d.ts.map +1 -0
  129. package/dist/platform-bridge.js +90 -0
  130. package/dist/platform-bridge.js.map +1 -0
  131. package/dist/platform-lobby.d.ts +176 -0
  132. package/dist/platform-lobby.d.ts.map +1 -0
  133. package/dist/platform-lobby.js +679 -0
  134. package/dist/platform-lobby.js.map +1 -0
  135. package/dist/platform-types.d.ts +56 -0
  136. package/dist/platform-types.d.ts.map +1 -0
  137. package/dist/platform-types.js +3 -0
  138. package/dist/platform-types.js.map +1 -0
  139. package/dist/player-label.d.ts +9 -0
  140. package/dist/player-label.d.ts.map +1 -0
  141. package/dist/player-label.js +14 -0
  142. package/dist/player-label.js.map +1 -0
  143. package/dist/playground/playground-layout.d.ts +14 -0
  144. package/dist/playground/playground-layout.d.ts.map +1 -0
  145. package/dist/playground/playground-layout.js +320 -0
  146. package/dist/playground/playground-layout.js.map +1 -0
  147. package/dist/playground/playground-system.d.ts +30 -0
  148. package/dist/playground/playground-system.d.ts.map +1 -0
  149. package/dist/playground/playground-system.js +202 -0
  150. package/dist/playground/playground-system.js.map +1 -0
  151. package/dist/plaza-layout.d.ts +30 -0
  152. package/dist/plaza-layout.d.ts.map +1 -0
  153. package/dist/plaza-layout.js +527 -0
  154. package/dist/plaza-layout.js.map +1 -0
  155. package/dist/plugins.d.ts +5 -0
  156. package/dist/plugins.d.ts.map +1 -0
  157. package/dist/plugins.js +26 -0
  158. package/dist/plugins.js.map +1 -0
  159. package/dist/protocol.d.ts +276 -0
  160. package/dist/protocol.d.ts.map +1 -0
  161. package/dist/protocol.js +107 -0
  162. package/dist/protocol.js.map +1 -0
  163. package/dist/quality.d.ts +39 -0
  164. package/dist/quality.d.ts.map +1 -0
  165. package/dist/quality.js +95 -0
  166. package/dist/quality.js.map +1 -0
  167. package/dist/remote-player-manager.d.ts +48 -0
  168. package/dist/remote-player-manager.d.ts.map +1 -0
  169. package/dist/remote-player-manager.js +339 -0
  170. package/dist/remote-player-manager.js.map +1 -0
  171. package/dist/scene-manager.d.ts +26 -0
  172. package/dist/scene-manager.d.ts.map +1 -0
  173. package/dist/scene-manager.js +169 -0
  174. package/dist/scene-manager.js.map +1 -0
  175. package/dist/spawn-utils.d.ts +8 -0
  176. package/dist/spawn-utils.d.ts.map +1 -0
  177. package/dist/spawn-utils.js +29 -0
  178. package/dist/spawn-utils.js.map +1 -0
  179. package/dist/starter-layout.d.ts +17 -0
  180. package/dist/starter-layout.d.ts.map +1 -0
  181. package/dist/starter-layout.js +102 -0
  182. package/dist/starter-layout.js.map +1 -0
  183. package/dist/third-person-camera.d.ts +35 -0
  184. package/dist/third-person-camera.d.ts.map +1 -0
  185. package/dist/third-person-camera.js +181 -0
  186. package/dist/third-person-camera.js.map +1 -0
  187. package/dist/types.d.ts +164 -0
  188. package/dist/types.d.ts.map +1 -0
  189. package/dist/types.js +2 -0
  190. package/dist/types.js.map +1 -0
  191. package/dist/voice-chat.d.ts +78 -0
  192. package/dist/voice-chat.d.ts.map +1 -0
  193. package/dist/voice-chat.js +321 -0
  194. package/dist/voice-chat.js.map +1 -0
  195. package/dist/yield-to-render.d.ts +3 -0
  196. package/dist/yield-to-render.d.ts.map +1 -0
  197. package/dist/yield-to-render.js +11 -0
  198. package/dist/yield-to-render.js.map +1 -0
  199. package/dist/zones.d.ts +36 -0
  200. package/dist/zones.d.ts.map +1 -0
  201. package/dist/zones.js +68 -0
  202. package/dist/zones.js.map +1 -0
  203. package/docs/00-overview.md +47 -0
  204. package/docs/01-connect.md +85 -0
  205. package/docs/02-github.md +43 -0
  206. package/docs/03-modes.md +70 -0
  207. package/docs/04-api.md +106 -0
  208. package/docs/05-features.md +55 -0
  209. package/docs/06-controls.md +34 -0
  210. package/docs/07-troubleshooting.md +39 -0
  211. package/package.json +65 -0
@@ -0,0 +1,300 @@
1
+ /**
2
+ * Procedural humanoid locomotion (pure math, no Babylon import).
3
+ *
4
+ * Angle convention — every value below is expressed in *character space*, so it
5
+ * stays correct no matter how the GLB skeleton is oriented:
6
+ * pitch > 0 → distal end of the bone swings forward (character +Z)
7
+ * yaw > 0 → distal end swings toward the character's left
8
+ * roll > 0 → distal end tilts toward the character's right
9
+ *
10
+ * `humanoid-rig.ts` converts these into per-bone parent-space rotations.
11
+ */
12
+ export const HUMANOID_JOINT_INDEX = {
13
+ hips: 0,
14
+ spine: 1,
15
+ chest: 2,
16
+ neck: 3,
17
+ head: 4,
18
+ shoulderL: 5,
19
+ shoulderR: 6,
20
+ upperArmL: 7,
21
+ upperArmR: 8,
22
+ foreArmL: 9,
23
+ foreArmR: 10,
24
+ handL: 11,
25
+ handR: 12,
26
+ thighL: 13,
27
+ thighR: 14,
28
+ shinL: 15,
29
+ shinR: 16,
30
+ footL: 17,
31
+ footR: 18,
32
+ };
33
+ export const HUMANOID_JOINTS = Object.keys(HUMANOID_JOINT_INDEX);
34
+ export const HUMANOID_JOINT_COUNT = HUMANOID_JOINTS.length;
35
+ const TAU = Math.PI * 2;
36
+ /** Additive pose buffer — zero allocation per frame. */
37
+ export class HumanoidPose {
38
+ /** [pitch, yaw, roll] per joint, radians. */
39
+ angles = new Float32Array(HUMANOID_JOINT_COUNT * 3);
40
+ /** Vertical body bob in metres (applied to the avatar root, never to bones). */
41
+ bob = 0;
42
+ reset() {
43
+ this.angles.fill(0);
44
+ this.bob = 0;
45
+ }
46
+ add(joint, pitch, yaw, roll, weight = 1) {
47
+ if (weight === 0)
48
+ return;
49
+ const i = HUMANOID_JOINT_INDEX[joint] * 3;
50
+ this.angles[i] += pitch * weight;
51
+ this.angles[i + 1] += yaw * weight;
52
+ this.angles[i + 2] += roll * weight;
53
+ }
54
+ pitch(joint) {
55
+ return this.angles[HUMANOID_JOINT_INDEX[joint] * 3];
56
+ }
57
+ yaw(joint) {
58
+ return this.angles[HUMANOID_JOINT_INDEX[joint] * 3 + 1];
59
+ }
60
+ roll(joint) {
61
+ return this.angles[HUMANOID_JOINT_INDEX[joint] * 3 + 2];
62
+ }
63
+ }
64
+ export const WALK_GAIT = {
65
+ frequency: 1.45,
66
+ // Thigh drives the step; knee does the recovery — not a stiff whole-leg pendulum.
67
+ thighSwing: 0.34,
68
+ kneeSwing: 0.78,
69
+ kneeStance: 0.12,
70
+ footLevel: 0.7,
71
+ toeOff: 0.12,
72
+ // Modest arms, opposite the legs; kept in front of the torso envelope.
73
+ armSwing: 0.22,
74
+ elbowBase: 0.2,
75
+ elbowSwing: 0.12,
76
+ armTuck: 0.06,
77
+ shoulderFollow: 0.06,
78
+ // Almost no hip sway — Roblox-style walk is upright and tidy.
79
+ hipsPitch: 0.008,
80
+ hipsYaw: 0.018,
81
+ hipsRoll: 0.012,
82
+ chestYaw: 0.028,
83
+ chestRoll: 0.01,
84
+ lean: 0.02,
85
+ headYaw: 0.012,
86
+ bob: 0.018,
87
+ };
88
+ export const RUN_GAIT = {
89
+ // Roblox-style high-knee run: thigh lifts, knee folds hard so the foot clears.
90
+ frequency: 2.4,
91
+ thighSwing: 0.52,
92
+ kneeSwing: 1.32,
93
+ kneeStance: 0.2,
94
+ footLevel: 0.55,
95
+ toeOff: 0.18,
96
+ // Opposite arms match the bigger stride, still close to the body.
97
+ armSwing: 0.4,
98
+ elbowBase: 0.52,
99
+ elbowSwing: 0.22,
100
+ armTuck: 0.05,
101
+ shoulderFollow: 0.1,
102
+ // Stable upright torso — almost no hip/chest rock while running.
103
+ hipsPitch: 0.006,
104
+ hipsYaw: 0.012,
105
+ hipsRoll: 0.008,
106
+ chestYaw: 0.02,
107
+ chestRoll: 0.008,
108
+ lean: 0.04,
109
+ headYaw: 0.01,
110
+ bob: 0.032,
111
+ };
112
+ const GAIT_KEYS = Object.keys(WALK_GAIT);
113
+ /** Cross-fade walk → run in place (same phase, so the blend never snaps). */
114
+ export function lerpGait(out, a, b, t) {
115
+ const k = t < 0 ? 0 : t > 1 ? 1 : t;
116
+ for (const key of GAIT_KEYS) {
117
+ out[key] = a[key] + (b[key] - a[key]) * k;
118
+ }
119
+ return out;
120
+ }
121
+ export function cloneGait(source) {
122
+ return { ...source };
123
+ }
124
+ /**
125
+ * One leg of the cycle. `theta` walks 0 → 2π across a full stride:
126
+ * π/2 contact (thigh forward, knee nearly straight)
127
+ * π mid-stance / passing (body rides over the planted foot)
128
+ * 3π/2 toe-off (thigh back)
129
+ * 0/2π mid-swing (leg passes under the hips with the knee bent)
130
+ *
131
+ * Thigh pitch is softened at toe-off so the limb doesn't look kicked from the hip.
132
+ */
133
+ function writeLeg(pose, thigh, shin, foot, theta, g, weight) {
134
+ const s = Math.sin(theta);
135
+ const c = Math.cos(theta);
136
+ const swingPhase = c > 0 ? c : 0;
137
+ const stancePhase = c < 0 ? -c : 0;
138
+ // Thigh drives stride; knee carries recovery so it never looks like a stiff stick from the hip.
139
+ const thighPitch = g.thighSwing * s;
140
+ // Knee does the recovery lift; stance stays softly bent, never locked.
141
+ const kneeFlex = g.kneeSwing * Math.pow(swingPhase, 1.35) + g.kneeStance * (0.55 + 0.45 * stancePhase);
142
+ const shinPitch = -kneeFlex;
143
+ const footPitch = -(thighPitch + shinPitch) * g.footLevel - g.toeOff * (s < 0 ? -s : 0);
144
+ pose.add(thigh, thighPitch, 0, 0, weight);
145
+ pose.add(shin, shinPitch, 0, 0, weight);
146
+ pose.add(foot, footPitch, 0, 0, weight);
147
+ }
148
+ /**
149
+ * Arms counter the opposite leg. Forward swing is stronger than rearward so
150
+ * hands never look yanked behind the torso (common Roblox-style feel).
151
+ */
152
+ function writeArm(pose, shoulder, upperArm, foreArm, hand, theta, inward, g, weight) {
153
+ const s = Math.sin(theta);
154
+ const armPitch = g.armSwing * (s > 0 ? s : s * 0.45);
155
+ const elbow = g.elbowBase + g.elbowSwing * (s > 0 ? s : 0);
156
+ pose.add(shoulder, armPitch * g.shoulderFollow, 0, 0, weight);
157
+ pose.add(upperArm, armPitch, 0, g.armTuck * inward, weight);
158
+ pose.add(foreArm, elbow, 0, 0, weight);
159
+ pose.add(hand, elbow * 0.1, 0, 0, weight);
160
+ }
161
+ /**
162
+ * Full walk/run cycle at normalized `phase` (0..1, wraps seamlessly).
163
+ * Left leg leads at phase 0.25, right leg at 0.75.
164
+ */
165
+ export function writeGaitPose(pose, phase, g, weight) {
166
+ if (weight <= 0)
167
+ return;
168
+ const thetaL = phase * TAU;
169
+ const thetaR = thetaL + Math.PI;
170
+ writeLeg(pose, 'thighL', 'shinL', 'footL', thetaL, g, weight);
171
+ writeLeg(pose, 'thighR', 'shinR', 'footR', thetaR, g, weight);
172
+ writeArm(pose, 'shoulderL', 'upperArmL', 'foreArmL', 'handL', thetaR, 1, g, weight);
173
+ writeArm(pose, 'shoulderR', 'upperArmR', 'foreArmR', 'handR', thetaL, -1, g, weight);
174
+ const s = Math.sin(thetaL);
175
+ // Pelvis leads, ribcage counters it — that opposition is what reads as "alive".
176
+ pose.add('hips', g.hipsPitch, g.hipsYaw * s, g.hipsRoll * s, weight);
177
+ pose.add('spine', g.lean * 0.45, -g.chestYaw * 0.4 * s, -g.chestRoll * 0.45 * s, weight);
178
+ pose.add('chest', g.lean * 0.55, -g.chestYaw * 0.6 * s, -g.chestRoll * 0.55 * s, weight);
179
+ pose.add('neck', -g.lean * 0.5, g.headYaw * 0.4 * s, 0, weight);
180
+ pose.add('head', -g.lean * 0.35, g.headYaw * s, 0, weight);
181
+ // Two rises per cycle: lowest at each contact, highest at mid-stance.
182
+ pose.bob += g.bob * Math.cos(2 * thetaL) * weight;
183
+ }
184
+ /** Calm standing pose: planted feet, slow breathing, a touch of sway. */
185
+ export function writeIdlePose(pose, time, weight) {
186
+ if (weight <= 0)
187
+ return;
188
+ const breath = Math.sin(time * 1.7);
189
+ const sway = Math.sin(time * 0.63);
190
+ const shift = Math.sin(time * 0.41);
191
+ pose.add('hips', 0.004 * breath, 0.008 * sway, 0.01 * shift, weight);
192
+ pose.add('spine', 0.009 * breath, -0.006 * sway, -0.006 * shift, weight);
193
+ pose.add('chest', 0.014 * breath, -0.005 * sway, -0.005 * shift, weight);
194
+ pose.add('neck', -0.008 * breath, 0.009 * sway, 0, weight);
195
+ pose.add('head', -0.006 * breath, 0.013 * sway, 0.005 * shift, weight);
196
+ pose.add('shoulderL', 0.01 * breath, 0, 0, weight);
197
+ pose.add('shoulderR', 0.01 * breath, 0, 0, weight);
198
+ pose.add('upperArmL', 0.03 + 0.014 * breath, 0, 0.08, weight);
199
+ pose.add('upperArmR', 0.03 + 0.014 * breath, 0, -0.08, weight);
200
+ pose.add('foreArmL', 0.13 + 0.018 * breath, 0, 0, weight);
201
+ pose.add('foreArmR', 0.13 + 0.018 * breath, 0, 0, weight);
202
+ pose.add('handL', 0.02, 0, 0.03, weight);
203
+ pose.add('handR', 0.02, 0, -0.03, weight);
204
+ // Feet stay planted — only a hint of knee softness so the legs aren't stiff.
205
+ pose.add('shinL', -0.028, 0, 0, weight);
206
+ pose.add('shinR', -0.028, 0, 0, weight);
207
+ pose.add('footL', 0.016, 0, 0, weight);
208
+ pose.add('footR', 0.016, 0, 0, weight);
209
+ pose.bob += 0.005 * breath * weight;
210
+ }
211
+ export function writeAirPose(pose, rising, weight) {
212
+ if (weight <= 0)
213
+ return;
214
+ if (rising) {
215
+ // Compact takeoff: legs tuck a little; arms float slightly forward + out (not pinned).
216
+ pose.add('hips', -0.02, 0, 0, weight);
217
+ pose.add('spine', -0.03, 0, 0, weight);
218
+ pose.add('chest', -0.025, 0, 0, weight);
219
+ pose.add('thighL', 0.28, 0, 0, weight);
220
+ pose.add('shinL', -0.52, 0, 0, weight);
221
+ pose.add('footL', 0.12, 0, 0, weight);
222
+ pose.add('thighR', 0.14, 0, 0, weight);
223
+ pose.add('shinR', -0.28, 0, 0, weight);
224
+ pose.add('footR', 0.08, 0, 0, weight);
225
+ // pitch > 0 = forward; roll opposite of idle tuck = mild outward.
226
+ pose.add('upperArmL', 0.22, 0, -0.22, weight);
227
+ pose.add('upperArmR', 0.22, 0, 0.22, weight);
228
+ pose.add('foreArmL', 0.32, 0, 0, weight);
229
+ pose.add('foreArmR', 0.32, 0, 0, weight);
230
+ pose.add('handL', 0.04, 0, 0, weight);
231
+ pose.add('handR', 0.04, 0, 0, weight);
232
+ return;
233
+ }
234
+ // Landing prep: knees soften; arms stay slightly forward/out for balance.
235
+ pose.add('spine', 0.04, 0, 0, weight);
236
+ pose.add('chest', 0.03, 0, 0, weight);
237
+ pose.add('hips', 0.02, 0, 0, weight);
238
+ pose.add('thighL', 0.22, 0, 0, weight);
239
+ pose.add('shinL', -0.48, 0, 0, weight);
240
+ pose.add('footL', 0.14, 0, 0, weight);
241
+ pose.add('thighR', 0.16, 0, 0, weight);
242
+ pose.add('shinR', -0.42, 0, 0, weight);
243
+ pose.add('footR', 0.12, 0, 0, weight);
244
+ pose.add('upperArmL', 0.16, 0, -0.2, weight);
245
+ pose.add('upperArmR', 0.16, 0, 0.2, weight);
246
+ pose.add('foreArmL', 0.28, 0, 0, weight);
247
+ pose.add('foreArmR', 0.28, 0, 0, weight);
248
+ }
249
+ export function writeSlidePose(pose, weight) {
250
+ if (weight <= 0)
251
+ return;
252
+ pose.add('hips', 0.34, 0, 0, weight);
253
+ pose.add('spine', 0.16, 0, 0.04, weight);
254
+ pose.add('chest', 0.12, 0, 0.03, weight);
255
+ pose.add('head', -0.22, 0, 0, weight);
256
+ pose.add('thighL', 0.7, 0, 0.06, weight);
257
+ pose.add('thighR', 0.82, 0, -0.04, weight);
258
+ pose.add('shinL', -0.35, 0, 0, weight);
259
+ pose.add('shinR', -0.22, 0, 0, weight);
260
+ pose.add('upperArmL', 0.55, 0, 0.3, weight);
261
+ pose.add('upperArmR', 0.62, 0, -0.3, weight);
262
+ pose.add('foreArmL', 0.4, 0, 0, weight);
263
+ pose.add('foreArmR', 0.4, 0, 0, weight);
264
+ pose.bob -= 0.04 * weight;
265
+ }
266
+ /** Exponential smoothing that is stable for any dt. */
267
+ export function approach(current, target, tau, dt) {
268
+ if (tau <= 0)
269
+ return target;
270
+ return current + (target - current) * (1 - Math.exp(-dt / tau));
271
+ }
272
+ /**
273
+ * Cadence locked to real speed so the feet never scrub the floor:
274
+ * frequency scales linearly with velocity, clamped to a believable range.
275
+ */
276
+ export function gaitFrequency(speed, referenceSpeed, gait) {
277
+ const ref = referenceSpeed > 0.01 ? referenceSpeed : 1;
278
+ const ratio = speed / ref;
279
+ const clamped = ratio < 0.4 ? 0.4 : ratio > 1.35 ? 1.35 : ratio;
280
+ return gait.frequency * clamped;
281
+ }
282
+ const CONTACT_PHASES = [0.25, 0.75];
283
+ /** How many foot contacts happen when the cycle advances by `advance` from `prevPhase`. */
284
+ export function footContacts(prevPhase, advance) {
285
+ if (advance <= 0)
286
+ return 0;
287
+ const prev = prevPhase - Math.floor(prevPhase);
288
+ let hits = 0;
289
+ for (const contact of CONTACT_PHASES) {
290
+ let delta = contact - prev;
291
+ if (delta <= 0)
292
+ delta += 1;
293
+ while (delta <= advance) {
294
+ hits++;
295
+ delta += 1;
296
+ }
297
+ }
298
+ return hits;
299
+ }
300
+ //# sourceMappingURL=humanoid-locomotion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humanoid-locomotion.js","sourceRoot":"","sources":["../src/humanoid-locomotion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,EAAE;IACV,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,EAAE;CACD,CAAC;AAIX,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAoB,CAAC;AACpF,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC,MAAM,CAAC;AAE3D,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AAExB,wDAAwD;AACxD,MAAM,OAAO,YAAY;IACvB,6CAA6C;IACpC,MAAM,GAAG,IAAI,YAAY,CAAC,oBAAoB,GAAG,CAAC,CAAC,CAAC;IAC7D,gFAAgF;IAChF,GAAG,GAAG,CAAC,CAAC;IAER,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IACf,CAAC;IAED,GAAG,CAAC,KAAoB,EAAE,KAAa,EAAE,GAAW,EAAE,IAAY,EAAE,MAAM,GAAG,CAAC;QAC5E,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO;QACzB,MAAM,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,MAAM,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,GAAG,MAAM,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,MAAM,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,KAAoB;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,GAAG,CAAC,KAAoB;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC,KAAoB;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;CACF;AAiCD,MAAM,CAAC,MAAM,SAAS,GAAe;IACnC,SAAS,EAAE,IAAI;IACf,kFAAkF;IAClF,UAAU,EAAE,IAAI;IAChB,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,IAAI;IAChB,SAAS,EAAE,GAAG;IACd,MAAM,EAAE,IAAI;IACZ,uEAAuE;IACvE,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,GAAG;IACd,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,IAAI;IACpB,8DAA8D;IAC9D,SAAS,EAAE,KAAK;IAChB,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,KAAK;IACd,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAe;IAClC,+EAA+E;IAC/E,SAAS,EAAE,GAAG;IACd,UAAU,EAAE,IAAI;IAChB,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,GAAG;IACf,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,IAAI;IACZ,kEAAkE;IAClE,QAAQ,EAAE,GAAG;IACb,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,GAAG;IACnB,iEAAiE;IACjE,SAAS,EAAE,KAAK;IAChB,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,IAAI;IACb,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAyB,CAAC;AAEjE,6EAA6E;AAC7E,MAAM,UAAU,QAAQ,CAAC,GAAe,EAAE,CAAa,EAAE,CAAa,EAAE,CAAS;IAC/E,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAkB;IAC1C,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;AACvB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,QAAQ,CACf,IAAkB,EAClB,KAAoB,EACpB,IAAmB,EACnB,IAAmB,EACnB,KAAa,EACb,CAAa,EACb,MAAc;IAEd,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnC,gGAAgG;IAChG,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;IACpC,uEAAuE;IACvE,MAAM,QAAQ,GACZ,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,WAAW,CAAC,CAAC;IACxF,MAAM,SAAS,GAAG,CAAC,QAAQ,CAAC;IAC5B,MAAM,SAAS,GAAG,CAAC,CAAC,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAExF,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CACf,IAAkB,EAClB,QAAuB,EACvB,QAAuB,EACvB,OAAsB,EACtB,IAAmB,EACnB,KAAa,EACb,MAAc,EACd,CAAa,EACb,MAAc;IAEd,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3D,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9D,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5D,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAkB,EAClB,KAAa,EACb,CAAa,EACb,MAAc;IAEd,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO;IACxB,MAAM,MAAM,GAAG,KAAK,GAAG,GAAG,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IAEhC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9D,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9D,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACpF,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAErF,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,gFAAgF;IAChF,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IACrE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,IAAI,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IACzF,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,IAAI,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IACzF,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC,OAAO,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAChE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAE3D,sEAAsE;IACtE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,aAAa,CAAC,IAAkB,EAAE,IAAY,EAAE,MAAc;IAC5E,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO;IACxB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAEpC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC;IACrE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC,KAAK,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC;IACzE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC,KAAK,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC;IACzE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,GAAG,MAAM,EAAE,KAAK,GAAG,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3D,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,GAAG,MAAM,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC;IAEvE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9D,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/D,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1D,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1D,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE1C,6EAA6E;IAC7E,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAEvC,IAAI,CAAC,GAAG,IAAI,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAkB,EAAE,MAAe,EAAE,MAAc;IAC9E,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO;IACxB,IAAI,MAAM,EAAE,CAAC;QACX,uFAAuF;QACvF,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACtC,kEAAkE;QAClE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IACD,0EAA0E;IAC1E,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAkB,EAAE,MAAc;IAC/D,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO;IACxB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,MAAM,CAAC;AAC5B,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,MAAc,EAAE,GAAW,EAAE,EAAU;IAC/E,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IAC5B,OAAO,OAAO,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,cAAsB,EAAE,IAAgB;IACnF,MAAM,GAAG,GAAG,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC;IAC1B,MAAM,OAAO,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IAChE,OAAO,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;AAClC,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAEpC,2FAA2F;AAC3F,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,OAAe;IAC7D,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,IAAI,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC;QAC3B,IAAI,KAAK,IAAI,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;QAC3B,OAAO,KAAK,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,EAAE,CAAC;YACP,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { Quaternion, TransformNode, Vector3 } from '@babylonjs/core';
2
+ import type { Skeleton } from '@babylonjs/core';
3
+ import { type HumanoidJoint, type HumanoidPose } from './humanoid-locomotion';
4
+ /**
5
+ * Maps an arbitrary GLB skeleton onto the humanoid joints we animate.
6
+ *
7
+ * Nothing here assumes bone names or bone orientations: names are matched by
8
+ * role patterns against the *actual* hierarchy, and every joint stores the
9
+ * character-space rotation axes expressed in its own parent space, so the same
10
+ * pose data drives Mixamo, Meshy, Tripo or hand-made rigs identically.
11
+ */
12
+ export interface HumanoidJointControl {
13
+ node: TransformNode;
14
+ /** Local bind rotation straight from the GLB. */
15
+ rest: Quaternion;
16
+ /** `rest` plus the bind-pose normalisation — the zero point for every pose. */
17
+ base: Quaternion;
18
+ /** Character right / up / forward, expressed in this bone's parent space. */
19
+ axisPitch: Vector3;
20
+ axisYaw: Vector3;
21
+ axisRoll: Vector3;
22
+ }
23
+ interface HumanoidJointEntry {
24
+ control: HumanoidJointControl;
25
+ offset: number;
26
+ }
27
+ export interface HumanoidBoneRig {
28
+ joints: Partial<Record<HumanoidJoint, HumanoidJointControl>>;
29
+ /**
30
+ * Per-axis ±1 so pose angles keep their meaning on this rig. The glTF import
31
+ * mirrors the model, and a mirror only reverses rotations around the axes it
32
+ * does not lie on — so pitch, yaw and roll each need their own measurement.
33
+ */
34
+ signPitch: number;
35
+ signYaw: number;
36
+ signRoll: number;
37
+ names: Partial<Record<HumanoidJoint, string>>;
38
+ /** Flat list for allocation-free per-frame updates. */
39
+ entries: HumanoidJointEntry[];
40
+ /**
41
+ * Bind-pose normalisation baked into every joint's `base`: whatever the artist
42
+ * exported (T-pose, A-pose…) becomes the relaxed neutral poses are authored
43
+ * against. Kept for diagnostics.
44
+ */
45
+ neutral: Partial<Record<HumanoidJoint, number>>;
46
+ }
47
+ export declare function buildHumanoidBoneRig(visual: TransformNode, skeletons: Skeleton[], transformNodes: TransformNode[]): HumanoidBoneRig | null;
48
+ /** Writes a pose onto the skeleton as pure bone rotations (never translations). */
49
+ export declare function applyHumanoidPose(rig: HumanoidBoneRig, pose: HumanoidPose): void;
50
+ export {};
51
+ //# sourceMappingURL=humanoid-rig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humanoid-rig.d.ts","sourceRoot":"","sources":["../src/humanoid-rig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;GAOG;AAEH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,aAAa,CAAC;IACpB,iDAAiD;IACjD,IAAI,EAAE,UAAU,CAAC;IACjB,+EAA+E;IAC/E,IAAI,EAAE,UAAU,CAAC;IACjB,6EAA6E;IAC7E,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE,oBAAoB,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAC7D;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,uDAAuD;IACvD,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;CACjD;AAiKD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,QAAQ,EAAE,EACrB,cAAc,EAAE,aAAa,EAAE,GAC9B,eAAe,GAAG,IAAI,CA2HxB;AAKD,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,QA+BzE"}