@aura3d/engine 4.2.0 → 4.3.1

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 (191) hide show
  1. package/README.md +1 -1
  2. package/dist/aura3d-cli/cli-help.d.ts.map +1 -1
  3. package/dist/aura3d-cli/cli-help.js +4 -2
  4. package/dist/aura3d-cli/cli-help.js.map +1 -1
  5. package/dist/aura3d-cli/cli.js +85 -2
  6. package/dist/aura3d-cli/cli.js.map +1 -1
  7. package/dist/aura3d-cli/commands/assets/index.js +2 -2
  8. package/dist/aura3d-cli/commands/assets/index.js.map +1 -1
  9. package/dist/aura3d-cli/commands/meshyLedger.d.ts +125 -14
  10. package/dist/aura3d-cli/commands/meshyLedger.d.ts.map +1 -1
  11. package/dist/aura3d-cli/commands/meshyLedger.js +262 -35
  12. package/dist/aura3d-cli/commands/meshyLedger.js.map +1 -1
  13. package/dist/aura3d-cli/commands/prd13/run.js +19 -16
  14. package/dist/aura3d-cli/commands/prd13/run.js.map +1 -1
  15. package/dist/aura3d-cli/index.d.ts +10 -0
  16. package/dist/aura3d-cli/index.d.ts.map +1 -1
  17. package/dist/aura3d-cli/index.js +13 -0
  18. package/dist/aura3d-cli/index.js.map +1 -1
  19. package/dist/aura3d-cli/skin/analysis.d.ts +137 -0
  20. package/dist/aura3d-cli/skin/analysis.d.ts.map +1 -0
  21. package/dist/aura3d-cli/skin/analysis.js +382 -0
  22. package/dist/aura3d-cli/skin/analysis.js.map +1 -0
  23. package/dist/aura3d-cli/skin/command.d.ts +75 -0
  24. package/dist/aura3d-cli/skin/command.d.ts.map +1 -0
  25. package/dist/aura3d-cli/skin/command.js +208 -0
  26. package/dist/aura3d-cli/skin/command.js.map +1 -0
  27. package/dist/aura3d-cli/skin/glbEdit.d.ts +14 -0
  28. package/dist/aura3d-cli/skin/glbEdit.d.ts.map +1 -0
  29. package/dist/aura3d-cli/skin/glbEdit.js +152 -0
  30. package/dist/aura3d-cli/skin/glbEdit.js.map +1 -0
  31. package/dist/aura3d-cli/skin/gltf.d.ts +159 -0
  32. package/dist/aura3d-cli/skin/gltf.d.ts.map +1 -0
  33. package/dist/aura3d-cli/skin/gltf.js +379 -0
  34. package/dist/aura3d-cli/skin/gltf.js.map +1 -0
  35. package/dist/aura3d-cli/skin/rebuildLimbs.d.ts +31 -0
  36. package/dist/aura3d-cli/skin/rebuildLimbs.d.ts.map +1 -0
  37. package/dist/aura3d-cli/skin/rebuildLimbs.js +326 -0
  38. package/dist/aura3d-cli/skin/rebuildLimbs.js.map +1 -0
  39. package/dist/aura3d-cli/skin/refitSkeleton.d.ts +23 -0
  40. package/dist/aura3d-cli/skin/refitSkeleton.d.ts.map +1 -0
  41. package/dist/aura3d-cli/skin/refitSkeleton.js +288 -0
  42. package/dist/aura3d-cli/skin/refitSkeleton.js.map +1 -0
  43. package/dist/aura3d-cli/skin/repair.d.ts +45 -0
  44. package/dist/aura3d-cli/skin/repair.d.ts.map +1 -0
  45. package/dist/aura3d-cli/skin/repair.js +192 -0
  46. package/dist/aura3d-cli/skin/repair.js.map +1 -0
  47. package/dist/create-aura3d/index.js +1 -1
  48. package/dist/engine/agent-api/camera/layers.d.ts.map +1 -1
  49. package/dist/engine/agent-api/camera/layers.js +6 -1
  50. package/dist/engine/agent-api/camera/layers.js.map +1 -1
  51. package/dist/engine/agent-api/compiler/customMaterial.d.ts.map +1 -1
  52. package/dist/engine/agent-api/compiler/customMaterial.js +12 -1
  53. package/dist/engine/agent-api/compiler/customMaterial.js.map +1 -1
  54. package/dist/engine/agent-api/compiler/lines.d.ts.map +1 -1
  55. package/dist/engine/agent-api/compiler/lines.js +8 -6
  56. package/dist/engine/agent-api/compiler/lines.js.map +1 -1
  57. package/dist/engine/agent-api/nodes/types.d.ts +6 -0
  58. package/dist/engine/agent-api/nodes/types.d.ts.map +1 -1
  59. package/dist/engine/agent-api/vfx/effects-api.d.ts.map +1 -1
  60. package/dist/engine/agent-api/vfx/effects-api.js +12 -3
  61. package/dist/engine/agent-api/vfx/effects-api.js.map +1 -1
  62. package/dist/engine/agent-api/vfx/gameEffects.d.ts.map +1 -1
  63. package/dist/engine/agent-api/vfx/gameEffects.js +20 -3
  64. package/dist/engine/agent-api/vfx/gameEffects.js.map +1 -1
  65. package/dist/engine/contracts/camera.d.ts +1 -0
  66. package/dist/engine/contracts/camera.d.ts.map +1 -1
  67. package/dist/engine/contracts/effects.d.ts +4 -2
  68. package/dist/engine/contracts/effects.d.ts.map +1 -1
  69. package/dist/engine/contracts/effects.js.map +1 -1
  70. package/dist/game/index.d.ts +2 -2
  71. package/dist/game/index.d.ts.map +1 -1
  72. package/dist/game/index.js +1 -1
  73. package/dist/game/index.js.map +1 -1
  74. package/dist/game/motion/facing.d.ts +30 -0
  75. package/dist/game/motion/facing.d.ts.map +1 -0
  76. package/dist/game/motion/facing.js +50 -0
  77. package/dist/game/motion/facing.js.map +1 -0
  78. package/dist/game/motion/handBounce.d.ts +251 -0
  79. package/dist/game/motion/handBounce.d.ts.map +1 -0
  80. package/dist/game/motion/handBounce.js +315 -0
  81. package/dist/game/motion/handBounce.js.map +1 -0
  82. package/dist/game/motion/index.d.ts +6 -0
  83. package/dist/game/motion/index.d.ts.map +1 -1
  84. package/dist/game/motion/index.js +3 -0
  85. package/dist/game/motion/index.js.map +1 -1
  86. package/dist/game/motion/twoHandGrip.d.ts +229 -0
  87. package/dist/game/motion/twoHandGrip.d.ts.map +1 -0
  88. package/dist/game/motion/twoHandGrip.js +413 -0
  89. package/dist/game/motion/twoHandGrip.js.map +1 -0
  90. package/dist/game/session/warmPrograms.d.ts +17 -0
  91. package/dist/game/session/warmPrograms.d.ts.map +1 -1
  92. package/dist/game/session/warmPrograms.js +18 -1
  93. package/dist/game/session/warmPrograms.js.map +1 -1
  94. package/dist/physics/ensure.d.ts +2 -0
  95. package/dist/physics/ensure.d.ts.map +1 -0
  96. package/dist/physics/ensure.js +4 -0
  97. package/dist/physics/ensure.js.map +1 -0
  98. package/dist/physics/index.d.ts +1 -0
  99. package/dist/physics/index.d.ts.map +1 -1
  100. package/dist/physics/index.js +1 -0
  101. package/dist/physics/index.js.map +1 -1
  102. package/dist/physics/world.d.ts +1 -0
  103. package/dist/physics/world.d.ts.map +1 -1
  104. package/dist/physics/world.js +1 -0
  105. package/dist/physics/world.js.map +1 -1
  106. package/dist/physics-rapier/index.d.ts +2 -0
  107. package/dist/physics-rapier/index.d.ts.map +1 -1
  108. package/dist/physics-rapier/index.js +12 -10
  109. package/dist/physics-rapier/index.js.map +1 -1
  110. package/dist/physics-rapier/rapierInit.d.ts +6 -0
  111. package/dist/physics-rapier/rapierInit.d.ts.map +1 -0
  112. package/dist/physics-rapier/rapierInit.js +12 -0
  113. package/dist/physics-rapier/rapierInit.js.map +1 -0
  114. package/dist/physics-rapier/rapierInit.lazy.d.ts +6 -0
  115. package/dist/physics-rapier/rapierInit.lazy.d.ts.map +1 -0
  116. package/dist/physics-rapier/rapierInit.lazy.js +19 -0
  117. package/dist/physics-rapier/rapierInit.lazy.js.map +1 -0
  118. package/dist/rendering/DepthPass.d.ts.map +1 -1
  119. package/dist/rendering/DepthPass.js +30 -8
  120. package/dist/rendering/DepthPass.js.map +1 -1
  121. package/dist/rendering/ForwardPass.d.ts.map +1 -1
  122. package/dist/rendering/ForwardPass.js +7 -0
  123. package/dist/rendering/ForwardPass.js.map +1 -1
  124. package/dist/rendering/Renderer.d.ts +0 -2
  125. package/dist/rendering/Renderer.d.ts.map +1 -1
  126. package/dist/rendering/Renderer.js +6 -16
  127. package/dist/rendering/Renderer.js.map +1 -1
  128. package/dist/rendering/contracts/output.d.ts +9 -1
  129. package/dist/rendering/contracts/output.d.ts.map +1 -1
  130. package/dist/rendering/contracts/output.js.map +1 -1
  131. package/dist/rendering/output/OutputPass.d.ts +2 -0
  132. package/dist/rendering/output/OutputPass.d.ts.map +1 -1
  133. package/dist/rendering/output/OutputPass.js +26 -3
  134. package/dist/rendering/output/OutputPass.js.map +1 -1
  135. package/dist/rendering/output/ToneMappingOperators.glsl.d.ts +3 -1
  136. package/dist/rendering/output/ToneMappingOperators.glsl.d.ts.map +1 -1
  137. package/dist/rendering/output/ToneMappingOperators.glsl.js +19 -1
  138. package/dist/rendering/output/ToneMappingOperators.glsl.js.map +1 -1
  139. package/dist/rendering/post/v2Stages.d.ts +2 -7
  140. package/dist/rendering/post/v2Stages.d.ts.map +1 -1
  141. package/dist/rendering/post/v2Stages.js +2 -17
  142. package/dist/rendering/post/v2Stages.js.map +1 -1
  143. package/dist/rendering/post/vignetteColor.d.ts +8 -0
  144. package/dist/rendering/post/vignetteColor.d.ts.map +1 -0
  145. package/dist/rendering/post/vignetteColor.js +18 -0
  146. package/dist/rendering/post/vignetteColor.js.map +1 -0
  147. package/dist/rendering/renderer/PostprocessExecution.d.ts +10 -0
  148. package/dist/rendering/renderer/PostprocessExecution.d.ts.map +1 -1
  149. package/dist/rendering/renderer/PostprocessExecution.js +38 -38
  150. package/dist/rendering/renderer/PostprocessExecution.js.map +1 -1
  151. package/dist/rendering/renderer/coreOutputPostRoute.d.ts +25 -17
  152. package/dist/rendering/renderer/coreOutputPostRoute.d.ts.map +1 -1
  153. package/dist/rendering/renderer/coreOutputPostRoute.js +27 -18
  154. package/dist/rendering/renderer/coreOutputPostRoute.js.map +1 -1
  155. package/dist/rendering/renderer/qrSubFlags.d.ts +1 -1
  156. package/dist/rendering/renderer/qrSubFlags.d.ts.map +1 -1
  157. package/dist/rendering/renderer/qrSubFlags.js +2 -8
  158. package/dist/rendering/renderer/qrSubFlags.js.map +1 -1
  159. package/dist/rendering/shaders/chunks/author/index.d.ts.map +1 -1
  160. package/dist/rendering/shaders/chunks/author/index.js +7 -0
  161. package/dist/rendering/shaders/chunks/author/index.js.map +1 -1
  162. package/dist/rendering/shaders/chunks/author/shadow.glsl.d.ts +11 -0
  163. package/dist/rendering/shaders/chunks/author/shadow.glsl.d.ts.map +1 -0
  164. package/dist/rendering/shaders/chunks/author/shadow.glsl.js +57 -0
  165. package/dist/rendering/shaders/chunks/author/shadow.glsl.js.map +1 -0
  166. package/dist/rendering/shadows/DirectionalCascadeFitter.d.ts +20 -0
  167. package/dist/rendering/shadows/DirectionalCascadeFitter.d.ts.map +1 -1
  168. package/dist/rendering/shadows/DirectionalCascadeFitter.js +80 -7
  169. package/dist/rendering/shadows/DirectionalCascadeFitter.js.map +1 -1
  170. package/dist/rendering/shadows/Prd02DepthShaderLibrary.d.ts.map +1 -1
  171. package/dist/rendering/shadows/Prd02DepthShaderLibrary.js +9 -1
  172. package/dist/rendering/shadows/Prd02DepthShaderLibrary.js.map +1 -1
  173. package/dist/rendering/shadows/ShadowSystem.d.ts.map +1 -1
  174. package/dist/rendering/shadows/ShadowSystem.js +7 -2
  175. package/dist/rendering/shadows/ShadowSystem.js.map +1 -1
  176. package/dist/rendering/webgl2/LdrPostprocessShader.d.ts +2 -0
  177. package/dist/rendering/webgl2/LdrPostprocessShader.d.ts.map +1 -1
  178. package/dist/rendering/webgl2/LdrPostprocessShader.js +25 -3
  179. package/dist/rendering/webgl2/LdrPostprocessShader.js.map +1 -1
  180. package/dist/rendering/webgl2/LegacyPost.d.ts +11 -2
  181. package/dist/rendering/webgl2/LegacyPost.d.ts.map +1 -1
  182. package/dist/rendering/webgl2/LegacyPost.js +191 -16
  183. package/dist/rendering/webgl2/LegacyPost.js.map +1 -1
  184. package/package.json +33 -26
  185. package/templates/cinematic-scene/package.json +2 -2
  186. package/templates/mini-game/package.json +2 -2
  187. package/templates/product-viewer/package.json +2 -2
  188. package/templates/production-asset-inspector/package.json +1 -1
  189. package/templates/production-material-studio/package.json +1 -1
  190. package/templates/production-product-configurator/package.json +1 -1
  191. package/templates/production-product-viewer/package.json +1 -1
