@aura3d/animation 1.0.6

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 (187) hide show
  1. package/README.md +19 -0
  2. package/dist/AnimationAction.d.ts +40 -0
  3. package/dist/AnimationAction.d.ts.map +1 -0
  4. package/dist/AnimationAction.js +143 -0
  5. package/dist/AnimationAction.js.map +1 -0
  6. package/dist/AnimationClip.d.ts +24 -0
  7. package/dist/AnimationClip.d.ts.map +1 -0
  8. package/dist/AnimationClip.js +45 -0
  9. package/dist/AnimationClip.js.map +1 -0
  10. package/dist/AnimationClipEvents.d.ts +57 -0
  11. package/dist/AnimationClipEvents.d.ts.map +1 -0
  12. package/dist/AnimationClipEvents.js +171 -0
  13. package/dist/AnimationClipEvents.js.map +1 -0
  14. package/dist/AnimationClipRegistry.d.ts +76 -0
  15. package/dist/AnimationClipRegistry.d.ts.map +1 -0
  16. package/dist/AnimationClipRegistry.js +130 -0
  17. package/dist/AnimationClipRegistry.js.map +1 -0
  18. package/dist/AnimationController.d.ts +168 -0
  19. package/dist/AnimationController.d.ts.map +1 -0
  20. package/dist/AnimationController.js +619 -0
  21. package/dist/AnimationController.js.map +1 -0
  22. package/dist/AnimationEvents.d.ts +10 -0
  23. package/dist/AnimationEvents.d.ts.map +1 -0
  24. package/dist/AnimationEvents.js +26 -0
  25. package/dist/AnimationEvents.js.map +1 -0
  26. package/dist/AnimationLayer.d.ts +27 -0
  27. package/dist/AnimationLayer.d.ts.map +1 -0
  28. package/dist/AnimationLayer.js +53 -0
  29. package/dist/AnimationLayer.js.map +1 -0
  30. package/dist/AnimationMixer.d.ts +54 -0
  31. package/dist/AnimationMixer.d.ts.map +1 -0
  32. package/dist/AnimationMixer.js +319 -0
  33. package/dist/AnimationMixer.js.map +1 -0
  34. package/dist/AnimationStateGraph.d.ts +2 -0
  35. package/dist/AnimationStateGraph.d.ts.map +1 -0
  36. package/dist/AnimationStateGraph.js +2 -0
  37. package/dist/AnimationStateGraph.js.map +1 -0
  38. package/dist/AnimationStateMachine.d.ts +59 -0
  39. package/dist/AnimationStateMachine.d.ts.map +1 -0
  40. package/dist/AnimationStateMachine.js +154 -0
  41. package/dist/AnimationStateMachine.js.map +1 -0
  42. package/dist/AnimationTrack.d.ts +23 -0
  43. package/dist/AnimationTrack.d.ts.map +1 -0
  44. package/dist/AnimationTrack.js +124 -0
  45. package/dist/AnimationTrack.js.map +1 -0
  46. package/dist/BlendTree.d.ts +23 -0
  47. package/dist/BlendTree.d.ts.map +1 -0
  48. package/dist/BlendTree.js +68 -0
  49. package/dist/BlendTree.js.map +1 -0
  50. package/dist/Bone.d.ts +20 -0
  51. package/dist/Bone.d.ts.map +1 -0
  52. package/dist/Bone.js +24 -0
  53. package/dist/Bone.js.map +1 -0
  54. package/dist/CrowdAnimation.d.ts +13 -0
  55. package/dist/CrowdAnimation.d.ts.map +1 -0
  56. package/dist/CrowdAnimation.js +14 -0
  57. package/dist/CrowdAnimation.js.map +1 -0
  58. package/dist/ECSAnimationBridge.d.ts +9 -0
  59. package/dist/ECSAnimationBridge.d.ts.map +1 -0
  60. package/dist/ECSAnimationBridge.js +24 -0
  61. package/dist/ECSAnimationBridge.js.map +1 -0
  62. package/dist/HumanoidRetargeting.d.ts +76 -0
  63. package/dist/HumanoidRetargeting.d.ts.map +1 -0
  64. package/dist/HumanoidRetargeting.js +331 -0
  65. package/dist/HumanoidRetargeting.js.map +1 -0
  66. package/dist/IK.d.ts +24 -0
  67. package/dist/IK.d.ts.map +1 -0
  68. package/dist/IK.js +76 -0
  69. package/dist/IK.js.map +1 -0
  70. package/dist/Keyframe.d.ts +50 -0
  71. package/dist/Keyframe.d.ts.map +1 -0
  72. package/dist/Keyframe.js +118 -0
  73. package/dist/Keyframe.js.map +1 -0
  74. package/dist/LocomotionController.d.ts +47 -0
  75. package/dist/LocomotionController.d.ts.map +1 -0
  76. package/dist/LocomotionController.js +106 -0
  77. package/dist/LocomotionController.js.map +1 -0
  78. package/dist/MotionMatchingFixtures.d.ts +58 -0
  79. package/dist/MotionMatchingFixtures.d.ts.map +1 -0
  80. package/dist/MotionMatchingFixtures.js +175 -0
  81. package/dist/MotionMatchingFixtures.js.map +1 -0
  82. package/dist/MotionQuality.d.ts +36 -0
  83. package/dist/MotionQuality.d.ts.map +1 -0
  84. package/dist/MotionQuality.js +117 -0
  85. package/dist/MotionQuality.js.map +1 -0
  86. package/dist/Retargeting.d.ts +12 -0
  87. package/dist/Retargeting.d.ts.map +1 -0
  88. package/dist/Retargeting.js +19 -0
  89. package/dist/Retargeting.js.map +1 -0
  90. package/dist/RootMotion.d.ts +21 -0
  91. package/dist/RootMotion.d.ts.map +1 -0
  92. package/dist/RootMotion.js +84 -0
  93. package/dist/RootMotion.js.map +1 -0
  94. package/dist/SceneAnimationBridge.d.ts +18 -0
  95. package/dist/SceneAnimationBridge.d.ts.map +1 -0
  96. package/dist/SceneAnimationBridge.js +69 -0
  97. package/dist/SceneAnimationBridge.js.map +1 -0
  98. package/dist/SecondaryAnimationFixtures.d.ts +55 -0
  99. package/dist/SecondaryAnimationFixtures.d.ts.map +1 -0
  100. package/dist/SecondaryAnimationFixtures.js +147 -0
  101. package/dist/SecondaryAnimationFixtures.js.map +1 -0
  102. package/dist/Skeleton.d.ts +9 -0
  103. package/dist/Skeleton.d.ts.map +1 -0
  104. package/dist/Skeleton.js +31 -0
  105. package/dist/Skeleton.js.map +1 -0
  106. package/dist/Skinning.d.ts +7 -0
  107. package/dist/Skinning.d.ts.map +1 -0
  108. package/dist/Skinning.js +12 -0
  109. package/dist/Skinning.js.map +1 -0
  110. package/dist/browser-index.d.ts +39 -0
  111. package/dist/browser-index.d.ts.map +1 -0
  112. package/dist/browser-index.js +34 -0
  113. package/dist/browser-index.js.map +1 -0
  114. package/dist/index.d.ts +40 -0
  115. package/dist/index.d.ts.map +1 -0
  116. package/dist/index.js +35 -0
  117. package/dist/index.js.map +1 -0
  118. package/dist/threejs-compatibility/AnimationAction.d.ts +16 -0
  119. package/dist/threejs-compatibility/AnimationAction.d.ts.map +1 -0
  120. package/dist/threejs-compatibility/AnimationAction.js +25 -0
  121. package/dist/threejs-compatibility/AnimationAction.js.map +1 -0
  122. package/dist/threejs-compatibility/AnimationClip.d.ts +14 -0
  123. package/dist/threejs-compatibility/AnimationClip.d.ts.map +1 -0
  124. package/dist/threejs-compatibility/AnimationClip.js +11 -0
  125. package/dist/threejs-compatibility/AnimationClip.js.map +1 -0
  126. package/dist/threejs-compatibility/AnimationDiagnostics.d.ts +44 -0
  127. package/dist/threejs-compatibility/AnimationDiagnostics.d.ts.map +1 -0
  128. package/dist/threejs-compatibility/AnimationDiagnostics.js +29 -0
  129. package/dist/threejs-compatibility/AnimationDiagnostics.js.map +1 -0
  130. package/dist/threejs-compatibility/AnimationMixer.d.ts +9 -0
  131. package/dist/threejs-compatibility/AnimationMixer.d.ts.map +1 -0
  132. package/dist/threejs-compatibility/AnimationMixer.js +24 -0
  133. package/dist/threejs-compatibility/AnimationMixer.js.map +1 -0
  134. package/dist/threejs-compatibility/MorphTargetMixer.d.ts +10 -0
  135. package/dist/threejs-compatibility/MorphTargetMixer.d.ts.map +1 -0
  136. package/dist/threejs-compatibility/MorphTargetMixer.js +10 -0
  137. package/dist/threejs-compatibility/MorphTargetMixer.js.map +1 -0
  138. package/dist/threejs-compatibility/Skeleton.d.ts +10 -0
  139. package/dist/threejs-compatibility/Skeleton.d.ts.map +1 -0
  140. package/dist/threejs-compatibility/Skeleton.js +8 -0
  141. package/dist/threejs-compatibility/Skeleton.js.map +1 -0
  142. package/dist/threejs-compatibility/SkinnedMesh.d.ts +11 -0
  143. package/dist/threejs-compatibility/SkinnedMesh.d.ts.map +1 -0
  144. package/dist/threejs-compatibility/SkinnedMesh.js +16 -0
  145. package/dist/threejs-compatibility/SkinnedMesh.js.map +1 -0
  146. package/dist/threejs-compatibility/index.d.ts +12 -0
  147. package/dist/threejs-compatibility/index.d.ts.map +1 -0
  148. package/dist/threejs-compatibility/index.js +8 -0
  149. package/dist/threejs-compatibility/index.js.map +1 -0
  150. package/package.json +17 -0
  151. package/src/AnimationAction.ts +166 -0
  152. package/src/AnimationClip.ts +63 -0
  153. package/src/AnimationClipEvents.ts +320 -0
  154. package/src/AnimationClipRegistry.ts +280 -0
  155. package/src/AnimationController.ts +967 -0
  156. package/src/AnimationEvents.ts +34 -0
  157. package/src/AnimationLayer.ts +73 -0
  158. package/src/AnimationMixer.ts +366 -0
  159. package/src/AnimationStateGraph.ts +8 -0
  160. package/src/AnimationStateMachine.ts +217 -0
  161. package/src/AnimationTrack.ts +176 -0
  162. package/src/BlendTree.ts +89 -0
  163. package/src/Bone.ts +35 -0
  164. package/src/CrowdAnimation.ts +25 -0
  165. package/src/ECSAnimationBridge.ts +30 -0
  166. package/src/HumanoidRetargeting.ts +476 -0
  167. package/src/IK.ts +107 -0
  168. package/src/Keyframe.ts +159 -0
  169. package/src/LocomotionController.ts +149 -0
  170. package/src/MotionMatchingFixtures.ts +254 -0
  171. package/src/MotionQuality.ts +156 -0
  172. package/src/Retargeting.ts +29 -0
  173. package/src/RootMotion.ts +124 -0
  174. package/src/SceneAnimationBridge.ts +80 -0
  175. package/src/SecondaryAnimationFixtures.ts +212 -0
  176. package/src/Skeleton.ts +34 -0
  177. package/src/Skinning.ts +18 -0
  178. package/src/browser-index.ts +55 -0
  179. package/src/index.ts +56 -0
  180. package/src/threejs-compatibility/AnimationAction.ts +27 -0
  181. package/src/threejs-compatibility/AnimationClip.ts +16 -0
  182. package/src/threejs-compatibility/AnimationDiagnostics.ts +42 -0
  183. package/src/threejs-compatibility/AnimationMixer.ts +24 -0
  184. package/src/threejs-compatibility/MorphTargetMixer.ts +16 -0
  185. package/src/threejs-compatibility/Skeleton.ts +9 -0
  186. package/src/threejs-compatibility/SkinnedMesh.ts +12 -0
  187. package/src/threejs-compatibility/index.ts +11 -0
