@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.
- package/README.md +19 -0
- package/dist/AnimationAction.d.ts +40 -0
- package/dist/AnimationAction.d.ts.map +1 -0
- package/dist/AnimationAction.js +143 -0
- package/dist/AnimationAction.js.map +1 -0
- package/dist/AnimationClip.d.ts +24 -0
- package/dist/AnimationClip.d.ts.map +1 -0
- package/dist/AnimationClip.js +45 -0
- package/dist/AnimationClip.js.map +1 -0
- package/dist/AnimationClipEvents.d.ts +57 -0
- package/dist/AnimationClipEvents.d.ts.map +1 -0
- package/dist/AnimationClipEvents.js +171 -0
- package/dist/AnimationClipEvents.js.map +1 -0
- package/dist/AnimationClipRegistry.d.ts +76 -0
- package/dist/AnimationClipRegistry.d.ts.map +1 -0
- package/dist/AnimationClipRegistry.js +130 -0
- package/dist/AnimationClipRegistry.js.map +1 -0
- package/dist/AnimationController.d.ts +168 -0
- package/dist/AnimationController.d.ts.map +1 -0
- package/dist/AnimationController.js +619 -0
- package/dist/AnimationController.js.map +1 -0
- package/dist/AnimationEvents.d.ts +10 -0
- package/dist/AnimationEvents.d.ts.map +1 -0
- package/dist/AnimationEvents.js +26 -0
- package/dist/AnimationEvents.js.map +1 -0
- package/dist/AnimationLayer.d.ts +27 -0
- package/dist/AnimationLayer.d.ts.map +1 -0
- package/dist/AnimationLayer.js +53 -0
- package/dist/AnimationLayer.js.map +1 -0
- package/dist/AnimationMixer.d.ts +54 -0
- package/dist/AnimationMixer.d.ts.map +1 -0
- package/dist/AnimationMixer.js +319 -0
- package/dist/AnimationMixer.js.map +1 -0
- package/dist/AnimationStateGraph.d.ts +2 -0
- package/dist/AnimationStateGraph.d.ts.map +1 -0
- package/dist/AnimationStateGraph.js +2 -0
- package/dist/AnimationStateGraph.js.map +1 -0
- package/dist/AnimationStateMachine.d.ts +59 -0
- package/dist/AnimationStateMachine.d.ts.map +1 -0
- package/dist/AnimationStateMachine.js +154 -0
- package/dist/AnimationStateMachine.js.map +1 -0
- package/dist/AnimationTrack.d.ts +23 -0
- package/dist/AnimationTrack.d.ts.map +1 -0
- package/dist/AnimationTrack.js +124 -0
- package/dist/AnimationTrack.js.map +1 -0
- package/dist/BlendTree.d.ts +23 -0
- package/dist/BlendTree.d.ts.map +1 -0
- package/dist/BlendTree.js +68 -0
- package/dist/BlendTree.js.map +1 -0
- package/dist/Bone.d.ts +20 -0
- package/dist/Bone.d.ts.map +1 -0
- package/dist/Bone.js +24 -0
- package/dist/Bone.js.map +1 -0
- package/dist/CrowdAnimation.d.ts +13 -0
- package/dist/CrowdAnimation.d.ts.map +1 -0
- package/dist/CrowdAnimation.js +14 -0
- package/dist/CrowdAnimation.js.map +1 -0
- package/dist/ECSAnimationBridge.d.ts +9 -0
- package/dist/ECSAnimationBridge.d.ts.map +1 -0
- package/dist/ECSAnimationBridge.js +24 -0
- package/dist/ECSAnimationBridge.js.map +1 -0
- package/dist/HumanoidRetargeting.d.ts +76 -0
- package/dist/HumanoidRetargeting.d.ts.map +1 -0
- package/dist/HumanoidRetargeting.js +331 -0
- package/dist/HumanoidRetargeting.js.map +1 -0
- package/dist/IK.d.ts +24 -0
- package/dist/IK.d.ts.map +1 -0
- package/dist/IK.js +76 -0
- package/dist/IK.js.map +1 -0
- package/dist/Keyframe.d.ts +50 -0
- package/dist/Keyframe.d.ts.map +1 -0
- package/dist/Keyframe.js +118 -0
- package/dist/Keyframe.js.map +1 -0
- package/dist/LocomotionController.d.ts +47 -0
- package/dist/LocomotionController.d.ts.map +1 -0
- package/dist/LocomotionController.js +106 -0
- package/dist/LocomotionController.js.map +1 -0
- package/dist/MotionMatchingFixtures.d.ts +58 -0
- package/dist/MotionMatchingFixtures.d.ts.map +1 -0
- package/dist/MotionMatchingFixtures.js +175 -0
- package/dist/MotionMatchingFixtures.js.map +1 -0
- package/dist/MotionQuality.d.ts +36 -0
- package/dist/MotionQuality.d.ts.map +1 -0
- package/dist/MotionQuality.js +117 -0
- package/dist/MotionQuality.js.map +1 -0
- package/dist/Retargeting.d.ts +12 -0
- package/dist/Retargeting.d.ts.map +1 -0
- package/dist/Retargeting.js +19 -0
- package/dist/Retargeting.js.map +1 -0
- package/dist/RootMotion.d.ts +21 -0
- package/dist/RootMotion.d.ts.map +1 -0
- package/dist/RootMotion.js +84 -0
- package/dist/RootMotion.js.map +1 -0
- package/dist/SceneAnimationBridge.d.ts +18 -0
- package/dist/SceneAnimationBridge.d.ts.map +1 -0
- package/dist/SceneAnimationBridge.js +69 -0
- package/dist/SceneAnimationBridge.js.map +1 -0
- package/dist/SecondaryAnimationFixtures.d.ts +55 -0
- package/dist/SecondaryAnimationFixtures.d.ts.map +1 -0
- package/dist/SecondaryAnimationFixtures.js +147 -0
- package/dist/SecondaryAnimationFixtures.js.map +1 -0
- package/dist/Skeleton.d.ts +9 -0
- package/dist/Skeleton.d.ts.map +1 -0
- package/dist/Skeleton.js +31 -0
- package/dist/Skeleton.js.map +1 -0
- package/dist/Skinning.d.ts +7 -0
- package/dist/Skinning.d.ts.map +1 -0
- package/dist/Skinning.js +12 -0
- package/dist/Skinning.js.map +1 -0
- package/dist/browser-index.d.ts +39 -0
- package/dist/browser-index.d.ts.map +1 -0
- package/dist/browser-index.js +34 -0
- package/dist/browser-index.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/threejs-compatibility/AnimationAction.d.ts +16 -0
- package/dist/threejs-compatibility/AnimationAction.d.ts.map +1 -0
- package/dist/threejs-compatibility/AnimationAction.js +25 -0
- package/dist/threejs-compatibility/AnimationAction.js.map +1 -0
- package/dist/threejs-compatibility/AnimationClip.d.ts +14 -0
- package/dist/threejs-compatibility/AnimationClip.d.ts.map +1 -0
- package/dist/threejs-compatibility/AnimationClip.js +11 -0
- package/dist/threejs-compatibility/AnimationClip.js.map +1 -0
- package/dist/threejs-compatibility/AnimationDiagnostics.d.ts +44 -0
- package/dist/threejs-compatibility/AnimationDiagnostics.d.ts.map +1 -0
- package/dist/threejs-compatibility/AnimationDiagnostics.js +29 -0
- package/dist/threejs-compatibility/AnimationDiagnostics.js.map +1 -0
- package/dist/threejs-compatibility/AnimationMixer.d.ts +9 -0
- package/dist/threejs-compatibility/AnimationMixer.d.ts.map +1 -0
- package/dist/threejs-compatibility/AnimationMixer.js +24 -0
- package/dist/threejs-compatibility/AnimationMixer.js.map +1 -0
- package/dist/threejs-compatibility/MorphTargetMixer.d.ts +10 -0
- package/dist/threejs-compatibility/MorphTargetMixer.d.ts.map +1 -0
- package/dist/threejs-compatibility/MorphTargetMixer.js +10 -0
- package/dist/threejs-compatibility/MorphTargetMixer.js.map +1 -0
- package/dist/threejs-compatibility/Skeleton.d.ts +10 -0
- package/dist/threejs-compatibility/Skeleton.d.ts.map +1 -0
- package/dist/threejs-compatibility/Skeleton.js +8 -0
- package/dist/threejs-compatibility/Skeleton.js.map +1 -0
- package/dist/threejs-compatibility/SkinnedMesh.d.ts +11 -0
- package/dist/threejs-compatibility/SkinnedMesh.d.ts.map +1 -0
- package/dist/threejs-compatibility/SkinnedMesh.js +16 -0
- package/dist/threejs-compatibility/SkinnedMesh.js.map +1 -0
- package/dist/threejs-compatibility/index.d.ts +12 -0
- package/dist/threejs-compatibility/index.d.ts.map +1 -0
- package/dist/threejs-compatibility/index.js +8 -0
- package/dist/threejs-compatibility/index.js.map +1 -0
- package/package.json +17 -0
- package/src/AnimationAction.ts +166 -0
- package/src/AnimationClip.ts +63 -0
- package/src/AnimationClipEvents.ts +320 -0
- package/src/AnimationClipRegistry.ts +280 -0
- package/src/AnimationController.ts +967 -0
- package/src/AnimationEvents.ts +34 -0
- package/src/AnimationLayer.ts +73 -0
- package/src/AnimationMixer.ts +366 -0
- package/src/AnimationStateGraph.ts +8 -0
- package/src/AnimationStateMachine.ts +217 -0
- package/src/AnimationTrack.ts +176 -0
- package/src/BlendTree.ts +89 -0
- package/src/Bone.ts +35 -0
- package/src/CrowdAnimation.ts +25 -0
- package/src/ECSAnimationBridge.ts +30 -0
- package/src/HumanoidRetargeting.ts +476 -0
- package/src/IK.ts +107 -0
- package/src/Keyframe.ts +159 -0
- package/src/LocomotionController.ts +149 -0
- package/src/MotionMatchingFixtures.ts +254 -0
- package/src/MotionQuality.ts +156 -0
- package/src/Retargeting.ts +29 -0
- package/src/RootMotion.ts +124 -0
- package/src/SceneAnimationBridge.ts +80 -0
- package/src/SecondaryAnimationFixtures.ts +212 -0
- package/src/Skeleton.ts +34 -0
- package/src/Skinning.ts +18 -0
- package/src/browser-index.ts +55 -0
- package/src/index.ts +56 -0
- package/src/threejs-compatibility/AnimationAction.ts +27 -0
- package/src/threejs-compatibility/AnimationClip.ts +16 -0
- package/src/threejs-compatibility/AnimationDiagnostics.ts +42 -0
- package/src/threejs-compatibility/AnimationMixer.ts +24 -0
- package/src/threejs-compatibility/MorphTargetMixer.ts +16 -0
- package/src/threejs-compatibility/Skeleton.ts +9 -0
- package/src/threejs-compatibility/SkinnedMesh.ts +12 -0
- package/src/threejs-compatibility/index.ts +11 -0
package/dist/Keyframe.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
export function validateKeyframes(keyframes) {
|
|
2
|
+
if (keyframes.length === 0) {
|
|
3
|
+
throw new Error("Animation track requires at least one keyframe.");
|
|
4
|
+
}
|
|
5
|
+
let previous = -Number.MAX_VALUE;
|
|
6
|
+
for (const keyframe of keyframes) {
|
|
7
|
+
if (!Number.isFinite(keyframe.time) || keyframe.time < 0) {
|
|
8
|
+
throw new Error("Keyframe time must be finite and non-negative.");
|
|
9
|
+
}
|
|
10
|
+
if (keyframe.time <= previous) {
|
|
11
|
+
throw new Error("Keyframes must be sorted by strictly increasing time.");
|
|
12
|
+
}
|
|
13
|
+
previous = keyframe.time;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function serializeKeyframe(keyframe) {
|
|
17
|
+
return {
|
|
18
|
+
time: keyframe.time,
|
|
19
|
+
value: cloneAnimationValue(keyframe.value),
|
|
20
|
+
...(keyframe.interpolation ? { interpolation: keyframe.interpolation } : {}),
|
|
21
|
+
...(keyframe.inTangent !== undefined ? { inTangent: cloneAnimationValue(keyframe.inTangent) } : {}),
|
|
22
|
+
...(keyframe.outTangent !== undefined ? { outTangent: cloneAnimationValue(keyframe.outTangent) } : {})
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function deserializeKeyframe(keyframe) {
|
|
26
|
+
return serializeKeyframe(keyframe);
|
|
27
|
+
}
|
|
28
|
+
export function cloneAnimationValue(value) {
|
|
29
|
+
return Array.isArray(value) ? [...value] : value;
|
|
30
|
+
}
|
|
31
|
+
export function lerpNumber(a, b, t) {
|
|
32
|
+
return a + (b - a) * t;
|
|
33
|
+
}
|
|
34
|
+
export function lerpVec3(a, b, t) {
|
|
35
|
+
return [lerpNumber(a[0], b[0], t), lerpNumber(a[1], b[1], t), lerpNumber(a[2], b[2], t)];
|
|
36
|
+
}
|
|
37
|
+
export function normalizeQuat(q) {
|
|
38
|
+
const length = Math.hypot(q[0], q[1], q[2], q[3]);
|
|
39
|
+
if (length <= 1e-9) {
|
|
40
|
+
return [0, 0, 0, 1];
|
|
41
|
+
}
|
|
42
|
+
return [q[0] / length, q[1] / length, q[2] / length, q[3] / length];
|
|
43
|
+
}
|
|
44
|
+
export function slerpQuat(a, b, t) {
|
|
45
|
+
let bx = b[0];
|
|
46
|
+
let by = b[1];
|
|
47
|
+
let bz = b[2];
|
|
48
|
+
let bw = b[3];
|
|
49
|
+
let cos = a[0] * bx + a[1] * by + a[2] * bz + a[3] * bw;
|
|
50
|
+
if (cos < 0) {
|
|
51
|
+
cos = -cos;
|
|
52
|
+
bx = -bx;
|
|
53
|
+
by = -by;
|
|
54
|
+
bz = -bz;
|
|
55
|
+
bw = -bw;
|
|
56
|
+
}
|
|
57
|
+
if (cos > 0.9995) {
|
|
58
|
+
return normalizeQuat([lerpNumber(a[0], bx, t), lerpNumber(a[1], by, t), lerpNumber(a[2], bz, t), lerpNumber(a[3], bw, t)]);
|
|
59
|
+
}
|
|
60
|
+
const theta = Math.acos(Math.max(-1, Math.min(1, cos)));
|
|
61
|
+
const sinTheta = Math.sin(theta);
|
|
62
|
+
const wa = Math.sin((1 - t) * theta) / sinTheta;
|
|
63
|
+
const wb = Math.sin(t * theta) / sinTheta;
|
|
64
|
+
return [a[0] * wa + bx * wb, a[1] * wa + by * wb, a[2] * wa + bz * wb, a[3] * wa + bw * wb];
|
|
65
|
+
}
|
|
66
|
+
export function identityMat4() {
|
|
67
|
+
return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
|
|
68
|
+
}
|
|
69
|
+
export function composeMat4(translation = [0, 0, 0], rotation = [0, 0, 0, 1], scale = [1, 1, 1]) {
|
|
70
|
+
const [x, y, z, w] = normalizeQuat(rotation);
|
|
71
|
+
const x2 = x + x;
|
|
72
|
+
const y2 = y + y;
|
|
73
|
+
const z2 = z + z;
|
|
74
|
+
const xx = x * x2;
|
|
75
|
+
const xy = x * y2;
|
|
76
|
+
const xz = x * z2;
|
|
77
|
+
const yy = y * y2;
|
|
78
|
+
const yz = y * z2;
|
|
79
|
+
const zz = z * z2;
|
|
80
|
+
const wx = w * x2;
|
|
81
|
+
const wy = w * y2;
|
|
82
|
+
const wz = w * z2;
|
|
83
|
+
return [
|
|
84
|
+
(1 - (yy + zz)) * scale[0], (xy + wz) * scale[0], (xz - wy) * scale[0], 0,
|
|
85
|
+
(xy - wz) * scale[1], (1 - (xx + zz)) * scale[1], (yz + wx) * scale[1], 0,
|
|
86
|
+
(xz + wy) * scale[2], (yz - wx) * scale[2], (1 - (xx + yy)) * scale[2], 0,
|
|
87
|
+
translation[0], translation[1], translation[2], 1
|
|
88
|
+
];
|
|
89
|
+
}
|
|
90
|
+
export function multiplyMat4(a, b) {
|
|
91
|
+
const out = new Array(16).fill(0);
|
|
92
|
+
for (let row = 0; row < 4; row += 1) {
|
|
93
|
+
for (let col = 0; col < 4; col += 1) {
|
|
94
|
+
const a0 = a[row * 4];
|
|
95
|
+
const a1 = a[row * 4 + 1];
|
|
96
|
+
const a2 = a[row * 4 + 2];
|
|
97
|
+
const a3 = a[row * 4 + 3];
|
|
98
|
+
out[col + row * 4] =
|
|
99
|
+
a0 * b[col] +
|
|
100
|
+
a1 * b[col + 4] +
|
|
101
|
+
a2 * b[col + 8] +
|
|
102
|
+
a3 * b[col + 12];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
export function invertTranslationMat4(matrix) {
|
|
108
|
+
return [
|
|
109
|
+
matrix[0], matrix[4], matrix[8], 0,
|
|
110
|
+
matrix[1], matrix[5], matrix[9], 0,
|
|
111
|
+
matrix[2], matrix[6], matrix[10], 0,
|
|
112
|
+
-(matrix[12] * matrix[0] + matrix[13] * matrix[1] + matrix[14] * matrix[2]),
|
|
113
|
+
-(matrix[12] * matrix[4] + matrix[13] * matrix[5] + matrix[14] * matrix[6]),
|
|
114
|
+
-(matrix[12] * matrix[8] + matrix[13] * matrix[9] + matrix[14] * matrix[10]),
|
|
115
|
+
1
|
|
116
|
+
];
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=Keyframe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Keyframe.js","sourceRoot":"","sources":["../../../../packages/animation/src/Keyframe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { AnimationClip } from "./AnimationClip.js";
|
|
2
|
+
export interface LocomotionControllerState {
|
|
3
|
+
speed: number;
|
|
4
|
+
inPlace: boolean;
|
|
5
|
+
paused: boolean;
|
|
6
|
+
pathRadius: number;
|
|
7
|
+
}
|
|
8
|
+
export interface LocomotionControllerSample {
|
|
9
|
+
clipName: string;
|
|
10
|
+
clipTime: number;
|
|
11
|
+
worldX: number;
|
|
12
|
+
worldZ: number;
|
|
13
|
+
heading: number;
|
|
14
|
+
stride: number;
|
|
15
|
+
rootMotionDistance: number;
|
|
16
|
+
}
|
|
17
|
+
export interface LocomotionControllerOptions {
|
|
18
|
+
readonly clip: AnimationClip;
|
|
19
|
+
readonly rootMotionTrack?: string;
|
|
20
|
+
readonly speed?: number;
|
|
21
|
+
readonly inPlace?: boolean;
|
|
22
|
+
readonly paused?: boolean;
|
|
23
|
+
readonly pathRadius?: number;
|
|
24
|
+
readonly strideAmplitude?: number;
|
|
25
|
+
readonly rootMotionScale?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface ProceduralWalkClipOptions {
|
|
28
|
+
readonly name?: string;
|
|
29
|
+
readonly duration?: number;
|
|
30
|
+
readonly distance?: number;
|
|
31
|
+
readonly rootMotionTrack?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare class LocomotionController {
|
|
34
|
+
readonly clip: AnimationClip;
|
|
35
|
+
readonly rootMotionTrack: string;
|
|
36
|
+
readonly strideAmplitude: number;
|
|
37
|
+
readonly rootMotionScale: number;
|
|
38
|
+
readonly state: LocomotionControllerState;
|
|
39
|
+
constructor(options: LocomotionControllerOptions);
|
|
40
|
+
setSpeed(speed: number): this;
|
|
41
|
+
setInPlace(inPlace: boolean): this;
|
|
42
|
+
setPaused(paused: boolean): this;
|
|
43
|
+
setPathRadius(pathRadius: number): this;
|
|
44
|
+
sample(elapsedSeconds: number): LocomotionControllerSample;
|
|
45
|
+
}
|
|
46
|
+
export declare function createRootMotionWalkClip(options?: ProceduralWalkClipOptions): AnimationClip;
|
|
47
|
+
//# sourceMappingURL=LocomotionController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocomotionController.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/LocomotionController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInD,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,qBAAa,oBAAoB;IAC/B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC;gBAE9B,OAAO,EAAE,2BAA2B;IAgBhD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ7B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAKhC,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAQvC,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,0BAA0B;CA4B3D;AAED,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,yBAA8B,GAAG,aAAa,CAyB/F"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { AnimationClip } from "./AnimationClip.js";
|
|
2
|
+
import { AnimationTrack } from "./AnimationTrack.js";
|
|
3
|
+
import { applyRootMotion, extractRootMotion } from "./RootMotion.js";
|
|
4
|
+
export class LocomotionController {
|
|
5
|
+
clip;
|
|
6
|
+
rootMotionTrack;
|
|
7
|
+
strideAmplitude;
|
|
8
|
+
rootMotionScale;
|
|
9
|
+
state;
|
|
10
|
+
constructor(options) {
|
|
11
|
+
if (!Number.isFinite(options.clip.duration) || options.clip.duration <= 0) {
|
|
12
|
+
throw new Error("LocomotionController requires a clip with positive finite duration.");
|
|
13
|
+
}
|
|
14
|
+
this.clip = options.clip;
|
|
15
|
+
this.rootMotionTrack = options.rootMotionTrack ?? "root.position";
|
|
16
|
+
this.strideAmplitude = options.strideAmplitude ?? 1;
|
|
17
|
+
this.rootMotionScale = options.rootMotionScale ?? 1;
|
|
18
|
+
this.state = {
|
|
19
|
+
speed: options.speed ?? 1,
|
|
20
|
+
inPlace: options.inPlace ?? false,
|
|
21
|
+
paused: options.paused ?? false,
|
|
22
|
+
pathRadius: options.pathRadius ?? 1
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
setSpeed(speed) {
|
|
26
|
+
if (!Number.isFinite(speed) || speed < 0) {
|
|
27
|
+
throw new Error("LocomotionController speed must be finite and non-negative.");
|
|
28
|
+
}
|
|
29
|
+
this.state.speed = speed;
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
setInPlace(inPlace) {
|
|
33
|
+
this.state.inPlace = inPlace;
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
setPaused(paused) {
|
|
37
|
+
this.state.paused = paused;
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
setPathRadius(pathRadius) {
|
|
41
|
+
if (!Number.isFinite(pathRadius) || pathRadius <= 0) {
|
|
42
|
+
throw new Error("LocomotionController pathRadius must be positive and finite.");
|
|
43
|
+
}
|
|
44
|
+
this.state.pathRadius = pathRadius;
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
sample(elapsedSeconds) {
|
|
48
|
+
if (!Number.isFinite(elapsedSeconds) || elapsedSeconds < 0) {
|
|
49
|
+
throw new Error("LocomotionController elapsed time must be finite and non-negative.");
|
|
50
|
+
}
|
|
51
|
+
const scaledTime = this.state.paused ? 0 : elapsedSeconds * this.state.speed;
|
|
52
|
+
const previousTime = Math.max(0, scaledTime - 1 / 60);
|
|
53
|
+
const clipTime = wrapTime(scaledTime, this.clip.duration);
|
|
54
|
+
const previousClipTime = wrapTime(previousTime, this.clip.duration);
|
|
55
|
+
const target = { position: [0, 0, 0] };
|
|
56
|
+
const rootMotion = extractRootMotion(this.clip, {
|
|
57
|
+
target: this.rootMotionTrack,
|
|
58
|
+
fromTime: previousClipTime,
|
|
59
|
+
toTime: clipTime,
|
|
60
|
+
loop: true
|
|
61
|
+
});
|
|
62
|
+
applyRootMotion(target, rootMotion, this.state.inPlace ? 0 : this.rootMotionScale);
|
|
63
|
+
const rootMotionDistance = this.state.inPlace ? 0 : scaledTime * this.rootMotionScale;
|
|
64
|
+
const pathAngle = this.state.inPlace ? -0.9 : rootMotionDistance / Math.max(0.1, this.state.pathRadius);
|
|
65
|
+
return {
|
|
66
|
+
clipName: this.clip.name,
|
|
67
|
+
clipTime,
|
|
68
|
+
worldX: this.state.inPlace ? 0 : Math.sin(pathAngle) * this.state.pathRadius,
|
|
69
|
+
worldZ: this.state.inPlace ? 0 : Math.cos(pathAngle) * this.state.pathRadius,
|
|
70
|
+
heading: this.state.inPlace ? 0 : pathAngle + Math.PI / 2,
|
|
71
|
+
stride: Math.sin((clipTime / this.clip.duration) * Math.PI * 2) * this.strideAmplitude,
|
|
72
|
+
rootMotionDistance: Math.hypot(target.position[0], target.position[2]) + rootMotionDistance
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export function createRootMotionWalkClip(options = {}) {
|
|
77
|
+
const name = options.name ?? "a3d-procedural-root-walk";
|
|
78
|
+
const duration = options.duration ?? 1.2;
|
|
79
|
+
const distance = options.distance ?? 1.28;
|
|
80
|
+
const target = options.rootMotionTrack ?? "root.position";
|
|
81
|
+
if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(distance) || distance <= 0) {
|
|
82
|
+
throw new Error("Root-motion walk clip duration and distance must be positive finite values.");
|
|
83
|
+
}
|
|
84
|
+
return new AnimationClip({
|
|
85
|
+
name,
|
|
86
|
+
duration,
|
|
87
|
+
tracks: [
|
|
88
|
+
new AnimationTrack({
|
|
89
|
+
target,
|
|
90
|
+
valueType: "vector3",
|
|
91
|
+
keyframes: [
|
|
92
|
+
{ time: 0, value: [0, 0, 0], interpolation: "linear" },
|
|
93
|
+
{ time: duration * 0.25, value: [0, 0, distance * 0.25], interpolation: "linear" },
|
|
94
|
+
{ time: duration * 0.5, value: [0, 0, distance * 0.5], interpolation: "linear" },
|
|
95
|
+
{ time: duration * 0.75, value: [0, 0, distance * 0.75], interpolation: "linear" },
|
|
96
|
+
{ time: duration, value: [0, 0, distance], interpolation: "linear" }
|
|
97
|
+
]
|
|
98
|
+
})
|
|
99
|
+
]
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
function wrapTime(time, duration) {
|
|
103
|
+
const wrapped = time % duration;
|
|
104
|
+
return wrapped < 0 ? wrapped + duration : wrapped;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=LocomotionController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocomotionController.js","sourceRoot":"","sources":["../../../../packages/animation/src/LocomotionController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Vec3 } from "./Keyframe.js";
|
|
2
|
+
export interface MotionMatchingFixtureOptions {
|
|
3
|
+
readonly currentPosition?: Vec3;
|
|
4
|
+
readonly moveDirection?: Vec3;
|
|
5
|
+
readonly facingDirection?: Vec3;
|
|
6
|
+
readonly speed?: number;
|
|
7
|
+
readonly elapsedSeconds?: number;
|
|
8
|
+
readonly previousPoseId?: string;
|
|
9
|
+
readonly seed?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface MotionMatchingTrajectorySample {
|
|
12
|
+
readonly time: number;
|
|
13
|
+
readonly position: Vec3;
|
|
14
|
+
readonly direction: Vec3;
|
|
15
|
+
}
|
|
16
|
+
export interface MotionMatchingPoseCandidate {
|
|
17
|
+
readonly id: string;
|
|
18
|
+
readonly clip: "idle" | "walk" | "run" | "strafe" | "turn" | "jump";
|
|
19
|
+
readonly time: number;
|
|
20
|
+
readonly tags: readonly string[];
|
|
21
|
+
readonly rootVelocity: Vec3;
|
|
22
|
+
readonly footLeft: Vec3;
|
|
23
|
+
readonly footRight: Vec3;
|
|
24
|
+
readonly trajectory: readonly MotionMatchingTrajectorySample[];
|
|
25
|
+
}
|
|
26
|
+
export interface MotionMatchingCandidateScore {
|
|
27
|
+
readonly poseId: string;
|
|
28
|
+
readonly clip: MotionMatchingPoseCandidate["clip"];
|
|
29
|
+
readonly tags: readonly string[];
|
|
30
|
+
readonly velocityCost: number;
|
|
31
|
+
readonly facingCost: number;
|
|
32
|
+
readonly trajectoryCost: number;
|
|
33
|
+
readonly continuityCost: number;
|
|
34
|
+
readonly totalCost: number;
|
|
35
|
+
}
|
|
36
|
+
export interface MotionMatchingFixtureSample {
|
|
37
|
+
readonly id: "external-parity-old-branch-motion-matching-fixture";
|
|
38
|
+
readonly source: "origin-master-motion-matching-system-adapted";
|
|
39
|
+
readonly databasePoseCount: number;
|
|
40
|
+
readonly candidateScores: readonly MotionMatchingCandidateScore[];
|
|
41
|
+
readonly selectedPoseId: string;
|
|
42
|
+
readonly selectedClip: MotionMatchingPoseCandidate["clip"];
|
|
43
|
+
readonly selectedTags: readonly string[];
|
|
44
|
+
readonly selectedTime: number;
|
|
45
|
+
readonly transitioned: boolean;
|
|
46
|
+
readonly blendWeight: number;
|
|
47
|
+
readonly transitionDurationSeconds: number;
|
|
48
|
+
readonly queryTrajectory: readonly MotionMatchingTrajectorySample[];
|
|
49
|
+
readonly querySpeed: number;
|
|
50
|
+
readonly queryFacingAlignment: number;
|
|
51
|
+
readonly bestCost: number;
|
|
52
|
+
readonly secondBestCost: number;
|
|
53
|
+
readonly costMargin: number;
|
|
54
|
+
readonly hash: string;
|
|
55
|
+
readonly claimBoundary: string;
|
|
56
|
+
}
|
|
57
|
+
export declare function sampleMotionMatchingFixture(options?: MotionMatchingFixtureOptions): MotionMatchingFixtureSample;
|
|
58
|
+
//# sourceMappingURL=MotionMatchingFixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MotionMatchingFixtures.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/MotionMatchingFixtures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
const predictionTimes = [0.2, 0.45, 0.75];
|
|
2
|
+
export function sampleMotionMatchingFixture(options = {}) {
|
|
3
|
+
const seed = options.seed ?? 0x3d2025;
|
|
4
|
+
if (!Number.isInteger(seed))
|
|
5
|
+
throw new RangeError("Motion matching fixture seed must be an integer.");
|
|
6
|
+
const currentPosition = vec3(options.currentPosition ?? [0, 0, 0], "currentPosition");
|
|
7
|
+
const moveDirection = normalize(vec3(options.moveDirection ?? [1, 0, 0.18], "moveDirection"));
|
|
8
|
+
const facingDirection = normalize(vec3(options.facingDirection ?? [1, 0, 0], "facingDirection"));
|
|
9
|
+
const speed = clamp(finite(options.speed ?? 0.74, "speed"), 0, 1);
|
|
10
|
+
const elapsedSeconds = Math.max(0, finite(options.elapsedSeconds ?? 0, "elapsedSeconds"));
|
|
11
|
+
const maxSpeed = 6.2;
|
|
12
|
+
const queryVelocity = scale(moveDirection, speed * maxSpeed);
|
|
13
|
+
const queryTrajectory = predictionTimes.map((time) => ({
|
|
14
|
+
time,
|
|
15
|
+
position: roundVec3(add(currentPosition, scale(queryVelocity, time))),
|
|
16
|
+
direction: roundVec3(normalize(lerpVec3(moveDirection, facingDirection, Math.min(1, time * 0.8))))
|
|
17
|
+
}));
|
|
18
|
+
const database = createMotionDatabase(seed);
|
|
19
|
+
const previousPoseId = options.previousPoseId ?? database[0]?.id ?? "idle-0";
|
|
20
|
+
const scored = database
|
|
21
|
+
.map((candidate) => scoreCandidate(candidate, queryVelocity, facingDirection, queryTrajectory, previousPoseId))
|
|
22
|
+
.sort((left, right) => left.totalCost - right.totalCost);
|
|
23
|
+
const selected = scored[0];
|
|
24
|
+
if (!selected)
|
|
25
|
+
throw new Error("Motion matching fixture database is empty.");
|
|
26
|
+
const selectedPose = database.find((candidate) => candidate.id === selected.poseId);
|
|
27
|
+
if (!selectedPose)
|
|
28
|
+
throw new Error("Motion matching fixture selected an unknown pose.");
|
|
29
|
+
const secondBestCost = scored[1]?.totalCost ?? selected.totalCost;
|
|
30
|
+
const transitioned = selected.poseId !== previousPoseId;
|
|
31
|
+
const transitionDurationSeconds = 0.18;
|
|
32
|
+
const blendWeight = transitioned ? clamp(elapsedSeconds / transitionDurationSeconds, 0, 1) : 1;
|
|
33
|
+
return {
|
|
34
|
+
id: "external-parity-old-branch-motion-matching-fixture",
|
|
35
|
+
source: "origin-master-motion-matching-system-adapted",
|
|
36
|
+
databasePoseCount: database.length,
|
|
37
|
+
candidateScores: scored.slice(0, 6),
|
|
38
|
+
selectedPoseId: selected.poseId,
|
|
39
|
+
selectedClip: selected.clip,
|
|
40
|
+
selectedTags: selected.tags,
|
|
41
|
+
selectedTime: selectedPose.time,
|
|
42
|
+
transitioned,
|
|
43
|
+
blendWeight: Number(blendWeight.toFixed(4)),
|
|
44
|
+
transitionDurationSeconds,
|
|
45
|
+
queryTrajectory,
|
|
46
|
+
querySpeed: Number(length(queryVelocity).toFixed(4)),
|
|
47
|
+
queryFacingAlignment: Number(dot(moveDirection, facingDirection).toFixed(4)),
|
|
48
|
+
bestCost: selected.totalCost,
|
|
49
|
+
secondBestCost,
|
|
50
|
+
costMargin: Number((secondBestCost - selected.totalCost).toFixed(5)),
|
|
51
|
+
hash: hashMotionFixture(scored, queryTrajectory),
|
|
52
|
+
claimBoundary: "Deterministic pose-database scoring, trajectory prediction, tag filtering, continuity cost, and transition telemetry adapted from the old motion-matching system; this is bounded runtime evidence, not a full animation database, inertialization, pose application, foot locking, or Unity/Unreal animation middleware parity."
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function createMotionDatabase(seed) {
|
|
56
|
+
const clips = ["idle", "walk", "run", "strafe", "turn", "jump"];
|
|
57
|
+
return clips.flatMap((clip, clipIndex) => {
|
|
58
|
+
const speed = clip === "idle" ? 0 : clip === "walk" ? 2.1 : clip === "run" ? 5.8 : clip === "strafe" ? 3.2 : clip === "turn" ? 0.9 : 3.8;
|
|
59
|
+
const angle = clip === "strafe" ? Math.PI / 2 : clip === "turn" ? 0.62 : seeded01(seed + clipIndex * 41) * 0.14 - 0.07;
|
|
60
|
+
const direction = [Math.cos(angle), 0, Math.sin(angle)];
|
|
61
|
+
return [0, 1, 2].map((poseIndex) => {
|
|
62
|
+
const time = Number((poseIndex * 0.18 + seeded01(seed + clipIndex * 101 + poseIndex) * 0.04).toFixed(4));
|
|
63
|
+
const phase = poseIndex / 3;
|
|
64
|
+
return {
|
|
65
|
+
id: `${clip}-${poseIndex}`,
|
|
66
|
+
clip,
|
|
67
|
+
time,
|
|
68
|
+
tags: clip === "idle" ? ["idle"] : clip === "jump" ? ["action", "airborne"] : ["locomotion", clip],
|
|
69
|
+
rootVelocity: roundVec3(scale(direction, speed * (0.92 + phase * 0.12))),
|
|
70
|
+
footLeft: roundVec3([-0.16, Math.sin(phase * Math.PI * 2) * 0.08, 0.08]),
|
|
71
|
+
footRight: roundVec3([0.16, Math.sin((phase + 0.5) * Math.PI * 2) * 0.08, -0.08]),
|
|
72
|
+
trajectory: predictionTimes.map((predictionTime) => ({
|
|
73
|
+
time: predictionTime,
|
|
74
|
+
position: roundVec3(scale(direction, speed * predictionTime)),
|
|
75
|
+
direction: roundVec3(direction)
|
|
76
|
+
}))
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
function scoreCandidate(candidate, queryVelocity, facingDirection, queryTrajectory, previousPoseId) {
|
|
82
|
+
const velocityCost = distance(candidate.rootVelocity, queryVelocity);
|
|
83
|
+
const facingCost = 1 - clamp(dot(normalize(candidate.trajectory[0]?.direction ?? [1, 0, 0]), facingDirection), -1, 1);
|
|
84
|
+
const trajectoryCost = queryTrajectory.reduce((sum, query, index) => {
|
|
85
|
+
const candidateSample = candidate.trajectory[index] ?? candidate.trajectory[candidate.trajectory.length - 1];
|
|
86
|
+
return sum + distance(candidateSample.position, subtract(query.position, queryTrajectory[0]?.position ?? [0, 0, 0]));
|
|
87
|
+
}, 0) / Math.max(1, queryTrajectory.length);
|
|
88
|
+
const continuityCost = candidate.id === previousPoseId ? 0 : candidate.clip === previousPoseId.split("-")[0] ? 0.12 : 0.34;
|
|
89
|
+
const totalCost = velocityCost * 0.46 + facingCost * 1.2 + trajectoryCost * 0.38 + continuityCost;
|
|
90
|
+
return {
|
|
91
|
+
poseId: candidate.id,
|
|
92
|
+
clip: candidate.clip,
|
|
93
|
+
tags: candidate.tags,
|
|
94
|
+
velocityCost: Number(velocityCost.toFixed(5)),
|
|
95
|
+
facingCost: Number(facingCost.toFixed(5)),
|
|
96
|
+
trajectoryCost: Number(trajectoryCost.toFixed(5)),
|
|
97
|
+
continuityCost: Number(continuityCost.toFixed(5)),
|
|
98
|
+
totalCost: Number(totalCost.toFixed(5))
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function hashMotionFixture(scores, trajectory) {
|
|
102
|
+
let hash = 0x811c9dc5;
|
|
103
|
+
for (const score of scores) {
|
|
104
|
+
for (const char of `${score.poseId}:${score.totalCost}:${score.velocityCost}`) {
|
|
105
|
+
hash ^= char.charCodeAt(0);
|
|
106
|
+
hash = Math.imul(hash, 0x01000193) >>> 0;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
for (const sample of trajectory) {
|
|
110
|
+
for (const value of [sample.time, ...sample.position, ...sample.direction]) {
|
|
111
|
+
const scaled = Math.round(value * 10_000);
|
|
112
|
+
hash ^= scaled & 0xff;
|
|
113
|
+
hash = Math.imul(hash, 0x01000193) >>> 0;
|
|
114
|
+
hash ^= (scaled >>> 8) & 0xff;
|
|
115
|
+
hash = Math.imul(hash, 0x01000193) >>> 0;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return hash.toString(16).padStart(8, "0");
|
|
119
|
+
}
|
|
120
|
+
function vec3(value, label) {
|
|
121
|
+
if (value.length !== 3 || value.some((entry) => !Number.isFinite(entry))) {
|
|
122
|
+
throw new RangeError(`Motion matching fixture ${label} must contain three finite numbers.`);
|
|
123
|
+
}
|
|
124
|
+
return [value[0], value[1], value[2]];
|
|
125
|
+
}
|
|
126
|
+
function roundVec3(value) {
|
|
127
|
+
return [Number(value[0].toFixed(4)), Number(value[1].toFixed(4)), Number(value[2].toFixed(4))];
|
|
128
|
+
}
|
|
129
|
+
function add(left, right) {
|
|
130
|
+
return [left[0] + right[0], left[1] + right[1], left[2] + right[2]];
|
|
131
|
+
}
|
|
132
|
+
function subtract(left, right) {
|
|
133
|
+
return [left[0] - right[0], left[1] - right[1], left[2] - right[2]];
|
|
134
|
+
}
|
|
135
|
+
function scale(value, scalar) {
|
|
136
|
+
return [value[0] * scalar, value[1] * scalar, value[2] * scalar];
|
|
137
|
+
}
|
|
138
|
+
function lerpVec3(left, right, weight) {
|
|
139
|
+
return [
|
|
140
|
+
left[0] + (right[0] - left[0]) * weight,
|
|
141
|
+
left[1] + (right[1] - left[1]) * weight,
|
|
142
|
+
left[2] + (right[2] - left[2]) * weight
|
|
143
|
+
];
|
|
144
|
+
}
|
|
145
|
+
function dot(left, right) {
|
|
146
|
+
return left[0] * right[0] + left[1] * right[1] + left[2] * right[2];
|
|
147
|
+
}
|
|
148
|
+
function length(value) {
|
|
149
|
+
return Math.hypot(value[0], value[1], value[2]);
|
|
150
|
+
}
|
|
151
|
+
function distance(left, right) {
|
|
152
|
+
return length(subtract(left, right));
|
|
153
|
+
}
|
|
154
|
+
function normalize(value) {
|
|
155
|
+
const valueLength = length(value);
|
|
156
|
+
if (valueLength <= 1e-6)
|
|
157
|
+
return [1, 0, 0];
|
|
158
|
+
return scale(value, 1 / valueLength);
|
|
159
|
+
}
|
|
160
|
+
function finite(value, label) {
|
|
161
|
+
if (!Number.isFinite(value))
|
|
162
|
+
throw new RangeError(`Motion matching fixture ${label} must be finite.`);
|
|
163
|
+
return value;
|
|
164
|
+
}
|
|
165
|
+
function clamp(value, min, max) {
|
|
166
|
+
return Math.max(min, Math.min(max, value));
|
|
167
|
+
}
|
|
168
|
+
function seeded01(seed) {
|
|
169
|
+
let value = seed >>> 0;
|
|
170
|
+
value ^= value << 13;
|
|
171
|
+
value ^= value >>> 17;
|
|
172
|
+
value ^= value << 5;
|
|
173
|
+
return ((value >>> 0) % 10_000) / 10_000;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=MotionMatchingFixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MotionMatchingFixtures.js","sourceRoot":"","sources":["../../../../packages/animation/src/MotionMatchingFixtures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface AnimationMotionSample {
|
|
2
|
+
readonly timeSeconds: number;
|
|
3
|
+
readonly tracksApplied?: number;
|
|
4
|
+
readonly skinningPalettesUpdated?: number;
|
|
5
|
+
readonly stride?: number;
|
|
6
|
+
readonly animatedSubjects?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface AnimationMotionQualityReport {
|
|
9
|
+
readonly sampleCount: number;
|
|
10
|
+
readonly timeRangeSeconds: number;
|
|
11
|
+
readonly activeTrackFrames: number;
|
|
12
|
+
readonly activeSkinningFrames: number;
|
|
13
|
+
readonly animatedSubjectFrames: number;
|
|
14
|
+
readonly averageStride: number;
|
|
15
|
+
readonly poseDiversityScore: number;
|
|
16
|
+
readonly healthy: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface AnimationMotionQualityOptions {
|
|
19
|
+
readonly maxSamples?: number;
|
|
20
|
+
readonly minimumSamples?: number;
|
|
21
|
+
readonly minimumTimeRangeSeconds?: number;
|
|
22
|
+
readonly minimumPoseDiversityScore?: number;
|
|
23
|
+
}
|
|
24
|
+
export declare class AnimationMotionQualityTracker {
|
|
25
|
+
private readonly maxSamples;
|
|
26
|
+
private readonly minimumSamples;
|
|
27
|
+
private readonly minimumTimeRangeSeconds;
|
|
28
|
+
private readonly minimumPoseDiversityScore;
|
|
29
|
+
private readonly samples;
|
|
30
|
+
constructor(options?: AnimationMotionQualityOptions);
|
|
31
|
+
record(sample: AnimationMotionSample): AnimationMotionQualityReport;
|
|
32
|
+
report(): AnimationMotionQualityReport;
|
|
33
|
+
reset(): void;
|
|
34
|
+
}
|
|
35
|
+
export declare function summarizeAnimationMotion(samples: readonly AnimationMotionSample[], options?: Pick<AnimationMotionQualityOptions, "minimumSamples" | "minimumTimeRangeSeconds" | "minimumPoseDiversityScore">): AnimationMotionQualityReport;
|
|
36
|
+
//# sourceMappingURL=MotionQuality.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MotionQuality.d.ts","sourceRoot":"","sources":["../../../../packages/animation/src/MotionQuality.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;CAC7C;AAED,qBAAa,6BAA6B;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAS;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;gBAE3C,OAAO,GAAE,6BAAkC;IAOvD,MAAM,CAAC,MAAM,EAAE,qBAAqB,GAAG,4BAA4B;IASnE,MAAM,IAAI,4BAA4B;IAQtC,KAAK,IAAI,IAAI;CAGd;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,SAAS,qBAAqB,EAAE,EACzC,OAAO,GAAE,IAAI,CAAC,6BAA6B,EAAE,gBAAgB,GAAG,yBAAyB,GAAG,2BAA2B,CAAM,GAC5H,4BAA4B,CAgC9B"}
|