@@ -0,0 +1,315 @@
1
+ import { resolveBone } from "./boneAttach.js";
2
+ const lerp = (a, b, t) => a + (b - a) * t;
3
+ const smoothstep = (t) => (t <= 0 ? 0 : t >= 1 ? 1 : t * t * (3 - 2 * t));
4
+ export function resolveHandBounceConfig(options = {}) {
5
+ const ballRadius = options.ballRadius ?? 0.13;
6
+ const floorY = options.floorY ?? 0;
7
+ return {
8
+ hand: options.hand ?? "right",
9
+ ballRadius,
10
+ floorY,
11
+ armReach: options.armReach ?? 0.55,
12
+ ballGap: options.ballGap ?? 0.09,
13
+ standing: { period: 0.46, palmTop: 1.02, palmPush: 0.5, ...options.standing },
14
+ running: { period: 0.3, palmTop: 0.88, palmPush: 0.54, ...options.running },
15
+ runSpeed: options.runSpeed ?? 0.45,
16
+ maxOffset: options.maxOffset ?? 0.25,
17
+ leadGain: options.leadGain ?? 0.02,
18
+ leadMax: options.leadMax ?? 0.1,
19
+ phases: { rideEnd: 0.35, palmTurn: 0.6, floorAt: 0.66, catchFrom: 0.92, ...options.phases },
20
+ floorBallY: floorY + ballRadius
21
+ };
22
+ }
23
+ /** Palm height, ball height and body effort for phase `t` (0..1). `shoulderY` is the live world Y of the dribbling shoulder. */
24
+ export function handBounceCycle(config, t, shoulderY, moving = false) {
25
+ const gait = moving ? config.running : config.standing;
26
+ const { rideEnd, palmTurn, floorAt } = config.phases;
27
+ const top = Math.min(config.floorY + gait.palmTop, shoulderY - 0.3);
28
+ const push = Math.max(config.floorY + gait.palmPush, shoulderY - config.armReach);
29
+ const low = push - 0.06;
30
+ let palmY;
31
+ let effort;
32
+ if (t < rideEnd) {
33
+ const s = t / rideEnd;
34
+ effort = Math.pow(s, 1.6);
35
+ palmY = lerp(top, push, effort);
36
+ }
37
+ else if (t < palmTurn) {
38
+ const s = (t - rideEnd) / (palmTurn - rideEnd);
39
+ effort = 1;
40
+ palmY = lerp(push, low, 1 - (1 - s) * (1 - s));
41
+ }
42
+ else {
43
+ // The palm stays at its lowest until the ball has met the floor, then rises with it (it receives the ball on the way up).
44
+ const s = Math.max(0, (t - floorAt) / (1 - floorAt));
45
+ // The body stays sunk a little past the floor contact (the arm cannot follow the ball down without it), then comes up.
46
+ const e = Math.max(0, (t - floorAt - 0.08) / (1 - floorAt - 0.08));
47
+ effort = 1 - smoothstep(e);
48
+ palmY = lerp(low, top, smoothstep(s));
49
+ }
50
+ return { palmY, ballY: handBounceBallY(config, t, palmY, push - config.ballGap, top - config.ballGap), effort };
51
+ }
52
+ /**
53
+ * Ball centre height for phase `t`. `palmY` is the palm the ball rides while in contact (pass the RENDERED palm so the ball
54
+ * cannot leave a hand that could not follow its target); `releaseY` is the ball height when it leaves the palm and `catchY`
55
+ * the height of the palm that receives it. In the air the ball falls to the floor and rebounds, so the bounce point is always
56
+ * `config.floorBallY`.
57
+ */
58
+ export function handBounceBallY(config, t, palmY, releaseY, catchY) {
59
+ const { rideEnd, floorAt, catchFrom } = config.phases;
60
+ if (t < rideEnd)
61
+ return palmY - config.ballGap;
62
+ if (t < floorAt) {
63
+ const s = (t - rideEnd) / (floorAt - rideEnd);
64
+ return lerp(releaseY, config.floorBallY, Math.pow(s, 1.2));
65
+ }
66
+ if (t >= catchFrom)
67
+ return palmY - config.ballGap;
68
+ const s = (t - floorAt) / (catchFrom - floorAt);
69
+ return lerp(config.floorBallY, catchY, 1 - Math.pow(1 - s, 1.7));
70
+ }
71
+ /**
72
+ * 1 while the palm is on the ball (riding down, and the catch at the top), 0 while the ball is free in the air. Anything that
73
+ * offsets the ball from the palm (stride lead, outward nudge) is scaled by `1 - weight`, so the ball is glued to the palm at the
74
+ * contact points however fast the handler runs.
75
+ */
76
+ export function handBounceContactWeight(config, phase) {
77
+ const { rideEnd, floorAt, catchFrom } = config.phases;
78
+ const t = ((phase % 1) + 1) % 1;
79
+ if (t < rideEnd)
80
+ return 1;
81
+ if (t < floorAt)
82
+ return 1 - smoothstep((t - rideEnd) / 0.1);
83
+ if (t < catchFrom)
84
+ return smoothstep((t - floorAt - 0.1) / (catchFrom - floorAt - 0.1));
85
+ return 1;
86
+ }
87
+ /**
88
+ * Horizontal ball position: directly under the palm. While the ball is in the air a runner's ball lands a little ahead of the
89
+ * hand, only along the direction of travel and at most `leadMax`; a stationary handler gets no lead. The result is never more
90
+ * than `maxOffset` from the palm.
91
+ */
92
+ export function handBounceBallXZ(config, palm, holder, phase) {
93
+ const free = 1 - handBounceContactWeight(config, phase);
94
+ const speed = Math.hypot(holder.vx, holder.vz);
95
+ let lx = 0;
96
+ let lz = 0;
97
+ if (speed > config.runSpeed) {
98
+ const lead = Math.min(speed * config.leadGain, config.leadMax) * free;
99
+ lx = (holder.vx / speed) * lead;
100
+ lz = (holder.vz / speed) * lead;
101
+ }
102
+ const len = Math.hypot(lx, lz);
103
+ const k = len > config.maxOffset ? config.maxOffset / len : 1;
104
+ return { x: palm[0] + lx * k, z: palm[2] + lz * k };
105
+ }
106
+ /** Clamp a palm target into the arm's reach sphere around the shoulder (a target the arm cannot reach makes the hand miss the ball). */
107
+ export function clampPalmReach(shoulder, target, reach) {
108
+ const dx = target[0] - shoulder[0];
109
+ const dy = target[1] - shoulder[1];
110
+ const dz = target[2] - shoulder[2];
111
+ const d = Math.hypot(dx, dy, dz);
112
+ if (d <= reach || d < 1e-9)
113
+ return [target[0], target[1], target[2]];
114
+ const k = reach / d;
115
+ return [shoulder[0] + dx * k, shoulder[1] + dy * k, shoulder[2] + dz * k];
116
+ }
117
+ /** Upper-body pitch angles (radians, forward positive) for a handler bouncing the ball: stationary handlers crouch into the push, runners bend at the waist. */
118
+ export function handBounceOverlayAngles(effort, moving, leanScale = 1) {
119
+ if (moving) {
120
+ const lean = (1.28 + 0.77 * effort) * leanScale;
121
+ return { spine: lean * 0.55, chest: lean * 0.45, head: -lean * 0.6 };
122
+ }
123
+ return { spine: (0.3 + 0.55 * effort) * leanScale, chest: (0.2 + 0.4 * effort) * leanScale, head: -0.22 };
124
+ }
125
+ const SIDE_PREFIX = { left: "left", right: "right" };
126
+ export function createHandBounce(options = {}) {
127
+ const config = resolveHandBounceConfig(options);
128
+ const side = SIDE_PREFIX[config.hand];
129
+ const names = options.boneNames;
130
+ const pick = (role, fallback) => (names ? resolveBone(names, role) ?? fallback : fallback);
131
+ const spineName = pick("spine", "Spine");
132
+ const chestName = names ? names.find((n) => /chest/i.test(n) && !/upper/i.test(n)) ?? spineName : "Chest";
133
+ const headName = pick("head", "Head");
134
+ const armUpper = pick(`${side}UpperArm`, config.hand === "left" ? "LeftUpperArm" : "RightUpperArm");
135
+ const armFore = pick(`${side}Forearm`, config.hand === "left" ? "LeftForearm" : "RightForearm");
136
+ let phase = 0;
137
+ let moving = false;
138
+ let releaseY = config.floorBallY + 0.4;
139
+ let active = false;
140
+ let contact = 1;
141
+ let effort = 0;
142
+ let palmY = config.floorY + config.standing.palmTop;
143
+ let ball = [0, config.floorBallY, 0];
144
+ let prevBall;
145
+ let lastDt = 1 / 60;
146
+ let floorContact = false;
147
+ const placeOnPalm = (palm, holder, hold) => {
148
+ if (hold) {
149
+ ball = [palm[0], palm[1], palm[2]];
150
+ }
151
+ else {
152
+ const at = handBounceBallXZ(config, palm, holder, phase);
153
+ if (phase < config.phases.rideEnd)
154
+ releaseY = palm[1] - config.ballGap;
155
+ ball = [at.x, handBounceBallY(config, phase, palm[1], releaseY, palm[1] - config.ballGap), at.z];
156
+ }
157
+ palmY = palm[1];
158
+ floorContact = ball[1] <= config.floorBallY + 0.02;
159
+ };
160
+ const frame = () => ({ phase, moving, contact, effort, palmY, ball: [ball[0], ball[1], ball[2]], floorContact });
161
+ return {
162
+ config,
163
+ step(dt, input) {
164
+ if (!(dt > 0))
165
+ throw new Error("createHandBounce.step: dt must be a positive fixed step");
166
+ moving = input.moving ?? (input.speed ?? 0) > config.runSpeed;
167
+ const gait = moving ? config.running : config.standing;
168
+ if (!active) {
169
+ active = true;
170
+ phase = 0;
171
+ prevBall = undefined;
172
+ }
173
+ phase = input.hold ? 0 : (phase + dt / gait.period) % 1;
174
+ const cyc = handBounceCycle(config, phase, input.shoulderY, moving);
175
+ effort = input.hold ? 0 : cyc.effort;
176
+ contact = handBounceContactWeight(config, phase);
177
+ prevBall = [ball[0], ball[1], ball[2]];
178
+ lastDt = dt;
179
+ if (input.palm) {
180
+ placeOnPalm(input.palm, input.holder, Boolean(input.hold));
181
+ }
182
+ else {
183
+ palmY = cyc.palmY;
184
+ ball = [input.holder.x, cyc.ballY, input.holder.z];
185
+ }
186
+ floorContact = ball[1] <= config.floorBallY + 0.02;
187
+ return frame();
188
+ },
189
+ place(input) {
190
+ placeOnPalm(input.palm, input.holder, false);
191
+ return frame();
192
+ },
193
+ state() {
194
+ return { phase, moving, contact, effort, palmY, ball: [ball[0], ball[1], ball[2]], releaseY, floorContact, active };
195
+ },
196
+ overlay(leanScale = 1) {
197
+ const a = handBounceOverlayAngles(effort, moving, leanScale);
198
+ return {
199
+ mode: moving ? "overlay" : "pose",
200
+ effort,
201
+ bones: { [spineName]: { pitch: a.spine }, [chestName]: { pitch: a.chest }, [headName]: { pitch: a.head } },
202
+ arm: { upper: armUpper, forearm: armFore }
203
+ };
204
+ },
205
+ release() {
206
+ const dt = Math.max(lastDt, 1e-6);
207
+ const p = prevBall ?? ball;
208
+ active = false;
209
+ return {
210
+ position: [ball[0], ball[1], ball[2]],
211
+ velocity: [(ball[0] - p[0]) / dt, (ball[1] - p[1]) / dt, (ball[2] - p[2]) / dt]
212
+ };
213
+ },
214
+ pickup(at) {
215
+ active = true;
216
+ phase = config.phases.catchFrom;
217
+ releaseY = at[1];
218
+ ball = [at[0], at[1], at[2]];
219
+ prevBall = undefined;
220
+ },
221
+ reset() {
222
+ phase = 0;
223
+ active = false;
224
+ moving = false;
225
+ prevBall = undefined;
226
+ ball = [0, config.floorBallY, 0];
227
+ }
228
+ };
229
+ }
230
+ /** Limits for a stationary handler (the Aura Hoops dribble is held to these). The meet limit is ball radius + 0.05 m: `measureHandBall` replaces it with the configured radius. */
231
+ export const DEFAULT_HAND_BOUNCE_LIMITS = {
232
+ meet: 0.18, floorContact: 0.6, floorXZ: 0.12, floorPalmHeight: 0.5, floorError: 0.02, maxXZ: 0.25, maxDistance: 0.9
233
+ };
234
+ /** Limits for a running handler: the ball may land up to 0.2 m ahead of the hand, and the hand may stay up to 0.6 m above the floor. */
235
+ export const RUNNING_HAND_BOUNCE_LIMITS = {
236
+ meet: 0.18, floorContact: 0.65, floorXZ: 0.2, floorPalmHeight: 0.6, floorError: 0.02, maxXZ: 0.25, maxDistance: 0.9
237
+ };
238
+ /** Probe: feed per-frame palm and ball world positions of a dribble; returns the distances the game must keep small. Call it from QA hooks and tools/game-checks. */
239
+ export function measureHandBall(samples, options = {}) {
240
+ const config = resolveHandBounceConfig(options);
241
+ const meetDefault = config.ballRadius + 0.05;
242
+ const floorWindow = options.floorWindow ?? 0.02;
243
+ const standingLimits = { ...DEFAULT_HAND_BOUNCE_LIMITS, meet: meetDefault, ...options.limits };
244
+ const runningLimits = { ...RUNNING_HAND_BOUNCE_LIMITS, meet: meetDefault, ...options.runningLimits };
245
+ let meetMax = 0;
246
+ let floorMax = Number.NaN;
247
+ let floorXZMax = Number.NaN;
248
+ let floorPalm = Number.NaN;
249
+ let maxDistance = 0;
250
+ let maxXZ = 0;
251
+ let lowest = Infinity;
252
+ let floorSamples = 0;
253
+ let meetSamples = 0;
254
+ let used = 0;
255
+ const failures = [];
256
+ const fail = (message) => { if (!failures.includes(message))
257
+ failures.push(message); };
258
+ const worst = (cur, v) => (Number.isNaN(cur) ? v : Math.max(cur, v));
259
+ for (const s of samples) {
260
+ if (s.dribbling === false)
261
+ continue;
262
+ used += 1;
263
+ const lim = s.moving ? runningLimits : standingLimits;
264
+ const mode = s.moving ? "running" : "standing";
265
+ const d = Math.hypot(s.palm[0] - s.ball[0], s.palm[1] - s.ball[1], s.palm[2] - s.ball[2]);
266
+ const xz = Math.hypot(s.palm[0] - s.ball[0], s.palm[2] - s.ball[2]);
267
+ maxDistance = Math.max(maxDistance, d);
268
+ maxXZ = Math.max(maxXZ, xz);
269
+ lowest = Math.min(lowest, s.ball[1]);
270
+ if (xz > lim.maxXZ)
271
+ fail(`${mode}: ball strays ${xz.toFixed(3)} m horizontally from the palm > ${lim.maxXZ} m`);
272
+ if (d > lim.maxDistance)
273
+ fail(`${mode}: ball strays ${d.toFixed(3)} m from the hand > ${lim.maxDistance} m`);
274
+ const t = ((s.phase % 1) + 1) % 1;
275
+ if (t < 0.04 || t > config.phases.catchFrom + 0.01) {
276
+ meetMax = Math.max(meetMax, d);
277
+ meetSamples += 1;
278
+ if (d > lim.meet)
279
+ fail(`${mode}: palm to ball at the meet ${d.toFixed(3)} m > ${lim.meet.toFixed(2)} m`);
280
+ }
281
+ if (s.ball[1] <= config.floorBallY + floorWindow) {
282
+ const h = s.palm[1] - config.floorY;
283
+ floorMax = worst(floorMax, d);
284
+ floorXZMax = worst(floorXZMax, xz);
285
+ floorPalm = worst(floorPalm, h);
286
+ floorSamples += 1;
287
+ if (d > lim.floorContact)
288
+ fail(`${mode}: palm to ball at the floor contact ${d.toFixed(3)} m > ${lim.floorContact} m`);
289
+ if (xz > lim.floorXZ)
290
+ fail(`${mode}: horizontal palm to ball at the floor contact ${xz.toFixed(3)} m > ${lim.floorXZ} m`);
291
+ if (h > lim.floorPalmHeight)
292
+ fail(`${mode}: palm ${h.toFixed(3)} m above the floor at the floor contact > ${lim.floorPalmHeight} m`);
293
+ }
294
+ }
295
+ const floorError = used === 0 ? Number.NaN : Math.abs(lowest - config.floorBallY);
296
+ if (used === 0)
297
+ fail("no dribble samples");
298
+ if (used > 0 && floorError > standingLimits.floorError)
299
+ fail(`ball centre misses the floor by ${floorError.toFixed(3)} m > ${standingLimits.floorError} m`);
300
+ return {
301
+ samples: used,
302
+ meetMax,
303
+ floorContactMax: floorMax,
304
+ floorContactXZMax: floorXZMax,
305
+ floorContactPalmHeightMax: floorPalm,
306
+ floorError,
307
+ maxDistance,
308
+ maxXZ,
309
+ floorSamples,
310
+ meetSamples,
311
+ ok: failures.length === 0,
312
+ failures
313
+ };
314
+ }
315
+ //# sourceMappingURL=handBounce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handBounce.js","sourceRoot":"","sources":["../../../../../packages/game/src/motion/handBounce.ts"],"names":[],"mappings":"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"}
@@ -16,4 +16,10 @@ export { runMotionGate } from "./motionGate.js";
16
16
  export type { MotionGateOptions, MotionGateReport } from "./motionGate.js";