@@ -0,0 +1,76 @@
1
+ import type { AnimationPose, AnimationPoseTransform, AnimationQuaternion, AnimationVector3 } from "./AnimationController.js";
2
+ export declare const HUMANOID_BONES: readonly ["hips", "spine", "chest", "upperChest", "neck", "head", "leftShoulder", "leftUpperArm", "leftLowerArm", "leftHand", "rightShoulder", "rightUpperArm", "rightLowerArm", "rightHand", "leftUpperLeg", "leftLowerLeg", "leftFoot", "leftToes", "rightUpperLeg", "rightLowerLeg", "rightFoot", "rightToes"];
3
+ export type HumanoidBoneName = typeof HUMANOID_BONES[number];
4
+ export type HumanoidAxis = "x" | "y" | "z" | "-x" | "-y" | "-z";
5
+ export type HumanoidRigUnits = "meters" | "centimeters" | "unknown" | (string & {});
6
+ export declare const REQUIRED_HUMANOID_BONES: readonly HumanoidBoneName[];
7
+ export interface HumanoidBoneBinding {
8
+ readonly name: string;
9
+ readonly path?: string;
10
+ readonly parent?: HumanoidBoneName | string;
11
+ readonly length?: number;
12
+ readonly position?: AnimationVector3;
13
+ readonly rotation?: AnimationQuaternion;
14
+ readonly aliases?: readonly string[];
15
+ }
16
+ export interface HumanoidRigDefinition {
17
+ readonly id: string;
18
+ readonly name?: string;
19
+ readonly bones: Partial<Record<HumanoidBoneName, HumanoidBoneBinding>>;
20
+ readonly scale?: number;
21
+ readonly units?: HumanoidRigUnits;
22
+ readonly facingAxis?: HumanoidAxis;
23
+ readonly restPose?: Partial<Record<HumanoidBoneName, AnimationPoseTransform>>;
24
+ readonly metadata?: Record<string, unknown>;
25
+ }
26
+ export type HumanoidRetargetingDiagnosticSeverity = "info" | "warning" | "error";
27
+ export interface HumanoidRetargetingDiagnostic {
28
+ readonly severity: HumanoidRetargetingDiagnosticSeverity;
29
+ readonly code: string;
30
+ readonly message: string;
31
+ readonly rigId?: string;
32
+ readonly bone?: HumanoidBoneName;
33
+ readonly sourceBone?: string;
34
+ readonly targetBone?: string;
35
+ }
36
+ export interface HumanoidRigDiagnostics {
37
+ readonly rigId: string;
38
+ readonly ok: boolean;
39
+ readonly coverage: number;
40
+ readonly requiredCoverage: number;
41
+ readonly presentRequiredBones: number;
42
+ readonly requiredBones: number;
43
+ readonly diagnostics: readonly HumanoidRetargetingDiagnostic[];
44
+ }
45
+ export interface HumanoidRetargetingOptions {
46
+ readonly minRequiredCoverage?: number;
47
+ readonly expectedFacingAxis?: HumanoidAxis;
48
+ readonly expectedUnits?: HumanoidRigUnits;
49
+ readonly requireRestPose?: boolean;
50
+ readonly requireToes?: boolean;
51
+ }
52
+ export interface HumanoidBoneRetargetBinding {
53
+ readonly bone: HumanoidBoneName;
54
+ readonly source: HumanoidBoneBinding;
55
+ readonly target: HumanoidBoneBinding;
56
+ readonly scale: number;
57
+ }
58
+ export interface HumanoidRetargetingMap {
59
+ readonly sourceRigId: string;
60
+ readonly targetRigId: string;
61
+ readonly ok: boolean;
62
+ readonly coverage: number;
63
+ readonly requiredCoverage: number;
64
+ readonly bindings: Partial<Record<HumanoidBoneName, HumanoidBoneRetargetBinding>>;
65
+ readonly diagnostics: readonly HumanoidRetargetingDiagnostic[];
66
+ }
67
+ export interface RetargetHumanoidPoseOptions {
68
+ readonly includeUnmappedSourceBones?: boolean;
69
+ readonly includeSemanticBoneNames?: boolean;
70
+ readonly scaleRootMotion?: boolean;
71
+ }
72
+ export declare function analyzeHumanoidRig(rig: HumanoidRigDefinition, options?: HumanoidRetargetingOptions): HumanoidRigDiagnostics;
73
+ export declare function createHumanoidRetargetingMap(source: HumanoidRigDefinition, target: HumanoidRigDefinition, options?: HumanoidRetargetingOptions): HumanoidRetargetingMap;
74
+ export declare function retargetHumanoidPose(sourcePose: AnimationPose, map: HumanoidRetargetingMap, options?: RetargetHumanoidPoseOptions): AnimationPose;
75
+ export declare function humanoidRetargetingDiagnostics(source: HumanoidRigDefinition, target: HumanoidRigDefinition, options?: HumanoidRetargetingOptions): readonly HumanoidRetargetingDiagnostic[];
76
+ //# sourceMappingURL=HumanoidRetargeting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HumanoidRetargeting.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/HumanoidRetargeting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,331 @@
1
+ export const HUMANOID_BONES = [
2
+ "hips",
3
+ "spine",
4
+ "chest",
5
+ "upperChest",
6
+ "neck",
7
+ "head",
8
+ "leftShoulder",
9
+ "leftUpperArm",
10
+ "leftLowerArm",
11
+ "leftHand",
12
+ "rightShoulder",
13
+ "rightUpperArm",
14
+ "rightLowerArm",
15
+ "rightHand",
16
+ "leftUpperLeg",
17
+ "leftLowerLeg",
18
+ "leftFoot",
19
+ "leftToes",
20
+ "rightUpperLeg",
21
+ "rightLowerLeg",
22
+ "rightFoot",
23
+ "rightToes"
24
+ ];
25
+ export const REQUIRED_HUMANOID_BONES = [
26
+ "hips",
27
+ "spine",
28
+ "head",
29
+ "leftUpperArm",
30
+ "leftLowerArm",
31
+ "leftHand",
32
+ "rightUpperArm",
33
+ "rightLowerArm",
34
+ "rightHand",
35
+ "leftUpperLeg",
36
+ "leftLowerLeg",
37
+ "leftFoot",
38
+ "rightUpperLeg",
39
+ "rightLowerLeg",
40
+ "rightFoot"
41
+ ];
42
+ export function analyzeHumanoidRig(rig, options = {}) {
43
+ const diagnostics = [];
44
+ const requiredBones = options.requireToes
45
+ ? [...REQUIRED_HUMANOID_BONES, "leftToes", "rightToes"]
46
+ : REQUIRED_HUMANOID_BONES;
47
+ let presentRequiredBones = 0;
48
+ if (!rig.id) {
49
+ diagnostics.push({
50
+ severity: "error",
51
+ code: "HUMANOID_RIG_ID_MISSING",
52
+ message: "Humanoid rigs must have a stable id."
53
+ });
54
+ }
55
+ for (const bone of requiredBones) {
56
+ if (rig.bones[bone]) {
57
+ presentRequiredBones += 1;
58
+ continue;
59
+ }
60
+ diagnostics.push({
61
+ severity: "error",
62
+ code: "HUMANOID_REQUIRED_BONE_MISSING",
63
+ message: `Required humanoid bone "${bone}" is missing.`,
64
+ rigId: rig.id,
65
+ bone
66
+ });
67
+ }
68
+ for (const pair of HUMANOID_SIDE_PAIRS) {
69
+ const left = rig.bones[pair.left];
70
+ const right = rig.bones[pair.right];
71
+ if ((left && !right) || (!left && right)) {
72
+ diagnostics.push({
73
+ severity: "warning",
74
+ code: "HUMANOID_SIDE_ASYMMETRY",
75
+ message: `Humanoid side pair "${pair.left}" and "${pair.right}" is incomplete.`,
76
+ rigId: rig.id,
77
+ bone: left ? pair.right : pair.left
78
+ });
79
+ }
80
+ }
81
+ const duplicateNames = findDuplicateBoneNames(rig);
82
+ for (const name of duplicateNames) {
83
+ diagnostics.push({
84
+ severity: "warning",
85
+ code: "HUMANOID_DUPLICATE_BONE_NAME",
86
+ message: `Bone node "${name}" is assigned to multiple humanoid slots.`,
87
+ rigId: rig.id
88
+ });
89
+ }
90
+ for (const bone of HUMANOID_BONES) {
91
+ const binding = rig.bones[bone];
92
+ if (!binding)
93
+ continue;
94
+ if (!binding.name) {
95
+ diagnostics.push({
96
+ severity: "error",
97
+ code: "HUMANOID_BONE_NODE_NAME_MISSING",
98
+ message: `Humanoid bone "${bone}" must reference a node name.`,
99
+ rigId: rig.id,
100
+ bone
101
+ });
102
+ }
103
+ if (binding.length !== undefined && (!Number.isFinite(binding.length) || binding.length <= 0)) {
104
+ diagnostics.push({
105
+ severity: "warning",
106
+ code: "HUMANOID_BONE_LENGTH_INVALID",
107
+ message: `Humanoid bone "${bone}" has an invalid length.`,
108
+ rigId: rig.id,
109
+ bone
110
+ });
111
+ }
112
+ if (options.requireRestPose && !rig.restPose?.[bone]) {
113
+ diagnostics.push({
114
+ severity: "warning",
115
+ code: "HUMANOID_REST_POSE_BONE_MISSING",
116
+ message: `Rest pose is missing humanoid bone "${bone}".`,
117
+ rigId: rig.id,
118
+ bone
119
+ });
120
+ }
121
+ }
122
+ if (rig.scale !== undefined && (!Number.isFinite(rig.scale) || rig.scale <= 0)) {
123
+ diagnostics.push({
124
+ severity: "error",
125
+ code: "HUMANOID_SCALE_INVALID",
126
+ message: "Humanoid rig scale must be a positive finite number.",
127
+ rigId: rig.id
128
+ });
129
+ }
130
+ if (options.expectedFacingAxis && rig.facingAxis && rig.facingAxis !== options.expectedFacingAxis) {
131
+ diagnostics.push({
132
+ severity: "warning",
133
+ code: "HUMANOID_FACING_AXIS_MISMATCH",
134
+ message: `Humanoid rig faces "${rig.facingAxis}", expected "${options.expectedFacingAxis}".`,
135
+ rigId: rig.id
136
+ });
137
+ }
138
+ if (options.expectedUnits && rig.units && rig.units !== options.expectedUnits) {
139
+ diagnostics.push({
140
+ severity: "info",
141
+ code: "HUMANOID_UNITS_MISMATCH",
142
+ message: `Humanoid rig uses "${rig.units}", expected "${options.expectedUnits}". Retargeting may need scale compensation.`,
143
+ rigId: rig.id
144
+ });
145
+ }
146
+ const requiredCoverage = requiredBones.length > 0 ? presentRequiredBones / requiredBones.length : 1;
147
+ const coverage = HUMANOID_BONES.filter((bone) => rig.bones[bone]).length / HUMANOID_BONES.length;
148
+ const minCoverage = options.minRequiredCoverage ?? 0.75;
149
+ if (requiredCoverage < minCoverage) {
150
+ diagnostics.push({
151
+ severity: "error",
152
+ code: "HUMANOID_REQUIRED_COVERAGE_LOW",
153
+ message: `Humanoid rig required-bone coverage is ${round(requiredCoverage)}; expected at least ${round(minCoverage)}.`,
154
+ rigId: rig.id
155
+ });
156
+ }
157
+ return {
158
+ rigId: rig.id,
159
+ ok: !diagnostics.some((diagnostic) => diagnostic.severity === "error"),
160
+ coverage,
161
+ requiredCoverage,
162
+ presentRequiredBones,
163
+ requiredBones: requiredBones.length,
164
+ diagnostics
165
+ };
166
+ }
167
+ export function createHumanoidRetargetingMap(source, target, options = {}) {
168
+ const diagnostics = [
169
+ ...analyzeHumanoidRig(source, options).diagnostics,
170
+ ...analyzeHumanoidRig(target, options).diagnostics
171
+ ];
172
+ const bindings = {};
173
+ const requiredBones = options.requireToes
174
+ ? [...REQUIRED_HUMANOID_BONES, "leftToes", "rightToes"]
175
+ : REQUIRED_HUMANOID_BONES;
176
+ let mappedRequiredBones = 0;
177
+ let mappedBones = 0;
178
+ for (const bone of HUMANOID_BONES) {
179
+ const sourceBinding = source.bones[bone];
180
+ const targetBinding = target.bones[bone];
181
+ if (!sourceBinding || !targetBinding) {
182
+ if (requiredBones.includes(bone)) {
183
+ diagnostics.push({
184
+ severity: "error",
185
+ code: "HUMANOID_RETARGET_REQUIRED_MAPPING_MISSING",
186
+ message: `Required retarget mapping for "${bone}" is missing.`,
187
+ rigId: target.id,
188
+ bone,
189
+ sourceBone: sourceBinding?.name,
190
+ targetBone: targetBinding?.name
191
+ });
192
+ }
193
+ continue;
194
+ }
195
+ mappedBones += 1;
196
+ if (requiredBones.includes(bone)) {
197
+ mappedRequiredBones += 1;
198
+ }
199
+ bindings[bone] = {
200
+ bone,
201
+ source: sourceBinding,
202
+ target: targetBinding,
203
+ scale: estimateBoneScale(sourceBinding, targetBinding, source.scale, target.scale)
204
+ };
205
+ }
206
+ const coverage = mappedBones / HUMANOID_BONES.length;
207
+ const requiredCoverage = requiredBones.length > 0 ? mappedRequiredBones / requiredBones.length : 1;
208
+ const minCoverage = options.minRequiredCoverage ?? 0.75;
209
+ if (requiredCoverage < minCoverage) {
210
+ diagnostics.push({
211
+ severity: "error",
212
+ code: "HUMANOID_RETARGET_COVERAGE_LOW",
213
+ message: `Humanoid retarget map required-bone coverage is ${round(requiredCoverage)}; expected at least ${round(minCoverage)}.`,
214
+ rigId: target.id
215
+ });
216
+ }
217
+ return {
218
+ sourceRigId: source.id,
219
+ targetRigId: target.id,
220
+ ok: !diagnostics.some((diagnostic) => diagnostic.severity === "error"),
221
+ coverage,
222
+ requiredCoverage,
223
+ bindings,
224
+ diagnostics
225
+ };
226
+ }
227
+ export function retargetHumanoidPose(sourcePose, map, options = {}) {
228
+ const bones = {};
229
+ if (options.includeUnmappedSourceBones) {
230
+ for (const [boneName, transform] of Object.entries(sourcePose.bones)) {
231
+ bones[boneName] = cloneTransform(transform);
232
+ }
233
+ }
234
+ for (const bone of HUMANOID_BONES) {
235
+ const binding = map.bindings[bone];
236
+ if (!binding)
237
+ continue;
238
+ const sourceTransform = sourcePose.bones[binding.source.name] ?? sourcePose.bones[bone];
239
+ if (!sourceTransform)
240
+ continue;
241
+ const retargeted = scaleTransform(sourceTransform, binding.scale);
242
+ bones[binding.target.name] = retargeted;
243
+ if (options.includeSemanticBoneNames) {
244
+ bones[bone] = retargeted;
245
+ }
246
+ }
247
+ return {
248
+ bones,
249
+ morphTargets: sourcePose.morphTargets ? { ...sourcePose.morphTargets } : undefined,
250
+ rootMotion: sourcePose.rootMotion && options.scaleRootMotion
251
+ ? {
252
+ translation: sourcePose.rootMotion.translation
253
+ ? scaleVector(sourcePose.rootMotion.translation, averageBindingScale(map))
254
+ : undefined,
255
+ rotation: sourcePose.rootMotion.rotation
256
+ }
257
+ : sourcePose.rootMotion,
258
+ metadata: {
259
+ ...sourcePose.metadata,
260
+ retargetedFrom: map.sourceRigId,
261
+ retargetedTo: map.targetRigId,
262
+ retargetingCoverage: map.requiredCoverage
263
+ }
264
+ };
265
+ }
266
+ export function humanoidRetargetingDiagnostics(source, target, options = {}) {
267
+ return createHumanoidRetargetingMap(source, target, options).diagnostics;
268
+ }
269
+ const HUMANOID_SIDE_PAIRS = [
270
+ { left: "leftShoulder", right: "rightShoulder" },
271
+ { left: "leftUpperArm", right: "rightUpperArm" },
272
+ { left: "leftLowerArm", right: "rightLowerArm" },
273
+ { left: "leftHand", right: "rightHand" },
274
+ { left: "leftUpperLeg", right: "rightUpperLeg" },
275
+ { left: "leftLowerLeg", right: "rightLowerLeg" },
276
+ { left: "leftFoot", right: "rightFoot" },
277
+ { left: "leftToes", right: "rightToes" }
278
+ ];
279
+ function findDuplicateBoneNames(rig) {
280
+ const counts = new Map();
281
+ for (const binding of Object.values(rig.bones)) {
282
+ if (!binding?.name)
283
+ continue;
284
+ counts.set(binding.name, (counts.get(binding.name) ?? 0) + 1);
285
+ }
286
+ return [...counts.entries()]
287
+ .filter(([, count]) => count > 1)
288
+ .map(([name]) => name);
289
+ }
290
+ function estimateBoneScale(source, target, sourceRigScale = 1, targetRigScale = 1) {
291
+ const sourceScale = Number.isFinite(sourceRigScale) && sourceRigScale > 0 ? sourceRigScale : 1;
292
+ const targetScale = Number.isFinite(targetRigScale) && targetRigScale > 0 ? targetRigScale : 1;
293
+ const rigScale = targetScale / sourceScale;
294
+ if (source.length && target.length && source.length > 0 && target.length > 0) {
295
+ return (target.length / source.length) * rigScale;
296
+ }
297
+ return rigScale;
298
+ }
299
+ function averageBindingScale(map) {
300
+ const scales = Object.values(map.bindings)
301
+ .map((binding) => binding?.scale)
302
+ .filter((scale) => typeof scale === "number" && Number.isFinite(scale) && scale > 0);
303
+ if (scales.length === 0)
304
+ return 1;
305
+ return scales.reduce((sum, scale) => sum + scale, 0) / scales.length;
306
+ }
307
+ function scaleTransform(transform, scale) {
308
+ return {
309
+ position: transform.position ? scaleVector(transform.position, scale) : undefined,
310
+ rotation: transform.rotation,
311
+ scale: transform.scale
312
+ };
313
+ }
314
+ function cloneTransform(transform) {
315
+ return {
316
+ position: transform.position ? { ...transform.position } : undefined,
317
+ rotation: transform.rotation ? { ...transform.rotation } : undefined,
318
+ scale: transform.scale ? { ...transform.scale } : undefined
319
+ };
320
+ }
321
+ function scaleVector(vector, scale) {
322
+ return {
323
+ x: vector.x * scale,
324
+ y: vector.y * scale,
325
+ z: vector.z * scale
326
+ };
327
+ }
328
+ function round(value) {
329
+ return Math.round(value * 1000) / 1000;
330
+ }
331
+ //# sourceMappingURL=HumanoidRetargeting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HumanoidRetargeting.js","sourceRoot":"","sources":["../../../../packages/animation/src/HumanoidRetargeting.ts"],"names":[],"mappings":"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"}
package/dist/IK.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ import { type Vec3 } from "./Keyframe.js";
2
+ export interface TwoBoneIkInput {
3
+ readonly root: Vec3;
4
+ readonly mid: Vec3;
5
+ readonly end: Vec3;
6
+ readonly target: Vec3;
7
+ readonly pole?: Vec3;
8
+ readonly weight?: number;
9
+ readonly allowStretch?: boolean;
10
+ }
11
+ export interface TwoBoneIkResult {
12
+ readonly root: Vec3;
13
+ readonly mid: Vec3;
14
+ readonly end: Vec3;
15
+ readonly reached: boolean;
16
+ readonly stretched: boolean;
17
+ readonly upperLength: number;
18
+ readonly lowerLength: number;
19
+ readonly targetDistance: number;
20
+ readonly endDistanceToTarget: number;
21
+ readonly poleInfluence: number;
22
+ }
23
+ export declare function solveTwoBoneIk(input: TwoBoneIkInput): TwoBoneIkResult;
24
+ //# sourceMappingURL=IK.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IK.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/IK.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAqCrE"}
package/dist/IK.js ADDED
@@ -0,0 +1,76 @@
1
+ import { lerpVec3 } from "./Keyframe.js";
2
+ export function solveTwoBoneIk(input) {
3
+ const weight = clamp(input.weight ?? 1, 0, 1);
4
+ const upperLength = distance(input.root, input.mid);
5
+ const lowerLength = distance(input.mid, input.end);
6
+ if (upperLength <= 1e-6 || lowerLength <= 1e-6) {
7
+ throw new Error("Two-bone IK requires non-zero upper and lower segment lengths.");
8
+ }
9
+ const targetDelta = subtract(input.target, input.root);
10
+ const targetDistance = length(targetDelta);
11
+ if (targetDistance <= 1e-6) {
12
+ throw new Error("Two-bone IK target must be distinct from the root.");
13
+ }
14
+ const maxReach = upperLength + lowerLength;
15
+ const minReach = Math.abs(upperLength - lowerLength) + 1e-5;
16
+ const solveDistance = input.allowStretch ? targetDistance : clamp(targetDistance, minReach, maxReach - 1e-5);
17
+ const axis = normalize(targetDelta);
18
+ const poleDirection = projectedPoleDirection(input.root, axis, input.pole ?? input.mid);
19
+ const adjacent = clamp((upperLength * upperLength + solveDistance * solveDistance - lowerLength * lowerLength) / (2 * solveDistance), 0, upperLength);
20
+ const height = Math.sqrt(Math.max(0, upperLength * upperLength - adjacent * adjacent));
21
+ const solvedEnd = add(input.root, scale(axis, solveDistance));
22
+ const solvedMid = add(add(input.root, scale(axis, adjacent)), scale(poleDirection, height));
23
+ const mid = lerpVec3(input.mid, solvedMid, weight);
24
+ const end = lerpVec3(input.end, solvedEnd, weight);
25
+ const endDistanceToTarget = distance(end, input.target);
26
+ return {
27
+ root: input.root,
28
+ mid,
29
+ end,
30
+ reached: endDistanceToTarget <= 1e-3,
31
+ stretched: targetDistance > maxReach && input.allowStretch === true,
32
+ upperLength,
33
+ lowerLength,
34
+ targetDistance,
35
+ endDistanceToTarget,
36
+ poleInfluence: Math.abs(dot(normalize(subtract(mid, input.root)), poleDirection))
37
+ };
38
+ }
39
+ function projectedPoleDirection(root, axis, pole) {
40
+ const poleDelta = subtract(pole, root);
41
+ const projected = subtract(poleDelta, scale(axis, dot(poleDelta, axis)));
42
+ const projectedLength = length(projected);
43
+ if (projectedLength > 1e-6)
44
+ return scale(projected, 1 / projectedLength);
45
+ const fallback = Math.abs(axis[1]) < 0.9 ? [0, 1, 0] : [1, 0, 0];
46
+ const fallbackProjected = subtract(fallback, scale(axis, dot(fallback, axis)));
47
+ return normalize(fallbackProjected);
48
+ }
49
+ function add(left, right) {
50
+ return [left[0] + right[0], left[1] + right[1], left[2] + right[2]];
51
+ }
52
+ function subtract(left, right) {
53
+ return [left[0] - right[0], left[1] - right[1], left[2] - right[2]];
54
+ }
55
+ function scale(value, scalar) {
56
+ return [value[0] * scalar, value[1] * scalar, value[2] * scalar];
57
+ }
58
+ function dot(left, right) {
59
+ return left[0] * right[0] + left[1] * right[1] + left[2] * right[2];
60
+ }
61
+ function length(value) {
62
+ return Math.hypot(value[0], value[1], value[2]);
63
+ }
64
+ function distance(left, right) {
65
+ return length(subtract(left, right));
66
+ }
67
+ function normalize(value) {
68
+ const valueLength = length(value);
69
+ if (valueLength <= 1e-6)
70
+ return [0, 1, 0];
71
+ return scale(value, 1 / valueLength);
72
+ }
73
+ function clamp(value, min, max) {
74
+ return Math.max(min, Math.min(max, value));
75
+ }
76
+ //# sourceMappingURL=IK.js.map
package/dist/IK.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IK.js","sourceRoot":"","sources":["../../../../packages/animation/src/IK.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ export type Vec3 = readonly [number, number, number];
2
+ export type Quat = readonly [number, number, number, number];
3
+ export type Mat4 = readonly [
4
+ number,
5
+ number,
6
+ number,
7
+ number,
8
+ number,
9
+ number,
10
+ number,
11
+ number,
12
+ number,
13
+ number,
14
+ number,
15
+ number,
16
+ number,
17
+ number,
18
+ number,
19
+ number
20
+ ];
21
+ export type NumberArray = readonly number[];
22
+ export type AnimationValue = number | boolean | string | Vec3 | Quat | NumberArray;
23
+ export type InterpolationMode = "step" | "linear" | "cubicspline";
24
+ export type Keyframe<T extends AnimationValue = AnimationValue> = {
25
+ readonly time: number;
26
+ readonly value: T;
27
+ readonly interpolation?: InterpolationMode;
28
+ readonly inTangent?: T;
29
+ readonly outTangent?: T;
30
+ };
31
+ export type SerializedKeyframe<T extends AnimationValue = AnimationValue> = {
32
+ readonly time: number;
33
+ readonly value: T;
34
+ readonly interpolation?: InterpolationMode;
35
+ readonly inTangent?: T;
36
+ readonly outTangent?: T;
37
+ };
38
+ export declare function validateKeyframes<T extends AnimationValue>(keyframes: readonly Keyframe<T>[]): void;
39
+ export declare function serializeKeyframe<T extends AnimationValue>(keyframe: Keyframe<T>): SerializedKeyframe<T>;
40
+ export declare function deserializeKeyframe<T extends AnimationValue>(keyframe: SerializedKeyframe<T>): Keyframe<T>;
41
+ export declare function cloneAnimationValue<T extends AnimationValue>(value: T): T;
42
+ export declare function lerpNumber(a: number, b: number, t: number): number;
43
+ export declare function lerpVec3(a: Vec3, b: Vec3, t: number): Vec3;
44
+ export declare function normalizeQuat(q: Quat): Quat;
45
+ export declare function slerpQuat(a: Quat, b: Quat, t: number): Quat;
46
+ export declare function identityMat4(): Mat4;
47
+ export declare function composeMat4(translation?: Vec3, rotation?: Quat, scale?: Vec3): Mat4;
48
+ export declare function multiplyMat4(a: Mat4, b: Mat4): Mat4;
49
+ export declare function invertTranslationMat4(matrix: Mat4): Mat4;
50
+ //# sourceMappingURL=Keyframe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Keyframe.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/Keyframe.ts"],"names":[],"mappings":"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"}