@aura3d/animation 3.0.1 → 4.0.2
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/dist/AnimationController.d.ts +8 -0
- package/dist/AnimationController.d.ts.map +1 -1
- package/dist/AnimationController.js +93 -0
- package/dist/AnimationController.js.map +1 -1
- package/dist/AnimationMixer.d.ts.map +1 -1
- package/dist/AnimationMixer.js +11 -0
- package/dist/AnimationMixer.js.map +1 -1
- package/dist/FootIk.d.ts +41 -0
- package/dist/FootIk.d.ts.map +1 -1
- package/dist/FootIk.js +202 -0
- package/dist/FootIk.js.map +1 -1
- package/dist/IK.d.ts +26 -0
- package/dist/IK.d.ts.map +1 -1
- package/dist/IK.js +515 -0
- package/dist/IK.js.map +1 -1
- package/dist/Keyframe.d.ts.map +1 -1
- package/dist/Keyframe.js +13 -12
- package/dist/Keyframe.js.map +1 -1
- package/dist/SpringBones.d.ts +80 -0
- package/dist/SpringBones.d.ts.map +1 -1
- package/dist/SpringBones.js +593 -49
- package/dist/SpringBones.js.map +1 -1
- package/dist/browser-index.d.ts +1 -1
- package/dist/browser-index.d.ts.map +1 -1
- package/dist/browser-index.js +1 -1
- package/dist/browser-index.js.map +1 -1
- package/dist/contracts/index.d.ts +2 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +7 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/pose.d.ts +25 -0
- package/dist/contracts/pose.d.ts.map +1 -0
- package/dist/contracts/pose.js +41 -0
- package/dist/contracts/pose.js.map +1 -0
- package/dist/experimental/CrowdAnimation.d.ts.map +1 -0
- package/dist/experimental/CrowdAnimation.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lanes/index.d.ts +17 -0
- package/dist/lanes/index.d.ts.map +1 -0
- package/dist/lanes/index.js +17 -0
- package/dist/lanes/index.js.map +1 -0
- package/dist/lanes/prd01.d.ts +6 -0
- package/dist/lanes/prd01.d.ts.map +1 -0
- package/dist/lanes/prd01.js +6 -0
- package/dist/lanes/prd01.js.map +1 -0
- package/dist/lanes/prd02.d.ts +6 -0
- package/dist/lanes/prd02.d.ts.map +1 -0
- package/dist/lanes/prd02.js +6 -0
- package/dist/lanes/prd02.js.map +1 -0
- package/dist/lanes/prd03.d.ts +6 -0
- package/dist/lanes/prd03.d.ts.map +1 -0
- package/dist/lanes/prd03.js +6 -0
- package/dist/lanes/prd03.js.map +1 -0
- package/dist/lanes/prd04.d.ts +6 -0
- package/dist/lanes/prd04.d.ts.map +1 -0
- package/dist/lanes/prd04.js +6 -0
- package/dist/lanes/prd04.js.map +1 -0
- package/dist/lanes/prd05.d.ts +6 -0
- package/dist/lanes/prd05.d.ts.map +1 -0
- package/dist/lanes/prd05.js +6 -0
- package/dist/lanes/prd05.js.map +1 -0
- package/dist/lanes/prd06.d.ts +37 -0
- package/dist/lanes/prd06.d.ts.map +1 -0
- package/dist/lanes/prd06.js +26 -0
- package/dist/lanes/prd06.js.map +1 -0
- package/dist/lanes/prd07.d.ts +6 -0
- package/dist/lanes/prd07.d.ts.map +1 -0
- package/dist/lanes/prd07.js +6 -0
- package/dist/lanes/prd07.js.map +1 -0
- package/dist/lanes/prd08.d.ts +6 -0
- package/dist/lanes/prd08.d.ts.map +1 -0
- package/dist/lanes/prd08.js +6 -0
- package/dist/lanes/prd08.js.map +1 -0
- package/dist/lanes/prd09.d.ts +6 -0
- package/dist/lanes/prd09.d.ts.map +1 -0
- package/dist/lanes/prd09.js +6 -0
- package/dist/lanes/prd09.js.map +1 -0
- package/dist/lanes/prd10.d.ts +6 -0
- package/dist/lanes/prd10.d.ts.map +1 -0
- package/dist/lanes/prd10.js +6 -0
- package/dist/lanes/prd10.js.map +1 -0
- package/dist/lanes/prd11.d.ts +6 -0
- package/dist/lanes/prd11.d.ts.map +1 -0
- package/dist/lanes/prd11.js +6 -0
- package/dist/lanes/prd11.js.map +1 -0
- package/dist/lanes/prd12.d.ts +6 -0
- package/dist/lanes/prd12.d.ts.map +1 -0
- package/dist/lanes/prd12.js +6 -0
- package/dist/lanes/prd12.js.map +1 -0
- package/dist/lanes/prd13.d.ts +6 -0
- package/dist/lanes/prd13.d.ts.map +1 -0
- package/dist/lanes/prd13.js +6 -0
- package/dist/lanes/prd13.js.map +1 -0
- package/dist/lanes/prd14.d.ts +6 -0
- package/dist/lanes/prd14.d.ts.map +1 -0
- package/dist/lanes/prd14.js +6 -0
- package/dist/lanes/prd14.js.map +1 -0
- package/dist/lanes/prd15.d.ts +6 -0
- package/dist/lanes/prd15.d.ts.map +1 -0
- package/dist/lanes/prd15.js +6 -0
- package/dist/lanes/prd15.js.map +1 -0
- package/dist/pose/BoneMask.d.ts +39 -0
- package/dist/pose/BoneMask.d.ts.map +1 -0
- package/dist/pose/BoneMask.js +160 -0
- package/dist/pose/BoneMask.js.map +1 -0
- package/dist/pose/CcdIkConstraint.d.ts +38 -0
- package/dist/pose/CcdIkConstraint.d.ts.map +1 -0
- package/dist/pose/CcdIkConstraint.js +198 -0
- package/dist/pose/CcdIkConstraint.js.map +1 -0
- package/dist/pose/CompiledClip.d.ts +48 -0
- package/dist/pose/CompiledClip.d.ts.map +1 -0
- package/dist/pose/CompiledClip.js +209 -0
- package/dist/pose/CompiledClip.js.map +1 -0
- package/dist/pose/LookAtConstraint.d.ts +48 -0
- package/dist/pose/LookAtConstraint.d.ts.map +1 -0
- package/dist/pose/LookAtConstraint.js +251 -0
- package/dist/pose/LookAtConstraint.js.map +1 -0
- package/dist/pose/MotionMetrics.d.ts +136 -0
- package/dist/pose/MotionMetrics.d.ts.map +1 -0
- package/dist/pose/MotionMetrics.js +253 -0
- package/dist/pose/MotionMetrics.js.map +1 -0
- package/dist/pose/PoseBuffer.d.ts +23 -0
- package/dist/pose/PoseBuffer.d.ts.map +1 -0
- package/dist/pose/PoseBuffer.js +48 -0
- package/dist/pose/PoseBuffer.js.map +1 -0
- package/dist/pose/PoseInertializer.d.ts +38 -0
- package/dist/pose/PoseInertializer.d.ts.map +1 -0
- package/dist/pose/PoseInertializer.js +208 -0
- package/dist/pose/PoseInertializer.js.map +1 -0
- package/dist/pose/PoseMixer.d.ts +256 -0
- package/dist/pose/PoseMixer.d.ts.map +1 -0
- package/dist/pose/PoseMixer.js +848 -0
- package/dist/pose/PoseMixer.js.map +1 -0
- package/dist/pose/Retarget.d.ts +77 -0
- package/dist/pose/Retarget.d.ts.map +1 -0
- package/dist/pose/Retarget.js +378 -0
- package/dist/pose/Retarget.js.map +1 -0
- package/dist/pose/RetargetCache.d.ts +21 -0
- package/dist/pose/RetargetCache.d.ts.map +1 -0
- package/dist/pose/RetargetCache.js +102 -0
- package/dist/pose/RetargetCache.js.map +1 -0
- package/dist/pose/RetargetWorker.d.ts +21 -0
- package/dist/pose/RetargetWorker.d.ts.map +1 -0
- package/dist/pose/RetargetWorker.js +56 -0
- package/dist/pose/RetargetWorker.js.map +1 -0
- package/dist/pose/SkeletonBinding.d.ts +55 -0
- package/dist/pose/SkeletonBinding.d.ts.map +1 -0
- package/dist/pose/SkeletonBinding.js +62 -0
- package/dist/pose/SkeletonBinding.js.map +1 -0
- package/dist/pose/blendKernels.d.ts +32 -0
- package/dist/pose/blendKernels.d.ts.map +1 -0
- package/dist/pose/blendKernels.js +101 -0
- package/dist/pose/blendKernels.js.map +1 -0
- package/dist/pose/makeClipAdditive.d.ts +22 -0
- package/dist/pose/makeClipAdditive.d.ts.map +1 -0
- package/dist/pose/makeClipAdditive.js +101 -0
- package/dist/pose/makeClipAdditive.js.map +1 -0
- package/dist/pose/poseMixerFlags.d.ts +18 -0
- package/dist/pose/poseMixerFlags.d.ts.map +1 -0
- package/dist/pose/poseMixerFlags.js +30 -0
- package/dist/pose/poseMixerFlags.js.map +1 -0
- package/dist/pose/quatFlat.d.ts +16 -0
- package/dist/pose/quatFlat.d.ts.map +1 -0
- package/dist/pose/quatFlat.js +88 -0
- package/dist/pose/quatFlat.js.map +1 -0
- package/dist/pose/retarget.worker.d.ts +25 -0
- package/dist/pose/retarget.worker.d.ts.map +1 -0
- package/dist/pose/retarget.worker.js +22 -0
- package/dist/pose/retarget.worker.js.map +1 -0
- package/package.json +14 -2
- package/dist/CrowdAnimation.d.ts.map +0 -1
- package/dist/CrowdAnimation.js.map +0 -1
- /package/dist/{CrowdAnimation.d.ts → experimental/CrowdAnimation.d.ts} +0 -0
- /package/dist/{CrowdAnimation.js → experimental/CrowdAnimation.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CcdIkConstraint.js","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/CcdIkConstraint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { AnimationClip } from "../AnimationClip.js";
|
|
2
|
+
import type { AnimationTrack, TrackValueType } from "../AnimationTrack.js";
|
|
3
|
+
import type { AnimationValue } from "../Keyframe.js";
|
|
4
|
+
/**
|
|
5
|
+
* PRD-06 T1.2 — clip compiled for allocation-free sampling: times/values live in
|
|
6
|
+
* flat Float32Arrays, and each playing action carries a per-track cursor
|
|
7
|
+
* (Uint32Array) so interval lookup is amortized O(1) for monotonic playback.
|
|
8
|
+
*
|
|
9
|
+
* Interpolation mirrors `AnimationTrack.sample` (LINEAR / STEP / CUBICSPLINE)
|
|
10
|
+
* with one deliberate deviation: quaternion CUBICSPLINE output is normalized
|
|
11
|
+
* directly instead of `sample`'s `slerpQuat(identity, q, 1)` — that call returns
|
|
12
|
+
* the raw cubic value un-normalized whenever |q.w| < 0.9995.
|
|
13
|
+
*/
|
|
14
|
+
export type CompiledTrackCursor = Uint32Array;
|
|
15
|
+
export type CompiledTrack = {
|
|
16
|
+
readonly target: string;
|
|
17
|
+
readonly valueType: TrackValueType;
|
|
18
|
+
readonly times: Float32Array;
|
|
19
|
+
/** Flattened numeric values (stride×keyCount); empty for boolean/string tracks. */
|
|
20
|
+
readonly values: Float32Array;
|
|
21
|
+
/** Non-numeric values for boolean/string tracks; null otherwise. */
|
|
22
|
+
readonly rawValues: readonly AnimationValue[] | null;
|
|
23
|
+
/** Flattened cubic outTangents per keyframe (only when track has cubic keys). */
|
|
24
|
+
readonly outTangents: Float32Array | null;
|
|
25
|
+
/** Flattened cubic inTangents per keyframe (only when track has cubic keys). */
|
|
26
|
+
readonly inTangents: Float32Array | null;
|
|
27
|
+
readonly stride: number;
|
|
28
|
+
/** 0 = linear, 1 = step, 2 = cubicspline; one byte per keyframe. */
|
|
29
|
+
readonly interpolation: Uint8Array;
|
|
30
|
+
readonly keyframeCount: number;
|
|
31
|
+
};
|
|
32
|
+
export type CompiledClip = {
|
|
33
|
+
readonly duration: number;
|
|
34
|
+
readonly tracks: readonly CompiledTrack[];
|
|
35
|
+
};
|
|
36
|
+
export declare function compileTrack(track: AnimationTrack): CompiledTrack;
|
|
37
|
+
export declare function compileClip(clip: AnimationClip): CompiledClip;
|
|
38
|
+
/** One cursor byte per track; callers keep this on the action and reset it on seek. */
|
|
39
|
+
export declare function createTrackCursors(clip: CompiledClip): CompiledTrackCursor;
|
|
40
|
+
/**
|
|
41
|
+
* Sample `track` at `time` into `out` at `outOffset`. For boolean/string tracks
|
|
42
|
+
* the sampled raw value is written to `out[outOffset]` via Number coercion —
|
|
43
|
+
* callers needing the raw value use `sampleRaw` instead.
|
|
44
|
+
*/
|
|
45
|
+
export declare function sampleTrackInto(track: CompiledTrack, time: number, cursor: CompiledTrackCursor, cursorIndex: number, out: Float32Array, outOffset: number): void;
|
|
46
|
+
/** Raw-value sample for boolean/string tracks (and a convenience for others). */
|
|
47
|
+
export declare function sampleTrackRaw(track: CompiledTrack, time: number, cursor: CompiledTrackCursor, cursorIndex: number): AnimationValue;
|
|
48
|
+
//# sourceMappingURL=CompiledClip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompiledClip.d.ts","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/CompiledClip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD;;;;;;;;;GASG;AAEH,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAAC;AAE9C,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,mFAAmF;IACnF,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,oEAAoE;IACpE,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,GAAG,IAAI,CAAC;IACrD,iFAAiF;IACjF,QAAQ,CAAC,WAAW,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1C,gFAAgF;IAChF,QAAQ,CAAC,UAAU,EAAE,YAAY,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;CAC3C,CAAC;AA2BF,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,aAAa,CA0DjE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,CAK7D;AAED,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,mBAAmB,CAE1E;AA+BD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,mBAAmB,EAC3B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,MAAM,GAChB,IAAI,CAuDN;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,CAkBnI"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { normalizeQuatFlat, slerpQuatFlat } from "./quatFlat.js";
|
|
2
|
+
const INTERP_LINEAR = 0;
|
|
3
|
+
const INTERP_STEP = 1;
|
|
4
|
+
const INTERP_CUBIC = 2;
|
|
5
|
+
function strideFor(valueType, first) {
|
|
6
|
+
switch (valueType) {
|
|
7
|
+
case "scalar":
|
|
8
|
+
return 1;
|
|
9
|
+
case "vector3":
|
|
10
|
+
return 3;
|
|
11
|
+
case "quaternion":
|
|
12
|
+
return 4;
|
|
13
|
+
case "number-array":
|
|
14
|
+
return first.length;
|
|
15
|
+
default:
|
|
16
|
+
return 0;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function interpolationCode(interpolation) {
|
|
20
|
+
if (interpolation === "step")
|
|
21
|
+
return INTERP_STEP;
|
|
22
|
+
if (interpolation === "cubicspline")
|
|
23
|
+
return INTERP_CUBIC;
|
|
24
|
+
return INTERP_LINEAR;
|
|
25
|
+
}
|
|
26
|
+
export function compileTrack(track) {
|
|
27
|
+
const keyframes = track.keyframes;
|
|
28
|
+
const keyframeCount = keyframes.length;
|
|
29
|
+
const times = new Float32Array(keyframeCount);
|
|
30
|
+
const interpolation = new Uint8Array(keyframeCount);
|
|
31
|
+
const stride = strideFor(track.valueType, keyframes[0].value);
|
|
32
|
+
const numeric = stride > 0;
|
|
33
|
+
const values = numeric ? new Float32Array(keyframeCount * stride) : new Float32Array(0);
|
|
34
|
+
const rawValues = numeric ? null : [];
|
|
35
|
+
let hasCubic = false;
|
|
36
|
+
for (let i = 0; i < keyframeCount; i += 1) {
|
|
37
|
+
const keyframe = keyframes[i];
|
|
38
|
+
times[i] = keyframe.time;
|
|
39
|
+
const code = interpolationCode(keyframe.interpolation);
|
|
40
|
+
interpolation[i] = code;
|
|
41
|
+
if (code === INTERP_CUBIC)
|
|
42
|
+
hasCubic = true;
|
|
43
|
+
if (numeric) {
|
|
44
|
+
const value = keyframe.value;
|
|
45
|
+
const base = i * stride;
|
|
46
|
+
if (stride === 1)
|
|
47
|
+
values[base] = value;
|
|
48
|
+
else
|
|
49
|
+
for (let k = 0; k < stride; k += 1)
|
|
50
|
+
values[base + k] = value[k];
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
rawValues.push(keyframe.value);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
let outTangents = null;
|
|
57
|
+
let inTangents = null;
|
|
58
|
+
if (hasCubic) {
|
|
59
|
+
outTangents = new Float32Array(keyframeCount * stride);
|
|
60
|
+
inTangents = new Float32Array(keyframeCount * stride);
|
|
61
|
+
for (let i = 0; i < keyframeCount; i += 1) {
|
|
62
|
+
const keyframe = keyframes[i];
|
|
63
|
+
const base = i * stride;
|
|
64
|
+
if (keyframe.outTangent !== undefined) {
|
|
65
|
+
const tangent = keyframe.outTangent;
|
|
66
|
+
for (let k = 0; k < stride; k += 1)
|
|
67
|
+
outTangents[base + k] = typeof tangent === "number" ? tangent : tangent[k];
|
|
68
|
+
}
|
|
69
|
+
if (keyframe.inTangent !== undefined) {
|
|
70
|
+
const tangent = keyframe.inTangent;
|
|
71
|
+
for (let k = 0; k < stride; k += 1)
|
|
72
|
+
inTangents[base + k] = typeof tangent === "number" ? tangent : tangent[k];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
target: track.target,
|
|
78
|
+
valueType: track.valueType,
|
|
79
|
+
times,
|
|
80
|
+
values,
|
|
81
|
+
rawValues,
|
|
82
|
+
outTangents,
|
|
83
|
+
inTangents,
|
|
84
|
+
stride,
|
|
85
|
+
interpolation,
|
|
86
|
+
keyframeCount
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export function compileClip(clip) {
|
|
90
|
+
return {
|
|
91
|
+
duration: clip.duration,
|
|
92
|
+
tracks: clip.tracks.map((track) => compileTrack(track))
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** One cursor byte per track; callers keep this on the action and reset it on seek. */
|
|
96
|
+
export function createTrackCursors(clip) {
|
|
97
|
+
return new Uint32Array(clip.tracks.length);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Locate the keyframe interval containing `time`, using `cursor` (a slot in the
|
|
101
|
+
* action's Uint32Array) as a search hint. Returns the index of the first
|
|
102
|
+
* keyframe of the interval, or -1 when `time` is outside the clip range (caller
|
|
103
|
+
* clamps to the first/last keyframe in that case).
|
|
104
|
+
*/
|
|
105
|
+
function locateInterval(track, time, cursor, cursorIndex) {
|
|
106
|
+
const times = track.times;
|
|
107
|
+
const lastInterval = track.keyframeCount - 2;
|
|
108
|
+
let i = cursor[cursorIndex];
|
|
109
|
+
if (i > lastInterval)
|
|
110
|
+
i = lastInterval;
|
|
111
|
+
while (i < lastInterval && time > times[i + 1])
|
|
112
|
+
i += 1;
|
|
113
|
+
while (i > 0 && time < times[i])
|
|
114
|
+
i -= 1;
|
|
115
|
+
cursor[cursorIndex] = i;
|
|
116
|
+
if (time < times[0] || time > times[track.keyframeCount - 1])
|
|
117
|
+
return -1;
|
|
118
|
+
return i;
|
|
119
|
+
}
|
|
120
|
+
function cubicHermite(a, b, outTangent, inTangent, t, deltaTime) {
|
|
121
|
+
const t2 = t * t;
|
|
122
|
+
const t3 = t2 * t;
|
|
123
|
+
return ((2 * t3 - 3 * t2 + 1) * a +
|
|
124
|
+
(t3 - 2 * t2 + t) * deltaTime * outTangent +
|
|
125
|
+
(-2 * t3 + 3 * t2) * b +
|
|
126
|
+
(t3 - t2) * deltaTime * inTangent);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Sample `track` at `time` into `out` at `outOffset`. For boolean/string tracks
|
|
130
|
+
* the sampled raw value is written to `out[outOffset]` via Number coercion —
|
|
131
|
+
* callers needing the raw value use `sampleRaw` instead.
|
|
132
|
+
*/
|
|
133
|
+
export function sampleTrackInto(track, time, cursor, cursorIndex, out, outOffset) {
|
|
134
|
+
const stride = track.stride;
|
|
135
|
+
const keyframeCount = track.keyframeCount;
|
|
136
|
+
const times = track.times;
|
|
137
|
+
const values = track.values;
|
|
138
|
+
if (time <= times[0]) {
|
|
139
|
+
for (let k = 0; k < stride; k += 1)
|
|
140
|
+
out[outOffset + k] = values[k];
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (time >= times[keyframeCount - 1]) {
|
|
144
|
+
const base = (keyframeCount - 1) * stride;
|
|
145
|
+
for (let k = 0; k < stride; k += 1)
|
|
146
|
+
out[outOffset + k] = values[base + k];
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const i = locateInterval(track, time, cursor, cursorIndex);
|
|
150
|
+
const aBase = i * stride;
|
|
151
|
+
const bBase = (i + 1) * stride;
|
|
152
|
+
const aTime = times[i];
|
|
153
|
+
const bTime = times[i + 1];
|
|
154
|
+
const interp = track.interpolation[i];
|
|
155
|
+
if (interp === INTERP_STEP || bTime === aTime) {
|
|
156
|
+
for (let k = 0; k < stride; k += 1)
|
|
157
|
+
out[outOffset + k] = values[aBase + k];
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const t = (time - aTime) / (bTime - aTime);
|
|
161
|
+
if (interp === INTERP_CUBIC) {
|
|
162
|
+
const deltaTime = bTime - aTime;
|
|
163
|
+
const outTangents = track.outTangents;
|
|
164
|
+
const inTangents = track.inTangents;
|
|
165
|
+
for (let k = 0; k < stride; k += 1) {
|
|
166
|
+
out[outOffset + k] = cubicHermite(values[aBase + k], values[bBase + k], outTangents[aBase + k], inTangents[bBase + k], t, deltaTime);
|
|
167
|
+
}
|
|
168
|
+
if (track.valueType === "quaternion")
|
|
169
|
+
normalizeQuatFlat(out, outOffset);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
if (track.valueType === "quaternion") {
|
|
173
|
+
slerpQuatFlat(out, outOffset, values, aBase, values, bBase, t);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
for (let k = 0; k < stride; k += 1) {
|
|
177
|
+
out[outOffset + k] = values[aBase + k] + (values[bBase + k] - values[aBase + k]) * t;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/** Raw-value sample for boolean/string tracks (and a convenience for others). */
|
|
181
|
+
export function sampleTrackRaw(track, time, cursor, cursorIndex) {
|
|
182
|
+
const times = track.times;
|
|
183
|
+
const keyframeCount = track.keyframeCount;
|
|
184
|
+
if (time <= times[0])
|
|
185
|
+
return track.rawValues ? track.rawValues[0] : firstNumeric(track);
|
|
186
|
+
if (time >= times[keyframeCount - 1]) {
|
|
187
|
+
return track.rawValues ? track.rawValues[keyframeCount - 1] : lastNumeric(track);
|
|
188
|
+
}
|
|
189
|
+
const i = locateInterval(track, time, cursor, cursorIndex);
|
|
190
|
+
const bTime = times[i + 1];
|
|
191
|
+
const t = (time - times[i]) / (bTime - times[i]);
|
|
192
|
+
if (track.rawValues) {
|
|
193
|
+
const interp = track.interpolation[i];
|
|
194
|
+
if (interp === INTERP_STEP || t < 1)
|
|
195
|
+
return track.rawValues[i];
|
|
196
|
+
return track.rawValues[i + 1];
|
|
197
|
+
}
|
|
198
|
+
const scratch = new Float32Array(track.stride);
|
|
199
|
+
sampleTrackInto(track, time, cursor, cursorIndex, scratch, 0);
|
|
200
|
+
return [...scratch];
|
|
201
|
+
}
|
|
202
|
+
function firstNumeric(track) {
|
|
203
|
+
return track.stride === 1 ? track.values[0] : [...track.values.subarray(0, track.stride)];
|
|
204
|
+
}
|
|
205
|
+
function lastNumeric(track) {
|
|
206
|
+
const base = (track.keyframeCount - 1) * track.stride;
|
|
207
|
+
return track.stride === 1 ? track.values[base] : [...track.values.subarray(base, base + track.stride)];
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=CompiledClip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompiledClip.js","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/CompiledClip.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAsCjE,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,SAAS,SAAS,CAAC,SAAyB,EAAE,KAAqB;IACjE,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC;QACX,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC;QACX,KAAK,YAAY;YACf,OAAO,CAAC,CAAC;QACX,KAAK,cAAc;YACjB,OAAQ,KAA2B,CAAC,MAAM,CAAC;QAC7C;YACE,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,aAAiC;IAC1D,IAAI,aAAa,KAAK,MAAM;QAAE,OAAO,WAAW,CAAC;IACjD,IAAI,aAAa,KAAK,aAAa;QAAE,OAAO,YAAY,CAAC;IACzD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAqB;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IAClC,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,SAAS,GAA4B,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;QAC/B,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;QACzB,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACvD,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACxB,IAAI,IAAI,KAAK,YAAY;YAAE,QAAQ,GAAG,IAAI,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC7B,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC;YACxB,IAAI,MAAM,KAAK,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAe,CAAC;;gBAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC;oBAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAI,KAA2B,CAAC,CAAC,CAAE,CAAC;QAC/F,CAAC;aAAM,CAAC;YACN,SAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,IAAI,WAAW,GAAwB,IAAI,CAAC;IAC5C,IAAI,UAAU,GAAwB,IAAI,CAAC;IAC3C,IAAI,QAAQ,EAAE,CAAC;QACb,WAAW,GAAG,IAAI,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC,CAAC;QACvD,UAAU,GAAG,IAAI,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC,CAAC;QACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC;YACxB,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC;gBACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC;oBAAE,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,OAA6B,CAAC,CAAC,CAAE,CAAC;YACzI,CAAC;YACD,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC;gBACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC;oBAAE,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,OAA6B,CAAC,CAAC,CAAE,CAAC;YACxI,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK;QACL,MAAM;QACN,SAAS;QACT,WAAW;QACX,UAAU;QACV,MAAM;QACN,aAAa;QACb,aAAa;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAmB;IAC7C,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,kBAAkB,CAAC,IAAkB;IACnD,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,KAAoB,EAAE,IAAY,EAAE,MAA2B,EAAE,WAAmB;IAC1G,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAE,CAAC;IAC7B,IAAI,CAAC,GAAG,YAAY;QAAE,CAAC,GAAG,YAAY,CAAC;IACvC,OAAO,CAAC,GAAG,YAAY,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE;QAAE,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE;QAAE,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAE;QAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,YAAY,CAAC,CAAS,EAAE,CAAS,EAAE,UAAkB,EAAE,SAAiB,EAAE,CAAS,EAAE,SAAiB;IAC7G,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAClB,OAAO,CACL,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC;QACzB,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,UAAU;QAC1C,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;QACtB,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,SAAS,GAAG,SAAS,CAClC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAoB,EACpB,IAAY,EACZ,MAA2B,EAC3B,WAAmB,EACnB,GAAiB,EACjB,SAAiB;IAEjB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAE5B,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACpE,OAAO;IACT,CAAC;IACD,IAAI,IAAI,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,CAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,CAAE,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC;IACzB,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IACxB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAE,CAAC;IAEvC,IAAI,MAAM,KAAK,WAAW,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;IAE3C,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;QAChC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAY,CAAC;QACvC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAW,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,YAAY,CAC/B,MAAM,CAAC,KAAK,GAAG,CAAC,CAAE,EAClB,MAAM,CAAC,KAAK,GAAG,CAAC,CAAE,EAClB,WAAW,CAAC,KAAK,GAAG,CAAC,CAAE,EACvB,UAAU,CAAC,KAAK,GAAG,CAAC,CAAE,EACtB,CAAC,EACD,SAAS,CACV,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY;YAAE,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACxE,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE,CAAC;QACrC,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAE,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAE,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAAC,KAAoB,EAAE,IAAY,EAAE,MAA2B,EAAE,WAAmB;IACjH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAC1C,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,CAAE;QAAE,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1F,IAAI,IAAI,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,CAAE,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;IAC5B,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IACnD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAE,CAAC;QACvC,IAAI,MAAM,KAAK,WAAW,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC;QAChE,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;IACjC,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/C,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,OAAO,CAAmB,CAAC;AACxC,CAAC;AAED,SAAS,YAAY,CAAC,KAAoB;IACxC,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAoB,CAAC;AACjH,CAAC;AACD,SAAS,WAAW,CAAC,KAAoB;IACvC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACtD,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAE,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAoB,CAAC;AAC9H,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* T3.3 (PRD-06 §7.1/7.2) — `LookAtConstraint`: pose-space look-at that
|
|
3
|
+
* distributes the required yaw/pitch across the named bones by weight,
|
|
4
|
+
* enforces `yawLimitDeg`/`pitchLimitDeg` on the aggregate rotation, and
|
|
5
|
+
* smooths applied angles with a critically-damped spring (`halfLife`,
|
|
6
|
+
* default 0.12 s — same convention as PoseInertializer).
|
|
7
|
+
*
|
|
8
|
+
* Stateful: the spring keeps per-constraint applied yaw/pitch; ±180° targets
|
|
9
|
+
* unwrap against the previous applied yaw so sweeping behind the character
|
|
10
|
+
* never snaps sign.
|
|
11
|
+
*
|
|
12
|
+
* `eyes` (optional bone names) aim directly at the target after the weighted
|
|
13
|
+
* pass — eye saccades are instant, not spring-smoothed.
|
|
14
|
+
*/
|
|
15
|
+
import type { PoseBuffer } from "./PoseBuffer.js";
|
|
16
|
+
import type { SkeletonBinding } from "./SkeletonBinding.js";
|
|
17
|
+
export interface LookAtConstraintSpec {
|
|
18
|
+
/** Weighted chain (e.g. spine 0.25 / neck 0.35 / head 0.4). Weights need not sum to 1. */
|
|
19
|
+
readonly bones: readonly {
|
|
20
|
+
readonly bone: string;
|
|
21
|
+
readonly weight: number;
|
|
22
|
+
}[];
|
|
23
|
+
/** Model-space forward axis of the bones (default "+z"). */
|
|
24
|
+
readonly forwardAxis?: "+z" | "-z" | "+y";
|
|
25
|
+
/** Aggregate yaw cap about the model-space up axis (default 90°). */
|
|
26
|
+
readonly yawLimitDeg?: number;
|
|
27
|
+
/** Aggregate pitch cap about the rotated right axis (default 60°). */
|
|
28
|
+
readonly pitchLimitDeg?: number;
|
|
29
|
+
/** Optional eye bones that aim at the target directly (full correction). */
|
|
30
|
+
readonly eyes?: readonly string[];
|
|
31
|
+
/** Critically-damped smoothing half-life in seconds (default 0.12). */
|
|
32
|
+
readonly halfLife?: number;
|
|
33
|
+
}
|
|
34
|
+
type Vec3 = readonly [number, number, number];
|
|
35
|
+
export interface LookAtConstraint {
|
|
36
|
+
/** Apply the constraint: writes local rotations of the spec's bones. */
|
|
37
|
+
apply(pose: PoseBuffer, skeleton: SkeletonBinding, modelMatrix: Float32Array | readonly number[], target: Vec3, dt: number): void;
|
|
38
|
+
/** Current smoothed yaw/pitch (radians) — diagnostics. */
|
|
39
|
+
readonly smoothed: {
|
|
40
|
+
readonly yaw: number;
|
|
41
|
+
readonly pitch: number;
|
|
42
|
+
};
|
|
43
|
+
/** Reset the spring (e.g. on teleport). */
|
|
44
|
+
reset(): void;
|
|
45
|
+
}
|
|
46
|
+
export declare function createLookAtConstraint(spec: LookAtConstraintSpec): LookAtConstraint;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=LookAtConstraint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LookAtConstraint.d.ts","sourceRoot":"","sources":["../../../../../packages/animation/src/pose/LookAtConstraint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,WAAW,oBAAoB;IACnC,0FAA0F;IAC1F,QAAQ,CAAC,KAAK,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9E,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1C,qEAAqE;IACrE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,sEAAsE;IACtE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,KAAK,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AA4G9C,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,GAAG,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClI,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE,2CAA2C;IAC3C,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,gBAAgB,CA8InF"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* T3.3 (PRD-06 §7.1/7.2) — `LookAtConstraint`: pose-space look-at that
|
|
3
|
+
* distributes the required yaw/pitch across the named bones by weight,
|
|
4
|
+
* enforces `yawLimitDeg`/`pitchLimitDeg` on the aggregate rotation, and
|
|
5
|
+
* smooths applied angles with a critically-damped spring (`halfLife`,
|
|
6
|
+
* default 0.12 s — same convention as PoseInertializer).
|
|
7
|
+
*
|
|
8
|
+
* Stateful: the spring keeps per-constraint applied yaw/pitch; ±180° targets
|
|
9
|
+
* unwrap against the previous applied yaw so sweeping behind the character
|
|
10
|
+
* never snaps sign.
|
|
11
|
+
*
|
|
12
|
+
* `eyes` (optional bone names) aim directly at the target after the weighted
|
|
13
|
+
* pass — eye saccades are instant, not spring-smoothed.
|
|
14
|
+
*/
|
|
15
|
+
const UP = [0, 1, 0];
|
|
16
|
+
function jointIndex(skeleton, name) {
|
|
17
|
+
const indices = skeleton.jointIndicesByName.get(name);
|
|
18
|
+
if (!indices || indices.length === 0)
|
|
19
|
+
throw new Error(`LookAtConstraint: unknown bone "${name}".`);
|
|
20
|
+
return indices[0];
|
|
21
|
+
}
|
|
22
|
+
function jointFrame(pose, skeleton, joint, cache) {
|
|
23
|
+
const cached = cache.get(joint);
|
|
24
|
+
if (cached)
|
|
25
|
+
return cached;
|
|
26
|
+
const pos = [pose.positions[joint * 3], pose.positions[joint * 3 + 1], pose.positions[joint * 3 + 2]];
|
|
27
|
+
const rot = [pose.rotations[joint * 4], pose.rotations[joint * 4 + 1], pose.rotations[joint * 4 + 2], pose.rotations[joint * 4 + 3]];
|
|
28
|
+
const scl = [pose.scales[joint * 3], pose.scales[joint * 3 + 1], pose.scales[joint * 3 + 2]];
|
|
29
|
+
const parent = skeleton.parentIndices[joint] ?? -1;
|
|
30
|
+
if (parent < 0 || parent >= skeleton.boneCount || parent === joint) {
|
|
31
|
+
const frame = { position: pos, rotation: rot, scale: scl };
|
|
32
|
+
cache.set(joint, frame);
|
|
33
|
+
return frame;
|
|
34
|
+
}
|
|
35
|
+
const pf = jointFrame(pose, skeleton, parent, cache);
|
|
36
|
+
const scaled = [pos[0] * pf.scale[0], pos[1] * pf.scale[1], pos[2] * pf.scale[2]];
|
|
37
|
+
const rotated = rotateVec3(pf.rotation, scaled);
|
|
38
|
+
const frame = {
|
|
39
|
+
position: [pf.position[0] + rotated[0], pf.position[1] + rotated[1], pf.position[2] + rotated[2]],
|
|
40
|
+
rotation: multiplyQuat(pf.rotation, rot),
|
|
41
|
+
scale: [pf.scale[0] * scl[0], pf.scale[1] * scl[1], pf.scale[2] * scl[2]]
|
|
42
|
+
};
|
|
43
|
+
cache.set(joint, frame);
|
|
44
|
+
return frame;
|
|
45
|
+
}
|
|
46
|
+
function rotateVec3(q, v) {
|
|
47
|
+
const [x, y, z, w] = q;
|
|
48
|
+
const tx = 2 * (y * v[2] - z * v[1]);
|
|
49
|
+
const ty = 2 * (z * v[0] - x * v[2]);
|
|
50
|
+
const tz = 2 * (x * v[1] - y * v[0]);
|
|
51
|
+
return [v[0] + w * tx + (y * tz - z * ty), v[1] + w * ty + (z * tx - x * tz), v[2] + w * tz + (x * ty - y * tx)];
|
|
52
|
+
}
|
|
53
|
+
function multiplyQuat(a, b) {
|
|
54
|
+
const [ax, ay, az, aw] = a;
|
|
55
|
+
const [bx, by, bz, bw] = b;
|
|
56
|
+
return [
|
|
57
|
+
ax * bw + aw * bx + ay * bz - az * by,
|
|
58
|
+
ay * bw + aw * by + az * bx - ax * bz,
|
|
59
|
+
az * bw + aw * bz + ax * by - ay * bx,
|
|
60
|
+
aw * bw - ax * bx - ay * by - az * bz
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
function axisAngle(axis, radians) {
|
|
64
|
+
const half = radians / 2;
|
|
65
|
+
const s = Math.sin(half);
|
|
66
|
+
return [axis[0] * s, axis[1] * s, axis[2] * s, Math.cos(half)];
|
|
67
|
+
}
|
|
68
|
+
function normalize(v) {
|
|
69
|
+
const l = Math.hypot(v[0], v[1], v[2]);
|
|
70
|
+
return l <= 1e-9 ? [0, 0, 0] : [v[0] / l, v[1] / l, v[2] / l];
|
|
71
|
+
}
|
|
72
|
+
/** Invert a TRS-only mat4 for target world→model conversion. */
|
|
73
|
+
function invertModelTRS(matrix) {
|
|
74
|
+
const sx = Math.hypot(matrix[0], matrix[1], matrix[2]);
|
|
75
|
+
const sy = Math.hypot(matrix[4], matrix[5], matrix[6]);
|
|
76
|
+
const sz = Math.hypot(matrix[8], matrix[9], matrix[10]);
|
|
77
|
+
const m00 = matrix[0] / (sx || 1), m10 = matrix[1] / (sx || 1), m20 = matrix[2] / (sx || 1);
|
|
78
|
+
const m01 = matrix[4] / (sy || 1), m11 = matrix[5] / (sy || 1), m21 = matrix[6] / (sy || 1);
|
|
79
|
+
const m02 = matrix[8] / (sz || 1), m12 = matrix[9] / (sz || 1), m22 = matrix[10] / (sz || 1);
|
|
80
|
+
const trace = m00 + m11 + m22;
|
|
81
|
+
let q;
|
|
82
|
+
if (trace > 0) {
|
|
83
|
+
const s = 0.5 / Math.sqrt(trace + 1);
|
|
84
|
+
q = [(m21 - m12) * s, (m02 - m20) * s, (m10 - m01) * s, 0.25 / s];
|
|
85
|
+
}
|
|
86
|
+
else if (m00 > m11 && m00 > m22) {
|
|
87
|
+
const s = 2 * Math.sqrt(1 + m00 - m11 - m22);
|
|
88
|
+
q = [0.25 * s, (m01 + m10) / s, (m02 + m20) / s, (m21 - m12) / s];
|
|
89
|
+
}
|
|
90
|
+
else if (m11 > m22) {
|
|
91
|
+
const s = 2 * Math.sqrt(1 + m11 - m00 - m22);
|
|
92
|
+
q = [(m01 + m10) / s, 0.25 * s, (m12 + m21) / s, (m02 - m20) / s];
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const s = 2 * Math.sqrt(1 + m22 - m00 - m11);
|
|
96
|
+
q = [(m02 + m20) / s, (m12 + m21) / s, 0.25 * s, (m10 - m01) / s];
|
|
97
|
+
}
|
|
98
|
+
const l = Math.hypot(q[0], q[1], q[2], q[3]) || 1;
|
|
99
|
+
return {
|
|
100
|
+
rotation: [q[0] / l, q[1] / l, q[2] / l, q[3] / l],
|
|
101
|
+
scale: [sx, sy, sz],
|
|
102
|
+
position: [matrix[12], matrix[13], matrix[14]]
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function forwardVector(axis) {
|
|
106
|
+
if (axis === "-z")
|
|
107
|
+
return [0, 0, -1];
|
|
108
|
+
if (axis === "+y")
|
|
109
|
+
return [0, 1, 0];
|
|
110
|
+
return [0, 0, 1];
|
|
111
|
+
}
|
|
112
|
+
export function createLookAtConstraint(spec) {
|
|
113
|
+
const halfLife = spec.halfLife ?? 0.12;
|
|
114
|
+
const yawLimit = ((spec.yawLimitDeg ?? 90) * Math.PI) / 180;
|
|
115
|
+
const pitchLimit = ((spec.pitchLimitDeg ?? 60) * Math.PI) / 180;
|
|
116
|
+
const axis = forwardVector(spec.forwardAxis ?? "+z");
|
|
117
|
+
const state = { yaw: 0, pitch: 0 };
|
|
118
|
+
return {
|
|
119
|
+
get smoothed() {
|
|
120
|
+
return { yaw: state.yaw, pitch: state.pitch };
|
|
121
|
+
},
|
|
122
|
+
reset() {
|
|
123
|
+
state.yaw = 0;
|
|
124
|
+
state.pitch = 0;
|
|
125
|
+
},
|
|
126
|
+
apply(pose, skeleton, modelMatrix, target, dt) {
|
|
127
|
+
const frames = new Map();
|
|
128
|
+
const invModel = invertModelTRS(modelMatrix);
|
|
129
|
+
// Target in model space.
|
|
130
|
+
const shifted = [target[0] - invModel.position[0], target[1] - invModel.position[1], target[2] - invModel.position[2]];
|
|
131
|
+
const invRot = [-invModel.rotation[0], -invModel.rotation[1], -invModel.rotation[2], invModel.rotation[3]];
|
|
132
|
+
const rotatedTarget = rotateVec3(invRot, shifted);
|
|
133
|
+
const targetLocal = [
|
|
134
|
+
rotatedTarget[0] / (invModel.scale[0] || 1),
|
|
135
|
+
rotatedTarget[1] / (invModel.scale[1] || 1),
|
|
136
|
+
rotatedTarget[2] / (invModel.scale[2] || 1)
|
|
137
|
+
];
|
|
138
|
+
// Desired yaw/pitch off the LAST weighted bone's current forward.
|
|
139
|
+
const last = spec.bones[spec.bones.length - 1];
|
|
140
|
+
if (!last)
|
|
141
|
+
return;
|
|
142
|
+
const lastFrame = jointFrame(pose, skeleton, jointIndex(skeleton, last.bone), frames);
|
|
143
|
+
const forward = rotateVec3(lastFrame.rotation, axis);
|
|
144
|
+
const toTarget = normalize([
|
|
145
|
+
targetLocal[0] - lastFrame.position[0],
|
|
146
|
+
targetLocal[1] - lastFrame.position[1],
|
|
147
|
+
targetLocal[2] - lastFrame.position[2]
|
|
148
|
+
]);
|
|
149
|
+
if (Math.hypot(toTarget[0], toTarget[1], toTarget[2]) <= 1e-9)
|
|
150
|
+
return;
|
|
151
|
+
// Yaw about model up: signed angle between the XZ projections.
|
|
152
|
+
const forwardFlat = normalize([forward[0], 0, forward[2]]);
|
|
153
|
+
const targetFlat = normalize([toTarget[0], 0, toTarget[2]]);
|
|
154
|
+
// atan2(cross·up, dot) — cross(f,t)·up = fz·tx − fx·tz
|
|
155
|
+
const crossY = forwardFlat[2] * targetFlat[0] - forwardFlat[0] * targetFlat[2];
|
|
156
|
+
const yaw = Math.atan2(crossY, forwardFlat[0] * targetFlat[0] + forwardFlat[2] * targetFlat[2]);
|
|
157
|
+
// Pitch = the rotation about the yawed RIGHT axis needed to lift the
|
|
158
|
+
// CURRENT forward to the target's elevation — a delta, not the target's
|
|
159
|
+
// absolute elevation (an animated forward already pitched by the clip
|
|
160
|
+
// would otherwise keep its pitch residual forever). R_x(+θ) pitches +Z
|
|
161
|
+
// DOWN, so the correction is forwardElev − targetElev.
|
|
162
|
+
const pitch = Math.atan2(forward[1], Math.max(1e-9, Math.hypot(forward[0], forward[2]))) -
|
|
163
|
+
Math.atan2(toTarget[1], Math.max(1e-9, Math.hypot(toTarget[0], toTarget[2])));
|
|
164
|
+
let targetYaw = Math.max(-yawLimit, Math.min(yawLimit, yaw));
|
|
165
|
+
const targetPitch = Math.max(-pitchLimit, Math.min(pitchLimit, pitch));
|
|
166
|
+
// The constraint composes each frame's distributed share ON TOP of the
|
|
167
|
+
// animated pose (the pose the mixer just wrote — never last frame's
|
|
168
|
+
// constraint output), so the smoothed angles are absolute and
|
|
169
|
+
// convergent. `state` starts at 0 for a smooth ramp-in.
|
|
170
|
+
// ±180° unwrap: pull the TARGET onto the smoothed value's branch — the
|
|
171
|
+
// smoothed yaw itself keeps growing continuously past ±π (equivalent mod
|
|
172
|
+
// 2π in the applied share), so sweeping behind never snaps sign.
|
|
173
|
+
while (targetYaw - state.yaw > Math.PI)
|
|
174
|
+
targetYaw -= Math.PI * 2;
|
|
175
|
+
while (targetYaw - state.yaw < -Math.PI)
|
|
176
|
+
targetYaw += Math.PI * 2;
|
|
177
|
+
const blend = 1 - Math.pow(2, -dt / halfLife);
|
|
178
|
+
state.yaw += (targetYaw - state.yaw) * blend;
|
|
179
|
+
state.pitch += (targetPitch - state.pitch) * blend;
|
|
180
|
+
// Distribute smoothed angles across the bones by weight; write back.
|
|
181
|
+
for (const entry of spec.bones) {
|
|
182
|
+
const index = jointIndex(skeleton, entry.bone);
|
|
183
|
+
const frame = jointFrame(pose, skeleton, index, frames);
|
|
184
|
+
const yawShare = state.yaw * entry.weight;
|
|
185
|
+
const pitchShare = state.pitch * entry.weight;
|
|
186
|
+
const yawQ = axisAngle(UP, yawShare);
|
|
187
|
+
const afterYaw = multiplyQuat(yawQ, frame.rotation);
|
|
188
|
+
// Pitch about the bone's post-yaw RIGHT axis — the horizontal axis
|
|
189
|
+
// perpendicular to its current forward (`cross(UP, fwd)` = +X yawed by
|
|
190
|
+
// the forward's own azimuth). Using the yawed model +X instead pitches
|
|
191
|
+
// about an axis off by the whole azimuth, leaking the share into
|
|
192
|
+
// roll/yaw and leaving a residual that grows with off-axis targets.
|
|
193
|
+
const postYawForward = rotateVec3(afterYaw, axis);
|
|
194
|
+
const right = normalize([
|
|
195
|
+
postYawForward[2],
|
|
196
|
+
0,
|
|
197
|
+
-postYawForward[0]
|
|
198
|
+
]);
|
|
199
|
+
const pitchQ = axisAngle(right, pitchShare);
|
|
200
|
+
const world = multiplyQuat(pitchQ, afterYaw);
|
|
201
|
+
const l = Math.hypot(world[0], world[1], world[2], world[3]) || 1;
|
|
202
|
+
const normalized = [world[0] / l, world[1] / l, world[2] / l, world[3] / l];
|
|
203
|
+
const parent = skeleton.parentIndices[index] ?? -1;
|
|
204
|
+
const parentRot = parent >= 0 ? jointFrame(pose, skeleton, parent, frames).rotation : [0, 0, 0, 1];
|
|
205
|
+
const inv = [-parentRot[0], -parentRot[1], -parentRot[2], parentRot[3]];
|
|
206
|
+
const local = multiplyQuat(inv, normalized);
|
|
207
|
+
const ll = Math.hypot(local[0], local[1], local[2], local[3]) || 1;
|
|
208
|
+
pose.rotations[index * 4] = local[0] / ll;
|
|
209
|
+
pose.rotations[index * 4 + 1] = local[1] / ll;
|
|
210
|
+
pose.rotations[index * 4 + 2] = local[2] / ll;
|
|
211
|
+
pose.rotations[index * 4 + 3] = local[3] / ll;
|
|
212
|
+
// Downstream bones see this bone's new world rotation — drop the whole
|
|
213
|
+
// cache so later entries recompute against the updated pose.
|
|
214
|
+
frames.clear();
|
|
215
|
+
}
|
|
216
|
+
// Eyes aim directly at the target (instant saccade, no spring).
|
|
217
|
+
for (const eyeName of spec.eyes ?? []) {
|
|
218
|
+
const index = jointIndex(skeleton, eyeName);
|
|
219
|
+
const frame = jointFrame(pose, skeleton, index, frames);
|
|
220
|
+
const eyeForward = rotateVec3(frame.rotation, axis);
|
|
221
|
+
const eyeToTarget = normalize([
|
|
222
|
+
targetLocal[0] - frame.position[0],
|
|
223
|
+
targetLocal[1] - frame.position[1],
|
|
224
|
+
targetLocal[2] - frame.position[2]
|
|
225
|
+
]);
|
|
226
|
+
const d = eyeForward[0] * eyeToTarget[0] + eyeForward[1] * eyeToTarget[1] + eyeForward[2] * eyeToTarget[2];
|
|
227
|
+
if (d > 1 - 1e-6)
|
|
228
|
+
continue;
|
|
229
|
+
const cross = [
|
|
230
|
+
eyeForward[1] * eyeToTarget[2] - eyeForward[2] * eyeToTarget[1],
|
|
231
|
+
eyeForward[2] * eyeToTarget[0] - eyeForward[0] * eyeToTarget[2],
|
|
232
|
+
eyeForward[0] * eyeToTarget[1] - eyeForward[1] * eyeToTarget[0]
|
|
233
|
+
];
|
|
234
|
+
const w = Math.sqrt((1 + Math.max(-1, d)) / 2);
|
|
235
|
+
const s = 1 / (2 * w);
|
|
236
|
+
const aim = [cross[0] * s, cross[1] * s, cross[2] * s, w];
|
|
237
|
+
const world = multiplyQuat(aim, frame.rotation);
|
|
238
|
+
const parent = skeleton.parentIndices[index] ?? -1;
|
|
239
|
+
const parentRot = parent >= 0 ? jointFrame(pose, skeleton, parent, frames).rotation : [0, 0, 0, 1];
|
|
240
|
+
const inv = [-parentRot[0], -parentRot[1], -parentRot[2], parentRot[3]];
|
|
241
|
+
const local = multiplyQuat(inv, world);
|
|
242
|
+
const ll = Math.hypot(local[0], local[1], local[2], local[3]) || 1;
|
|
243
|
+
pose.rotations[index * 4] = local[0] / ll;
|
|
244
|
+
pose.rotations[index * 4 + 1] = local[1] / ll;
|
|
245
|
+
pose.rotations[index * 4 + 2] = local[2] / ll;
|
|
246
|
+
pose.rotations[index * 4 + 3] = local[3] / ll;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=LookAtConstraint.js.map
|