17
17
  export { clearCameraEye, createCameraClearance } from "./cameraClear.js";
18
18
  export type { CameraVec3, ClearEyeOptions, ClearEye, CameraClearanceOptions, CameraClearance } from "./cameraClear.js";
19
+ export { createHandBounce, resolveHandBounceConfig, handBounceCycle, handBounceBallY, handBounceContactWeight, handBounceBallXZ, clampPalmReach, handBounceOverlayAngles, measureHandBall, DEFAULT_HAND_BOUNCE_LIMITS, RUNNING_HAND_BOUNCE_LIMITS } from "./handBounce.js";
20
+ export type { HandBounceVec3, HandBounceGait, HandBounceOptions, HandBouncePhases, HandBounceConfig, HandBounceCycle, HandBounceOverlayBone, HandBounceOverlay, HandBounceInput, HandBounceFrame, HandBounceState, HandBounceRelease, HandBounce, HandBounceSample, HandBounceReport, HandBounceLimits } from "./handBounce.js";
21
+ export { createTwoHandGrip, solveTwoHandGrip, calibrateGripSocket, mirrorTwoHandGripBodyRig, twoHandGripBonesForEngine, relaxedTopHand, measureGrip, handCentroid, DEFAULT_GRIP_LIMITS, DEFAULT_GRIP_BONE_NAMES, solveGripTwoBone, orbitGripElbow, gripAzimuthTwist, gripQNorm, gripQMul, gripQConj, gripQAxis, gripQRot, gripQFromTo, gripQToEulerXYZ, gripQToEulerZYX, gripUnit, gripRotY, GRIP_Q_ID } from "./twoHandGrip.js";
22
+ export type { GripVec3, GripQuat, TwoHandGripBoneNames, TwoHandGripBodyRig, TwoHandGripRig, TwoHandGripTarget, TwoHandGripPrev, TwoHandGripBone, TwoHandGripPose, SolveTwoHandGripOptions, TwoHandGripState, TwoHandGrip, GripSample, GripLimits, GripPhaseReport, GripReport } from "./twoHandGrip.js";
23
+ export { wrapAngle, yawToFace, visualHeading, facingError, faceTowards } from "./facing.js";
24
+ export type { ForwardAxis, FacingTarget, FaceTowardsOptions } from "./facing.js";
19
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/game/src/motion/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,SAAS,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtI,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/F,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACpE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5H,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACrG,YAAY,EACV,iBAAiB,EAAE,oBAAoB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,EAAE,WAAW,EAC5G,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,qBAAqB,EAAE,oBAAoB,EACjF,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC7G,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/G,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClH,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAChH,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC1E,YAAY,EAAE,WAAW,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAClH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/game/src/motion/index.ts"],"names":[],"mappings":"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"}
@@ -7,4 +7,7 @@ export { checkDoubleFrame, detectSharedSkeleton, detectCoincidentModels, detectD
7
7
  export { createFixedStepPresenter, createRecordBlend } from "./presenter.js";
8
8
  export { runMotionGate } from "./motionGate.js";
9
9
  export { clearCameraEye, createCameraClearance } from "./cameraClear.js";
10
+ export { createHandBounce, resolveHandBounceConfig, handBounceCycle, handBounceBallY, handBounceContactWeight, handBounceBallXZ, clampPalmReach, handBounceOverlayAngles, measureHandBall, DEFAULT_HAND_BOUNCE_LIMITS, RUNNING_HAND_BOUNCE_LIMITS } from "./handBounce.js";
11
+ export { createTwoHandGrip, solveTwoHandGrip, calibrateGripSocket, mirrorTwoHandGripBodyRig, twoHandGripBonesForEngine, relaxedTopHand, measureGrip, handCentroid, DEFAULT_GRIP_LIMITS, DEFAULT_GRIP_BONE_NAMES, solveGripTwoBone, orbitGripElbow, gripAzimuthTwist, gripQNorm, gripQMul, gripQConj, gripQAxis, gripQRot, gripQFromTo, gripQToEulerXYZ, gripQToEulerZYX, gripUnit, gripRotY, GRIP_Q_ID } from "./twoHandGrip.js";
12
+ export { wrapAngle, yawToFace, visualHeading, facingError, faceTowards } from "./facing.js";
10
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/game/src/motion/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,SAAS,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEtI,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAKrG,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE7G,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElH,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE1E,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/game/src/motion/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,SAAS,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEtI,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAKrG,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE7G,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElH,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE1E,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtE,OAAO,EACL,gBAAgB,EAAE,uBAAuB,EAAE,eAAe,EAAE,eAAe,EAAE,uBAAuB,EAAE,gBAAgB,EACtH,cAAc,EAAE,uBAAuB,EAAE,eAAe,EAAE,0BAA0B,EAAE,0BAA0B,EACjH,MAAM,cAAc,CAAC;AAMtB,OAAO,EACL,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,cAAc,EAC7H,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,uBAAuB,EACvE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EACpH,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAChE,MAAM,eAAe,CAAC;AAKvB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Two-handed grip: a held object (bat, club, racket, staff, sword, tool) with a bottom hand at its grip point and a top hand a fixed
3
+ * spread up its axis. Two-bone IK puts both drawn palms on the handle, a forearm twist rolls the object onto the wanted direction,
4
+ * and the elbow swings around its circle of solutions until the forearm sits at the grip's own angle to that direction.
5
+ *
6
+ * Pure maths, no engine calls and no wall clock: the game feeds a pose target per fixed step and applies the returned bone
7
+ * rotations (`poseBonesForEngine`) and object transform itself. All vectors are in the actor's local frame (+Y up). The "R" hand
8
+ * is the bottom hand (at the grip point), "L" the top hand; a left-handed stance uses `mirrorTwoHandGripRig`.
9
+ */
10
+ export type GripVec3 = [number, number, number];
11
+ export type GripQuat = [number, number, number, number];
12
+ export declare const GRIP_Q_ID: GripQuat;
13
+ export declare const gripQNorm: (q: GripQuat) => GripQuat;
14
+ export declare const gripQMul: (a: GripQuat, b: GripQuat) => GripQuat;
15
+ export declare const gripQConj: (q: GripQuat) => GripQuat;
16
+ export declare const gripQAxis: (axis: GripVec3, angle: number) => GripQuat;
17
+ export declare const gripQRot: (q: GripQuat, v: GripVec3) => GripVec3;
18
+ /** Robust rotation taking normalized vector a to normalized vector b. */
19
+ export declare const gripQFromTo: (a: GripVec3, b: GripVec3) => GripQuat;
20
+ /** Quaternion to XYZ-intrinsic Euler radians (the engine's `eulerXYZFromQuat` convention). */
21
+ export declare const gripQToEulerXYZ: (q: GripQuat) => GripVec3;
22
+ /** Quaternion to Euler radians for the engine's default node rotation order "ZYX" (matrix Rz*Ry*Rx), which `setRotation(x, y, z)` on a route node uses. Applying XYZ angles to a ZYX node tilts the object the wrong way. */
23
+ export declare const gripQToEulerZYX: (q: GripQuat) => GripVec3;
24
+ export declare const gripUnit: (v: GripVec3) => GripVec3;
25
+ /** Rotate about +Y (positive angle turns +X toward -Z, the chest-yaw convention of the solver). */
26
+ export declare const gripRotY: (angle: number, v: GripVec3) => GripVec3;
27
+ /** Two-bone IK: elbow position for shoulder to target with an elbow-hint pole direction; targets past the arm's reach are clamped to it. */
28
+ export declare function solveGripTwoBone(shoulder: GripVec3, target: GripVec3, pole: GripVec3, l1: number, l2: number): GripVec3;
29
+ /** Elbow for shoulder to target with the hint pole rotated by `gamma` about the shoulder-to-target axis (the elbow's circle of solutions). */
30
+ export declare function orbitGripElbow(shoulder: GripVec3, target: GripVec3, pole: GripVec3, l1: number, l2: number, gamma: number): GripVec3;
31
+ /** Twist (radians) about `axis` that rolls the rotated grip axis `a` onto `d`, compared as azimuths about `axis` and unwrapped against `prev`. */
32
+ export declare function gripAzimuthTwist(a: GripVec3, axis: GripVec3, d: GripVec3, prev: number): number;
33
+ export interface TwoHandGripBoneNames {
34
+ readonly hips: string;
35
+ readonly spine: string;
36
+ readonly chest: string;
37
+ readonly rightUpperArm: string;
38
+ readonly rightForearm: string;
39
+ readonly leftUpperArm: string;
40
+ readonly leftForearm: string;
41
+ }
42
+ export declare const DEFAULT_GRIP_BONE_NAMES: TwoHandGripBoneNames;
43
+ /** The body half of the rig: bind skeleton measurements in the actor's local frame (+X = the character's left, +Z forward). */
44
+ export interface TwoHandGripBodyRig {
45
+ /** Chest bone position at bind (hip shifts add onto it). */
46
+ readonly chestBind: GripVec3;
47
+ /** Shoulder offsets from the chest bone at bind. */
48
+ readonly shoulderR: GripVec3;
49
+ readonly shoulderL: GripVec3;
50
+ /** Grip point in FOREARM bone space: where the drawn hand's skinned vertices actually centre in pose (measure it with the CPU skin of the solved poses, not the bind-pose centroid). */
51
+ readonly palmR: GripVec3;
52
+ readonly palmL: GripVec3;
53
+ /** Bind bone directions (shoulder to elbow, elbow to palm), unit length; the left arm's are the mirror of the right's. */
54
+ readonly bindDirUA: GripVec3;
55
+ readonly bindDirFA: GripVec3;
56
+ readonly bindDirUAL: GripVec3;
57
+ readonly bindDirFAL: GripVec3;
58
+ /** Upper arm length and elbow-to-palm length. */
59
+ readonly upperArm: number;
60
+ readonly foreHand: number;
61
+ /** Hips bone translation at bind (hip shifts add onto it). */
62
+ readonly hipsBind: GripVec3;
63
+ /** Elbow hint for the top arm (hangs down and slightly back). */
64
+ readonly poleL: GripVec3;
65
+ readonly boneNames?: TwoHandGripBoneNames;
66
+ }
67
+ /** Everything the solver needs: the body, the object's calibrated socket and the grip geometry. */
68
+ export interface TwoHandGripRig extends TwoHandGripBodyRig {
69
+ /** Rotation of the object's local grip axis (+X from the grip point toward the far end) in forearm bone space at the calibration stance. */
70
+ readonly socketRot: GripQuat;
71
+ /** Cosine of the angle between the forearm and the object axis at the calibration stance; the elbow orbits until the forearm sits at it. */
72
+ readonly coneCos: number;
73
+ /** How far up the object's axis the top hand grips (metres in actor units). */
74
+ readonly gripSpread: number;
75
+ /** Object length from the grip point and the sweet-spot distance along it (for `sweetPoint` and `tipPoint`). */
76
+ readonly objectLength: number;
77
+ readonly sweetSpot: number;
78
+ }
79
+ /** One pose target: the grip point, the object's direction, chest yaw, hip shift and the elbow hint of the bottom arm. */
80
+ export interface TwoHandGripTarget {
81
+ readonly K: GripVec3;
82
+ readonly D: GripVec3;
83
+ readonly phi: number;
84
+ readonly hip: GripVec3;
85
+ readonly pole: GripVec3;
86
+ }
87
+ export interface TwoHandGripPrev {
88
+ readonly tau?: number;
89
+ readonly tauL?: number;
90
+ readonly gamma?: number;
91
+ }
92
+ export interface TwoHandGripBone {
93
+ position?: GripVec3;
94
+ rotation?: GripQuat;
95
+ }
96
+ export interface TwoHandGripPose {
97
+ /** Bone transforms keyed by the rig's bone names; feed them to `poseBonesForEngine`. */
98
+ readonly bones: Readonly<Record<string, TwoHandGripBone>>;
99
+ readonly tau: number;
100
+ readonly tauL: number;
101
+ readonly gamma: number;
102
+ readonly qFa: GripQuat;
103
+ /** Object orientation in the actor frame (forearm rotation times the socket): its +X is `objectDir`. */
104
+ readonly objectRot: GripQuat;
105
+ readonly objectDir: GripVec3;
106
+ /** The bottom palm (the object's grip point), the top palm and the top hand's target. */
107
+ readonly palm: GripVec3;
108
+ readonly palmL: GripVec3;
109
+ readonly targetL: GripVec3;
110
+ readonly elbow: GripVec3;
111
+ readonly elbowL: GripVec3;
112
+ readonly chest: GripVec3;
113
+ readonly shoulder: GripVec3;
114
+ readonly shoulderL: GripVec3;
115
+ readonly sweetPoint: GripVec3;
116
+ readonly tipPoint: GripVec3;
117
+ /** Elbow flexion in radians (0 = straight). */
118
+ readonly flexR: number;
119
+ readonly flexL: number;
120
+ }
121
+ export interface SolveTwoHandGripOptions {
122
+ /** 0 to 1: the top hand lets go and relaxes toward its rest position (follow-through of a one-handed finish). Default 0. */
123
+ readonly release?: number;
124
+ }
125
+ /** Where the relaxed top hand hangs (actor frame), relative to its shoulder: down the arm, slightly forward. */
126
+ export declare function relaxedTopHand(rig: TwoHandGripBodyRig, shoulderL: GripVec3): GripVec3;
127
+ /**
128
+ * Calibrate the object socket from a stance: the rotation that puts the object's axis along `stanceDir` while the bottom hand holds `stanceK`
129
+ * with the given elbow hint, and the forearm-to-axis cosine the elbow orbit then holds for every other pose.
130
+ */
131
+ export declare function calibrateGripSocket(body: TwoHandGripBodyRig, stance: {
132
+ readonly K: GripVec3;
133
+ readonly D: GripVec3;
134
+ readonly phi: number;
135
+ readonly pole: GripVec3;
136
+ }): {
137
+ socketRot: GripQuat;
138
+ coneCos: number;
139
+ };
140
+ /**
141
+ * Solve one pose. The bottom hand IKs onto `K`; the elbow is swung round its circle of solutions until the forearm sits at the grip's
142
+ * fixed angle to the wanted object direction `D` (preferring the elbow nearest the previous frame's, `prev.gamma`); a forearm twist rolls
143
+ * the socketed object onto `D`; the top hand then IKs onto the point `gripSpread` up the object's real axis and rolls onto it the same way.
144
+ */
145
+ export declare function solveTwoHandGrip(rig: TwoHandGripRig, target: TwoHandGripTarget, prev?: TwoHandGripPrev, options?: SolveTwoHandGripOptions): TwoHandGripPose;
146
+ /** The same grip for the mirror-image stance (left-handed batter, golfer, hitter): x is flipped and the two arms swap roles. */
147
+ export declare function mirrorTwoHandGripBodyRig(rig: TwoHandGripBodyRig): TwoHandGripBodyRig;
148
+ /** The engine's animation pose reads `{x,y,z}` and `{x,y,z,w}` objects: tuple arrays would leave every bone untouched. */
149
+ export declare function twoHandGripBonesForEngine(bones: Readonly<Record<string, {
150
+ position?: readonly number[];
151
+ rotation?: readonly number[];
152
+ }>>): Record<string, {
153
+ position?: {
154
+ x: number;
155
+ y: number;
156
+ z: number;
157
+ };
158
+ rotation?: {
159
+ x: number;
160
+ y: number;
161
+ z: number;
162
+ w: number;
163
+ };
164
+ }>;
165
+ export interface TwoHandGripState {
166
+ readonly tau: number;
167
+ readonly tauL: number;
168
+ readonly gamma: number;
169
+ readonly release: number;
170
+ readonly steps: number;
171
+ readonly pose: TwoHandGripPose | null;
172
+ }
173
+ export interface TwoHandGrip {
174
+ readonly rig: TwoHandGripRig;
175
+ /** Solve one fixed step, carrying the elbow and twist continuity between steps. `release` (0 to 1) lets the top hand go. */
176
+ step(target: TwoHandGripTarget, release?: number): TwoHandGripPose;
177
+ state(): TwoHandGripState;
178
+ /** Forget the continuity (a new swing from the stance). */
179
+ reset(): void;
180
+ }
181
+ export declare function createTwoHandGrip(rig: TwoHandGripRig): TwoHandGrip;
182
+ /** Where the drawn palm centres: the mean of the hand's skinned vertices (a flat xyz array or a list of points). Use it so grip is measured against what the screen shows. */
183
+ export declare function handCentroid(vertices: ArrayLike<number> | ReadonlyArray<readonly [number, number, number]>): GripVec3;
184
+ export interface GripSample {
185
+ /** Label used to group samples ("stance", "load", "swing", "follow-through"). */
186
+ readonly phase?: string;
187
+ /** The object's grip point (the knob of a bat, the butt of a club) and its unit axis toward the far end; `length` is the handle length the top hand may use. */
188
+ readonly knob: readonly [number, number, number];
189
+ readonly axis: readonly [number, number, number];
190
+ readonly length?: number;
191
+ /** Palm positions: from the solver, or from `handCentroid` of the CPU-skinned hand vertices. */
192
+ readonly bottomPalm: readonly [number, number, number];
193
+ readonly topPalm: readonly [number, number, number];
194
+ }
195
+ export interface GripLimits {
196
+ /** Bottom palm to the grip point. Default 0.06 m. */
197
+ readonly knobToBottomPalm: number;
198
+ /** Top palm to the object axis. Default 0.06 m. */
199
+ readonly topPalmToAxis: number;
200
+ /** Phases allowed the looser tail limit (follow-through). */
201
+ readonly tailPhases: readonly string[];
202
+ /** The looser limit for those phases. Default 0.08 m. */
203
+ readonly tail: number;
204
+ }
205
+ export declare const DEFAULT_GRIP_LIMITS: GripLimits;
206
+ export interface GripPhaseReport {
207
+ readonly phase: string;
208
+ readonly samples: number;
209
+ readonly knobToBottomPalmMax: number;
210
+ readonly knobToBottomPalmP95: number;
211
+ readonly topPalmToAxisMax: number;
212
+ readonly topPalmToAxisP95: number;
213
+ /** Top palm distance along the axis from the knob (should sit about `gripSpread`, inside the handle). */
214
+ readonly topAlongMin: number;
215
+ readonly topAlongMax: number;
216
+ readonly limit: number;
217
+ readonly ok: boolean;
218
+ }
219
+ export interface GripReport {
220
+ readonly samples: number;
221
+ readonly phases: readonly GripPhaseReport[];
222
+ readonly knobToBottomPalmMax: number;
223
+ readonly topPalmToAxisMax: number;
224
+ readonly ok: boolean;
225
+ readonly failures: readonly string[];
226
+ }
227
+ /** Per-phase grip numbers for a recorded plate appearance, round of golf, tennis point or sword exchange: palms against the object's axis. */
228
+ export declare function measureGrip(samples: readonly GripSample[], limits?: Partial<GripLimits>): GripReport;
229
+ //# sourceMappingURL=twoHandGrip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twoHandGrip.d.ts","sourceRoot":"","sources":["../../../../../packages/game/src/motion/twoHandGrip.ts"],"names":[],"mappings":"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"}