@pawells/math-extended 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +319 -0
- package/build/angles.d.ts +31 -0
- package/build/angles.d.ts.map +1 -0
- package/build/angles.js +85 -0
- package/build/angles.js.map +1 -0
- package/build/angles.spec.d.ts +2 -0
- package/build/angles.spec.d.ts.map +1 -0
- package/build/angles.spec.js +147 -0
- package/build/angles.spec.js.map +1 -0
- package/build/clamp.d.ts +17 -0
- package/build/clamp.d.ts.map +1 -0
- package/build/clamp.js +19 -0
- package/build/clamp.js.map +1 -0
- package/build/clamp.spec.d.ts +2 -0
- package/build/clamp.spec.d.ts.map +1 -0
- package/build/clamp.spec.js +19 -0
- package/build/clamp.spec.js.map +1 -0
- package/build/documentation-validation.spec.d.ts +11 -0
- package/build/documentation-validation.spec.d.ts.map +1 -0
- package/build/documentation-validation.spec.js +401 -0
- package/build/documentation-validation.spec.js.map +1 -0
- package/build/index.d.ts +8 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +8 -0
- package/build/index.js.map +1 -0
- package/build/interpolation.d.ts +175 -0
- package/build/interpolation.d.ts.map +1 -0
- package/build/interpolation.js +369 -0
- package/build/interpolation.js.map +1 -0
- package/build/interpolation.spec.d.ts +2 -0
- package/build/interpolation.spec.d.ts.map +1 -0
- package/build/interpolation.spec.js +480 -0
- package/build/interpolation.spec.js.map +1 -0
- package/build/matrices/arithmetic.d.ts +411 -0
- package/build/matrices/arithmetic.d.ts.map +1 -0
- package/build/matrices/arithmetic.js +954 -0
- package/build/matrices/arithmetic.js.map +1 -0
- package/build/matrices/arithmetic.spec.d.ts +2 -0
- package/build/matrices/arithmetic.spec.d.ts.map +1 -0
- package/build/matrices/arithmetic.spec.js +915 -0
- package/build/matrices/arithmetic.spec.js.map +1 -0
- package/build/matrices/asserts.d.ts +306 -0
- package/build/matrices/asserts.d.ts.map +1 -0
- package/build/matrices/asserts.js +396 -0
- package/build/matrices/asserts.js.map +1 -0
- package/build/matrices/asserts.spec.d.ts +2 -0
- package/build/matrices/asserts.spec.d.ts.map +1 -0
- package/build/matrices/asserts.spec.js +565 -0
- package/build/matrices/asserts.spec.js.map +1 -0
- package/build/matrices/core.d.ts +168 -0
- package/build/matrices/core.d.ts.map +1 -0
- package/build/matrices/core.js +457 -0
- package/build/matrices/core.js.map +1 -0
- package/build/matrices/core.spec.d.ts +2 -0
- package/build/matrices/core.spec.d.ts.map +1 -0
- package/build/matrices/core.spec.js +634 -0
- package/build/matrices/core.spec.js.map +1 -0
- package/build/matrices/decompositions.d.ts +326 -0
- package/build/matrices/decompositions.d.ts.map +1 -0
- package/build/matrices/decompositions.js +816 -0
- package/build/matrices/decompositions.js.map +1 -0
- package/build/matrices/decompositions.spec.d.ts +2 -0
- package/build/matrices/decompositions.spec.d.ts.map +1 -0
- package/build/matrices/decompositions.spec.js +195 -0
- package/build/matrices/decompositions.spec.js.map +1 -0
- package/build/matrices/index.d.ts +9 -0
- package/build/matrices/index.d.ts.map +1 -0
- package/build/matrices/index.js +9 -0
- package/build/matrices/index.js.map +1 -0
- package/build/matrices/linear-algebra.d.ts +64 -0
- package/build/matrices/linear-algebra.d.ts.map +1 -0
- package/build/matrices/linear-algebra.js +253 -0
- package/build/matrices/linear-algebra.js.map +1 -0
- package/build/matrices/linear-algebra.spec.d.ts +2 -0
- package/build/matrices/linear-algebra.spec.d.ts.map +1 -0
- package/build/matrices/linear-algebra.spec.js +355 -0
- package/build/matrices/linear-algebra.spec.js.map +1 -0
- package/build/matrices/normalization.d.ts +62 -0
- package/build/matrices/normalization.d.ts.map +1 -0
- package/build/matrices/normalization.js +167 -0
- package/build/matrices/normalization.js.map +1 -0
- package/build/matrices/normalization.spec.d.ts +2 -0
- package/build/matrices/normalization.spec.d.ts.map +1 -0
- package/build/matrices/normalization.spec.js +335 -0
- package/build/matrices/normalization.spec.js.map +1 -0
- package/build/matrices/transformations.d.ts +484 -0
- package/build/matrices/transformations.d.ts.map +1 -0
- package/build/matrices/transformations.js +592 -0
- package/build/matrices/transformations.js.map +1 -0
- package/build/matrices/transformations.spec.d.ts +2 -0
- package/build/matrices/transformations.spec.d.ts.map +1 -0
- package/build/matrices/transformations.spec.js +755 -0
- package/build/matrices/transformations.spec.js.map +1 -0
- package/build/matrices/types.d.ts +134 -0
- package/build/matrices/types.d.ts.map +1 -0
- package/build/matrices/types.js +6 -0
- package/build/matrices/types.js.map +1 -0
- package/build/quaternions/asserts.d.ts +77 -0
- package/build/quaternions/asserts.d.ts.map +1 -0
- package/build/quaternions/asserts.js +175 -0
- package/build/quaternions/asserts.js.map +1 -0
- package/build/quaternions/asserts.spec.d.ts +2 -0
- package/build/quaternions/asserts.spec.d.ts.map +1 -0
- package/build/quaternions/asserts.spec.js +320 -0
- package/build/quaternions/asserts.spec.js.map +1 -0
- package/build/quaternions/conversions.d.ts +73 -0
- package/build/quaternions/conversions.d.ts.map +1 -0
- package/build/quaternions/conversions.js +179 -0
- package/build/quaternions/conversions.js.map +1 -0
- package/build/quaternions/conversions.spec.d.ts +2 -0
- package/build/quaternions/conversions.spec.d.ts.map +1 -0
- package/build/quaternions/conversions.spec.js +344 -0
- package/build/quaternions/conversions.spec.js.map +1 -0
- package/build/quaternions/core.d.ts +203 -0
- package/build/quaternions/core.d.ts.map +1 -0
- package/build/quaternions/core.js +374 -0
- package/build/quaternions/core.js.map +1 -0
- package/build/quaternions/core.spec.d.ts +2 -0
- package/build/quaternions/core.spec.d.ts.map +1 -0
- package/build/quaternions/core.spec.js +294 -0
- package/build/quaternions/core.spec.js.map +1 -0
- package/build/quaternions/index.d.ts +7 -0
- package/build/quaternions/index.d.ts.map +1 -0
- package/build/quaternions/index.js +7 -0
- package/build/quaternions/index.js.map +1 -0
- package/build/quaternions/interpolation.d.ts +54 -0
- package/build/quaternions/interpolation.d.ts.map +1 -0
- package/build/quaternions/interpolation.js +201 -0
- package/build/quaternions/interpolation.js.map +1 -0
- package/build/quaternions/interpolation.spec.d.ts +2 -0
- package/build/quaternions/interpolation.spec.d.ts.map +1 -0
- package/build/quaternions/interpolation.spec.js +64 -0
- package/build/quaternions/interpolation.spec.js.map +1 -0
- package/build/quaternions/predefined.d.ts +36 -0
- package/build/quaternions/predefined.d.ts.map +1 -0
- package/build/quaternions/predefined.js +42 -0
- package/build/quaternions/predefined.js.map +1 -0
- package/build/quaternions/predefined.spec.d.ts +2 -0
- package/build/quaternions/predefined.spec.d.ts.map +1 -0
- package/build/quaternions/predefined.spec.js +35 -0
- package/build/quaternions/predefined.spec.js.map +1 -0
- package/build/quaternions/types.d.ts +55 -0
- package/build/quaternions/types.d.ts.map +1 -0
- package/build/quaternions/types.js +7 -0
- package/build/quaternions/types.js.map +1 -0
- package/build/random.d.ts +66 -0
- package/build/random.d.ts.map +1 -0
- package/build/random.js +115 -0
- package/build/random.js.map +1 -0
- package/build/random.spec.d.ts +2 -0
- package/build/random.spec.d.ts.map +1 -0
- package/build/random.spec.js +267 -0
- package/build/random.spec.js.map +1 -0
- package/build/vectors/asserts.d.ts +182 -0
- package/build/vectors/asserts.d.ts.map +1 -0
- package/build/vectors/asserts.js +285 -0
- package/build/vectors/asserts.js.map +1 -0
- package/build/vectors/asserts.spec.d.ts +2 -0
- package/build/vectors/asserts.spec.d.ts.map +1 -0
- package/build/vectors/asserts.spec.js +260 -0
- package/build/vectors/asserts.spec.js.map +1 -0
- package/build/vectors/core.d.ts +507 -0
- package/build/vectors/core.d.ts.map +1 -0
- package/build/vectors/core.js +825 -0
- package/build/vectors/core.js.map +1 -0
- package/build/vectors/core.spec.d.ts +2 -0
- package/build/vectors/core.spec.d.ts.map +1 -0
- package/build/vectors/core.spec.js +343 -0
- package/build/vectors/core.spec.js.map +1 -0
- package/build/vectors/index.d.ts +6 -0
- package/build/vectors/index.d.ts.map +1 -0
- package/build/vectors/index.js +6 -0
- package/build/vectors/index.js.map +1 -0
- package/build/vectors/interpolation.d.ts +404 -0
- package/build/vectors/interpolation.d.ts.map +1 -0
- package/build/vectors/interpolation.js +585 -0
- package/build/vectors/interpolation.js.map +1 -0
- package/build/vectors/interpolation.spec.d.ts +2 -0
- package/build/vectors/interpolation.spec.d.ts.map +1 -0
- package/build/vectors/interpolation.spec.js +378 -0
- package/build/vectors/interpolation.spec.js.map +1 -0
- package/build/vectors/predefined.d.ts +191 -0
- package/build/vectors/predefined.d.ts.map +1 -0
- package/build/vectors/predefined.js +191 -0
- package/build/vectors/predefined.js.map +1 -0
- package/build/vectors/predefined.spec.d.ts +2 -0
- package/build/vectors/predefined.spec.d.ts.map +1 -0
- package/build/vectors/predefined.spec.js +333 -0
- package/build/vectors/predefined.spec.js.map +1 -0
- package/build/vectors/types.d.ts +62 -0
- package/build/vectors/types.d.ts.map +1 -0
- package/build/vectors/types.js +6 -0
- package/build/vectors/types.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { QuaternionIdentity, QuaternionClone, QuaternionEquals, QuaternionMagnitude, QuaternionNormalize, QuaternionConjugate, QuaternionInverse, QuaternionMultiply, QuaternionFromAxisAngle, QuaternionFromAxisAngleVector, QuaternionToAxisAngle, QuaternionFromEuler, QuaternionToEuler, QuaternionRotateVector, QuaternionSLERP } from './core.js';
|
|
2
|
+
import { QuaternionError } from './asserts.js';
|
|
3
|
+
describe('Quaternion Core Functions', () => {
|
|
4
|
+
describe('QuaternionIdentity', () => {
|
|
5
|
+
test('should return identity quaternion', () => {
|
|
6
|
+
const identity = QuaternionIdentity();
|
|
7
|
+
expect(identity).toEqual([0, 0, 0, 1]);
|
|
8
|
+
});
|
|
9
|
+
});
|
|
10
|
+
describe('QuaternionClone', () => {
|
|
11
|
+
test('should create a deep copy of quaternion', () => {
|
|
12
|
+
const original = [1, 2, 3, 4];
|
|
13
|
+
const cloned = QuaternionClone(original);
|
|
14
|
+
expect(cloned).toEqual(original);
|
|
15
|
+
expect(cloned).not.toBe(original);
|
|
16
|
+
// Verify independence
|
|
17
|
+
cloned[0] = 999;
|
|
18
|
+
expect(original[0]).toBe(1);
|
|
19
|
+
});
|
|
20
|
+
test('should throw for invalid quaternion', () => {
|
|
21
|
+
expect(() => QuaternionClone([1, 2, 3])).toThrow(QuaternionError);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
describe('QuaternionEquals', () => {
|
|
25
|
+
test('should return true for identical quaternions', () => {
|
|
26
|
+
const q1 = [0, 0, 0, 1];
|
|
27
|
+
const q2 = [0, 0, 0, 1];
|
|
28
|
+
expect(QuaternionEquals(q1, q2)).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
test('should return false for different quaternions', () => {
|
|
31
|
+
const q1 = [0, 0, 0, 1];
|
|
32
|
+
const q2 = [1, 0, 0, 0];
|
|
33
|
+
expect(QuaternionEquals(q1, q2)).toBe(false);
|
|
34
|
+
});
|
|
35
|
+
test('should handle tolerance', () => {
|
|
36
|
+
const q1 = [0.000001, 0, 0, 1];
|
|
37
|
+
const q2 = [0, 0, 0, 1];
|
|
38
|
+
expect(QuaternionEquals(q1, q2, 1e-7)).toBe(false);
|
|
39
|
+
expect(QuaternionEquals(q1, q2, 1e-5)).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
test('should detect equivalent rotations when checkEquivalence is true', () => {
|
|
42
|
+
const q1 = [0, 0, 0, 1];
|
|
43
|
+
const q2 = [0, 0, 0, -1]; // Same rotation, opposite quaternion
|
|
44
|
+
expect(QuaternionEquals(q1, q2, 1e-6, false)).toBe(false);
|
|
45
|
+
expect(QuaternionEquals(q1, q2, 1e-6, true)).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('QuaternionMagnitude', () => {
|
|
49
|
+
test('should calculate magnitude correctly', () => {
|
|
50
|
+
const q = [1, 2, 2, 0];
|
|
51
|
+
const magnitude = QuaternionMagnitude(q);
|
|
52
|
+
expect(magnitude).toBeCloseTo(3, 6);
|
|
53
|
+
});
|
|
54
|
+
test('should return 1 for unit quaternions', () => {
|
|
55
|
+
const q = [0, 0, 0, 1];
|
|
56
|
+
expect(QuaternionMagnitude(q)).toBeCloseTo(1, 6);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe('QuaternionNormalize', () => {
|
|
60
|
+
test('should normalize quaternion to unit length', () => {
|
|
61
|
+
const q = [1, 1, 1, 1];
|
|
62
|
+
const normalized = QuaternionNormalize(q);
|
|
63
|
+
expect(QuaternionMagnitude(normalized)).toBeCloseTo(1, 6);
|
|
64
|
+
});
|
|
65
|
+
test('should preserve identity quaternion', () => {
|
|
66
|
+
const identity = QuaternionIdentity();
|
|
67
|
+
const normalized = QuaternionNormalize(identity);
|
|
68
|
+
expect(normalized).toEqual(identity);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('QuaternionConjugate', () => {
|
|
72
|
+
test('should negate x, y, z components', () => {
|
|
73
|
+
const q = [1, 2, 3, 4];
|
|
74
|
+
const conjugate = QuaternionConjugate(q);
|
|
75
|
+
expect(conjugate).toEqual([-1, -2, -3, 4]);
|
|
76
|
+
});
|
|
77
|
+
test('should preserve identity quaternion', () => {
|
|
78
|
+
const identity = QuaternionIdentity();
|
|
79
|
+
const conjugate = QuaternionConjugate(identity);
|
|
80
|
+
// Check values are effectively zero (handles -0 vs 0)
|
|
81
|
+
expect(Math.abs(conjugate[0])).toBeCloseTo(0, 6);
|
|
82
|
+
expect(Math.abs(conjugate[1])).toBeCloseTo(0, 6);
|
|
83
|
+
expect(Math.abs(conjugate[2])).toBeCloseTo(0, 6);
|
|
84
|
+
expect(conjugate[3]).toBe(1);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe('QuaternionInverse', () => {
|
|
88
|
+
test('should calculate inverse correctly for unit quaternion', () => {
|
|
89
|
+
const q = [0, 0, 0.7071067811865476, 0.7071067811865476]; // 90° around Z (properly normalized)
|
|
90
|
+
const inverse = QuaternionInverse(q);
|
|
91
|
+
const conjugate = QuaternionConjugate(q);
|
|
92
|
+
// For unit quaternions, inverse equals conjugate
|
|
93
|
+
expect(inverse[0]).toBeCloseTo(conjugate[0], 6);
|
|
94
|
+
expect(inverse[1]).toBeCloseTo(conjugate[1], 6);
|
|
95
|
+
expect(inverse[2]).toBeCloseTo(conjugate[2], 6);
|
|
96
|
+
expect(inverse[3]).toBeCloseTo(conjugate[3], 6);
|
|
97
|
+
});
|
|
98
|
+
test('should satisfy q * q^-1 = identity', () => {
|
|
99
|
+
const q = [0.5, 0.5, 0.5, 0.5];
|
|
100
|
+
const inverse = QuaternionInverse(q);
|
|
101
|
+
const product = QuaternionMultiply(q, inverse);
|
|
102
|
+
const identity = QuaternionIdentity();
|
|
103
|
+
expect(product[0]).toBeCloseTo(identity[0], 6);
|
|
104
|
+
expect(product[1]).toBeCloseTo(identity[1], 6);
|
|
105
|
+
expect(product[2]).toBeCloseTo(identity[2], 6);
|
|
106
|
+
expect(product[3]).toBeCloseTo(identity[3], 6);
|
|
107
|
+
});
|
|
108
|
+
test('should throw for zero quaternion', () => {
|
|
109
|
+
const zero = [0, 0, 0, 0];
|
|
110
|
+
expect(() => QuaternionInverse(zero)).toThrow();
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe('QuaternionMultiply', () => {
|
|
114
|
+
test('should multiply quaternions correctly', () => {
|
|
115
|
+
const q1 = [0, 0, 0, 1]; // Identity
|
|
116
|
+
const q2 = [1, 0, 0, 0]; // 180° around X
|
|
117
|
+
const product = QuaternionMultiply(q1, q2);
|
|
118
|
+
expect(product).toEqual([1, 0, 0, 0]);
|
|
119
|
+
});
|
|
120
|
+
test('should be non-commutative', () => {
|
|
121
|
+
const q1 = [0.7071067811865476, 0, 0, 0.7071067811865476]; // 90° around X
|
|
122
|
+
const q2 = [0, 0.7071067811865476, 0, 0.7071067811865476]; // 90° around Y
|
|
123
|
+
const product1 = QuaternionMultiply(q1, q2);
|
|
124
|
+
const product2 = QuaternionMultiply(q2, q1);
|
|
125
|
+
expect(QuaternionEquals(product1, product2)).toBe(false);
|
|
126
|
+
});
|
|
127
|
+
test('should preserve magnitude for unit quaternions', () => {
|
|
128
|
+
const q1 = QuaternionNormalize([1, 1, 0, 1]);
|
|
129
|
+
const q2 = QuaternionNormalize([0, 1, 1, 1]);
|
|
130
|
+
const product = QuaternionMultiply(q1, q2);
|
|
131
|
+
expect(QuaternionMagnitude(product)).toBeCloseTo(1, 6);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe('QuaternionFromAxisAngle', () => {
|
|
135
|
+
test('should create quaternion from axis-angle', () => {
|
|
136
|
+
const axis = [0, 0, 1]; // Z-axis
|
|
137
|
+
const angle = Math.PI / 2; // 90 degrees
|
|
138
|
+
const q = QuaternionFromAxisAngle(axis, angle);
|
|
139
|
+
expect(q[0]).toBeCloseTo(0, 6);
|
|
140
|
+
expect(q[1]).toBeCloseTo(0, 6);
|
|
141
|
+
expect(q[2]).toBeCloseTo(0.7071067811865476, 6);
|
|
142
|
+
expect(q[3]).toBeCloseTo(0.7071067811865476, 6);
|
|
143
|
+
});
|
|
144
|
+
test('should handle zero angle', () => {
|
|
145
|
+
const axis = [1, 0, 0];
|
|
146
|
+
const angle = 0;
|
|
147
|
+
const q = QuaternionFromAxisAngle(axis, angle);
|
|
148
|
+
expect(q).toEqual([0, 0, 0, 1]); // Identity
|
|
149
|
+
});
|
|
150
|
+
test('should normalize axis automatically', () => {
|
|
151
|
+
const unnormalizedAxis = [2, 0, 0]; // Will be normalized to [1, 0, 0]
|
|
152
|
+
const angle = Math.PI;
|
|
153
|
+
const q = QuaternionFromAxisAngle(unnormalizedAxis, angle);
|
|
154
|
+
expect(q[0]).toBeCloseTo(1, 6);
|
|
155
|
+
expect(q[1]).toBeCloseTo(0, 6);
|
|
156
|
+
expect(q[2]).toBeCloseTo(0, 6);
|
|
157
|
+
expect(q[3]).toBeCloseTo(0, 6);
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
describe('QuaternionFromAxisAngleVector', () => {
|
|
161
|
+
test('should create quaternion from 4-component axis-angle', () => {
|
|
162
|
+
const axisAngle = [0, 0, 1, Math.PI / 2]; // 90° around Z
|
|
163
|
+
const q = QuaternionFromAxisAngleVector(axisAngle);
|
|
164
|
+
expect(q[0]).toBeCloseTo(0, 6);
|
|
165
|
+
expect(q[1]).toBeCloseTo(0, 6);
|
|
166
|
+
expect(q[2]).toBeCloseTo(0.7071067811865476, 6);
|
|
167
|
+
expect(q[3]).toBeCloseTo(0.7071067811865476, 6);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('QuaternionToAxisAngle', () => {
|
|
171
|
+
test('should convert quaternion to axis-angle', () => {
|
|
172
|
+
const q = [0, 0, 0.7071067811865476, 0.7071067811865476]; // 90° around Z (properly normalized)
|
|
173
|
+
const axisAngle = QuaternionToAxisAngle(q);
|
|
174
|
+
expect(axisAngle[0]).toBeCloseTo(0, 6);
|
|
175
|
+
expect(axisAngle[1]).toBeCloseTo(0, 6);
|
|
176
|
+
expect(axisAngle[2]).toBeCloseTo(1, 6);
|
|
177
|
+
expect(axisAngle[3]).toBeCloseTo(Math.PI / 2, 6);
|
|
178
|
+
});
|
|
179
|
+
test('should handle identity quaternion', () => {
|
|
180
|
+
const identity = QuaternionIdentity();
|
|
181
|
+
const axisAngle = QuaternionToAxisAngle(identity);
|
|
182
|
+
expect(axisAngle[3]).toBeCloseTo(0, 6); // Zero angle
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('QuaternionFromEuler', () => {
|
|
186
|
+
test('should create quaternion from Euler angles', () => {
|
|
187
|
+
const euler = [0, Math.PI / 2, 0]; // 90° pitch
|
|
188
|
+
const q = QuaternionFromEuler(euler);
|
|
189
|
+
// Should be roughly [0, sin(45°), 0, cos(45°)]
|
|
190
|
+
expect(q[0]).toBeCloseTo(0, 6);
|
|
191
|
+
expect(q[1]).toBeCloseTo(0.7071067811865476, 6);
|
|
192
|
+
expect(q[2]).toBeCloseTo(0, 6);
|
|
193
|
+
expect(q[3]).toBeCloseTo(0.7071067811865476, 6);
|
|
194
|
+
});
|
|
195
|
+
test('should handle zero angles', () => {
|
|
196
|
+
const euler = [0, 0, 0];
|
|
197
|
+
const q = QuaternionFromEuler(euler);
|
|
198
|
+
expect(q).toEqual([0, 0, 0, 1]); // Identity
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
describe('QuaternionToEuler', () => {
|
|
202
|
+
test('should convert quaternion to Euler angles', () => {
|
|
203
|
+
const q = [0, 0.7071067811865476, 0, 0.7071067811865476]; // 90° around Y (properly normalized)
|
|
204
|
+
const euler = QuaternionToEuler(q);
|
|
205
|
+
// Note: Due to Euler angle ambiguity, multiple representations are valid
|
|
206
|
+
// The key is that converting back should give the same rotation
|
|
207
|
+
const backToQuaternion = QuaternionFromEuler(euler);
|
|
208
|
+
// Test that rotating a vector gives the same result
|
|
209
|
+
const testVector = [1, 0, 0];
|
|
210
|
+
const rotated1 = QuaternionRotateVector(q, testVector);
|
|
211
|
+
const rotated2 = QuaternionRotateVector(backToQuaternion, testVector);
|
|
212
|
+
expect(rotated1[0]).toBeCloseTo(rotated2[0], 6);
|
|
213
|
+
expect(rotated1[1]).toBeCloseTo(rotated2[1], 6);
|
|
214
|
+
expect(rotated1[2]).toBeCloseTo(rotated2[2], 6);
|
|
215
|
+
});
|
|
216
|
+
test('should handle identity quaternion', () => {
|
|
217
|
+
const identity = QuaternionIdentity();
|
|
218
|
+
const euler = QuaternionToEuler(identity);
|
|
219
|
+
expect(euler).toEqual([0, 0, 0]);
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
describe('QuaternionRotateVector', () => {
|
|
223
|
+
test('should rotate vector correctly', () => {
|
|
224
|
+
const q = QuaternionFromAxisAngle([0, 0, 1], Math.PI / 2); // 90° around Z
|
|
225
|
+
const vector = [1, 0, 0]; // Point along X-axis
|
|
226
|
+
const rotated = QuaternionRotateVector(q, vector);
|
|
227
|
+
// Should point along Y-axis after 90° Z rotation
|
|
228
|
+
expect(rotated[0]).toBeCloseTo(0, 6);
|
|
229
|
+
expect(rotated[1]).toBeCloseTo(1, 6);
|
|
230
|
+
expect(rotated[2]).toBeCloseTo(0, 6);
|
|
231
|
+
});
|
|
232
|
+
test('should preserve vector length', () => {
|
|
233
|
+
const q = QuaternionFromAxisAngle([1, 1, 1], Math.PI / 3); // 60° around diagonal
|
|
234
|
+
const vector = [3, 4, 5];
|
|
235
|
+
const rotated = QuaternionRotateVector(q, vector);
|
|
236
|
+
const originalLength = Math.sqrt((3 * 3) + (4 * 4) + (5 * 5));
|
|
237
|
+
const rotatedLength = Math.sqrt((rotated[0] * rotated[0]) + (rotated[1] * rotated[1]) + (rotated[2] * rotated[2]));
|
|
238
|
+
expect(rotatedLength).toBeCloseTo(originalLength, 6);
|
|
239
|
+
});
|
|
240
|
+
test('should not change vector with identity quaternion', () => {
|
|
241
|
+
const identity = QuaternionIdentity();
|
|
242
|
+
const vector = [1, 2, 3];
|
|
243
|
+
const rotated = QuaternionRotateVector(identity, vector);
|
|
244
|
+
expect(rotated).toEqual(vector);
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
describe('QuaternionSLERP', () => {
|
|
248
|
+
test('should interpolate between quaternions', () => {
|
|
249
|
+
const q1 = QuaternionIdentity();
|
|
250
|
+
const q2 = QuaternionFromAxisAngle([0, 0, 1], Math.PI / 2); // 90° around Z
|
|
251
|
+
const halfway = QuaternionSLERP(q1, q2, 0.5);
|
|
252
|
+
// Should be roughly 45° rotation
|
|
253
|
+
expect(QuaternionMagnitude(halfway)).toBeCloseTo(1, 6);
|
|
254
|
+
expect(halfway[2]).toBeCloseTo(Math.sin(Math.PI / 8), 6); // sin(45°/2)
|
|
255
|
+
expect(halfway[3]).toBeCloseTo(Math.cos(Math.PI / 8), 6); // cos(45°/2)
|
|
256
|
+
});
|
|
257
|
+
test('should return start quaternion at t=0', () => {
|
|
258
|
+
const q1 = [1, 0, 0, 0];
|
|
259
|
+
const q2 = [0, 1, 0, 0];
|
|
260
|
+
const result = QuaternionSLERP(q1, q2, 0);
|
|
261
|
+
expect(result[0]).toBeCloseTo(q1[0], 6);
|
|
262
|
+
expect(result[1]).toBeCloseTo(q1[1], 6);
|
|
263
|
+
expect(result[2]).toBeCloseTo(q1[2], 6);
|
|
264
|
+
expect(result[3]).toBeCloseTo(q1[3], 6);
|
|
265
|
+
});
|
|
266
|
+
test('should return end quaternion at t=1', () => {
|
|
267
|
+
const q1 = [1, 0, 0, 0];
|
|
268
|
+
const q2 = [0, 1, 0, 0];
|
|
269
|
+
const result = QuaternionSLERP(q1, q2, 1);
|
|
270
|
+
expect(result[0]).toBeCloseTo(q2[0], 6);
|
|
271
|
+
expect(result[1]).toBeCloseTo(q2[1], 6);
|
|
272
|
+
expect(result[2]).toBeCloseTo(q2[2], 6);
|
|
273
|
+
expect(result[3]).toBeCloseTo(q2[3], 6);
|
|
274
|
+
});
|
|
275
|
+
test('should handle very close quaternions', () => {
|
|
276
|
+
const q1 = [0, 0, 0, 1];
|
|
277
|
+
const q2 = [0.0001, 0, 0, 0.99999999];
|
|
278
|
+
const normalized = QuaternionNormalize(q2);
|
|
279
|
+
const result = QuaternionSLERP(q1, normalized, 0.5);
|
|
280
|
+
expect(QuaternionMagnitude(result)).toBeCloseTo(1, 6);
|
|
281
|
+
});
|
|
282
|
+
test('should clamp t to [0, 1] range', () => {
|
|
283
|
+
const q1 = QuaternionIdentity();
|
|
284
|
+
const q2 = QuaternionFromAxisAngle([0, 0, 1], Math.PI / 2);
|
|
285
|
+
const resultBelow = QuaternionSLERP(q1, q2, -0.5);
|
|
286
|
+
const resultAt0 = QuaternionSLERP(q1, q2, 0);
|
|
287
|
+
expect(QuaternionEquals(resultBelow, resultAt0)).toBe(true);
|
|
288
|
+
const resultAbove = QuaternionSLERP(q1, q2, 1.5);
|
|
289
|
+
const resultAt1 = QuaternionSLERP(q1, q2, 1);
|
|
290
|
+
expect(QuaternionEquals(resultAbove, resultAt1)).toBe(true);
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
//# sourceMappingURL=core.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.spec.js","sourceRoot":"","sources":["../../src/quaternions/core.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACxV,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAI/C,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IAC1C,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QACnC,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC9C,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YACtC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAChC,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACpD,MAAM,QAAQ,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACjC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAElC,sBAAsB;YACtB,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YAChB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QACjC,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACzD,MAAM,EAAE,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,EAAE,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;YAC1D,MAAM,EAAE,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,EAAE,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACpC,MAAM,EAAE,GAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5C,MAAM,EAAE,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnD,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,kEAAkE,EAAE,GAAG,EAAE;YAC7E,MAAM,EAAE,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,EAAE,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,qCAAqC;YAC5E,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1D,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACpC,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;YACjD,MAAM,CAAC,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,SAAS,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;YACjD,MAAM,CAAC,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACpC,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACvD,MAAM,CAAC,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,UAAU,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAChD,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACjD,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACpC,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC7C,MAAM,CAAC,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,SAAS,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAChD,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAChD,sDAAsD;YACtD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAClC,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;YACnE,MAAM,CAAC,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CAAC,qCAAqC;YAC5G,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,SAAS,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;YACzC,iDAAiD;YACjD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC/C,MAAM,CAAC,GAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC7C,MAAM,IAAI,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACjD,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QACnC,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAClD,MAAM,EAAE,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW;YACjD,MAAM,EAAE,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB;YACtD,MAAM,OAAO,GAAG,kBAAkB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACtC,MAAM,EAAE,GAAgB,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,eAAe;YACvF,MAAM,EAAE,GAAgB,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,eAAe;YAEvF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;YAC3D,MAAM,EAAE,GAAG,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,EAAE,GAAG,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,kBAAkB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3C,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACxC,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;YACrD,MAAM,IAAI,GAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,aAAa;YACxC,MAAM,CAAC,GAAG,uBAAuB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC/C,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE;YACrC,MAAM,IAAI,GAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAChC,MAAM,KAAK,GAAG,CAAC,CAAC;YAChB,MAAM,CAAC,GAAG,uBAAuB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC/C,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW;QAC7C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAChD,MAAM,gBAAgB,GAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,kCAAkC;YAChF,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,uBAAuB,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAC9C,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;YACjE,MAAM,SAAS,GAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe;YACnE,MAAM,CAAC,GAAG,6BAA6B,CAAC,SAAS,CAAC,CAAC;YACnD,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACtC,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACpD,MAAM,CAAC,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CAAC,qCAAqC;YAC5G,MAAM,SAAS,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC9C,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YAClD,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa;QACtD,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACpC,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACvD,MAAM,KAAK,GAAa,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY;YACzD,MAAM,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACrC,+CAA+C;YAC/C,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACtC,MAAM,KAAK,GAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW;QAC7C,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAClC,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACtD,MAAM,CAAC,GAAgB,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,qCAAqC;YAC5G,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;YACnC,yEAAyE;YACzE,gEAAgE;YAChE,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAEpD,oDAAoD;YACpD,MAAM,UAAU,GAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YACvD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;YACtE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC9C,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACvC,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;YAC3C,MAAM,CAAC,GAAG,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAa,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe;YACtF,MAAM,MAAM,GAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,qBAAqB;YACzD,MAAM,OAAO,GAAG,sBAAsB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAClD,iDAAiD;YACjD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;YAC1C,MAAM,CAAC,GAAG,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAa,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,sBAAsB;YAC7F,MAAM,MAAM,GAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACnC,MAAM,OAAO,GAAG,sBAAsB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAElD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnH,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC9D,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YACtC,MAAM,MAAM,GAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACnC,MAAM,OAAO,GAAG,sBAAsB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACzD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAChC,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;YACnD,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;YAChC,MAAM,EAAE,GAAG,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe;YAE3E,MAAM,OAAO,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YAC7C,iCAAiC;YACjC,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa;YACvE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa;QACxE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAClD,MAAM,EAAE,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,EAAE,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAChD,MAAM,EAAE,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,EAAE,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;YACjD,MAAM,EAAE,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,EAAE,GAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;YACpD,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;YAC3C,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;YAChC,MAAM,EAAE,GAAG,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAE3D,MAAM,WAAW,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE5D,MAAM,WAAW,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACjD,MAAM,SAAS,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/quaternions/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/quaternions/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced interpolation utilities for quaternions.
|
|
3
|
+
* Provides specialized interpolation methods for smooth rotation animations.
|
|
4
|
+
*/
|
|
5
|
+
import { TQuaternion } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Performs normalized linear interpolation (NLERP) between two quaternions.
|
|
8
|
+
* NLERP is faster than SLERP but doesn't maintain constant angular velocity.
|
|
9
|
+
* Good for cases where performance is more important than perfect interpolation.
|
|
10
|
+
*
|
|
11
|
+
* @param a - Start quaternion
|
|
12
|
+
* @param b - End quaternion
|
|
13
|
+
* @param t - Interpolation parameter (0 = a, 1 = b)
|
|
14
|
+
* @returns Interpolated and normalized quaternion
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* const q1 = [0, 0, 0, 1];
|
|
18
|
+
* const q2 = [0, 0, 0.707, 0.707];
|
|
19
|
+
* const interpolated = QuaternionNLERP(q1, q2, 0.5);
|
|
20
|
+
*/
|
|
21
|
+
export declare function QuaternionNLERP(a: TQuaternion, b: TQuaternion, t: number): TQuaternion;
|
|
22
|
+
/**
|
|
23
|
+
* Performs spherical quadrangle interpolation (SQUAD) for smooth interpolation
|
|
24
|
+
* through multiple quaternions. This is useful for creating smooth animation paths.
|
|
25
|
+
*
|
|
26
|
+
* @param q0 - Previous quaternion (for tangent calculation)
|
|
27
|
+
* @param q1 - Start quaternion
|
|
28
|
+
* @param q2 - End quaternion
|
|
29
|
+
* @param q3 - Next quaternion (for tangent calculation)
|
|
30
|
+
* @param t - Interpolation parameter (0 = q1, 1 = q2)
|
|
31
|
+
* @returns Smoothly interpolated quaternion
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* // Create a smooth path through multiple rotations
|
|
35
|
+
* const path = [q0, q1, q2, q3]; // Array of quaternions
|
|
36
|
+
* const smooth = QuaternionSQUAD(path[0], path[1], path[2], path[3], 0.5);
|
|
37
|
+
*/
|
|
38
|
+
export declare function QuaternionSQUAD(q0: TQuaternion, q1: TQuaternion, q2: TQuaternion, q3: TQuaternion, t: number): TQuaternion;
|
|
39
|
+
/**
|
|
40
|
+
* Creates a smooth interpolation path through multiple quaternions.
|
|
41
|
+
* Returns a function that can be called with a parameter t ∈ [0, 1] to get
|
|
42
|
+
* interpolated quaternions along the path.
|
|
43
|
+
*
|
|
44
|
+
* @param quaternions - Array of quaternions defining the path
|
|
45
|
+
* @param method - Interpolation method ('slerp' | 'nlerp' | 'squad')
|
|
46
|
+
* @returns Function that takes t ∈ [0, 1] and returns interpolated quaternion
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* const path = [q1, q2, q3, q4];
|
|
50
|
+
* const interpolator = QuaternionCreatePath(path, 'slerp');
|
|
51
|
+
* const halfway = interpolator(0.5); // Interpolated quaternion at 50% along path
|
|
52
|
+
*/
|
|
53
|
+
export declare function QuaternionCreatePath(quaternions: TQuaternion[], method?: 'slerp' | 'nlerp' | 'squad'): (t: number) => TQuaternion;
|
|
54
|
+
//# sourceMappingURL=interpolation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpolation.d.ts","sourceRoot":"","sources":["../../src/quaternions/interpolation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAMzC;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,CAoBtF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,CAiB1H;AAkFD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CACnC,WAAW,EAAE,WAAW,EAAE,EAC1B,MAAM,GAAE,OAAO,GAAG,OAAO,GAAG,OAAiB,GAC3C,CAAC,CAAC,EAAE,MAAM,KAAK,WAAW,CAkD5B"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced interpolation utilities for quaternions.
|
|
3
|
+
* Provides specialized interpolation methods for smooth rotation animations.
|
|
4
|
+
*/
|
|
5
|
+
import { AssertArray, AssertNumber } from '@pawells/typescript-common';
|
|
6
|
+
import { AssertNormalizedQuaternion } from './asserts.js';
|
|
7
|
+
import { QuaternionSLERP, QuaternionNormalize, QuaternionMultiply, QuaternionInverse } from './core.js';
|
|
8
|
+
import { Clamp } from '../clamp.js';
|
|
9
|
+
const QUATERNION_LOG_TOLERANCE = 1e-6;
|
|
10
|
+
/**
|
|
11
|
+
* Performs normalized linear interpolation (NLERP) between two quaternions.
|
|
12
|
+
* NLERP is faster than SLERP but doesn't maintain constant angular velocity.
|
|
13
|
+
* Good for cases where performance is more important than perfect interpolation.
|
|
14
|
+
*
|
|
15
|
+
* @param a - Start quaternion
|
|
16
|
+
* @param b - End quaternion
|
|
17
|
+
* @param t - Interpolation parameter (0 = a, 1 = b)
|
|
18
|
+
* @returns Interpolated and normalized quaternion
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* const q1 = [0, 0, 0, 1];
|
|
22
|
+
* const q2 = [0, 0, 0.707, 0.707];
|
|
23
|
+
* const interpolated = QuaternionNLERP(q1, q2, 0.5);
|
|
24
|
+
*/
|
|
25
|
+
export function QuaternionNLERP(a, b, t) {
|
|
26
|
+
AssertNormalizedQuaternion(a);
|
|
27
|
+
AssertNormalizedQuaternion(b);
|
|
28
|
+
const clampedT = Clamp(t, 0, 1); // Ensure t is within [0, 1]
|
|
29
|
+
// Choose the shorter path (handle double-cover property)
|
|
30
|
+
let bToUse = b;
|
|
31
|
+
const dot = (a[0] * b[0]) + (a[1] * b[1]) + (a[2] * b[2]) + (a[3] * b[3]);
|
|
32
|
+
if (dot < 0)
|
|
33
|
+
bToUse = [-b[0], -b[1], -b[2], -b[3]];
|
|
34
|
+
// Linear interpolation
|
|
35
|
+
const result = [
|
|
36
|
+
a[0] + (clampedT * (bToUse[0] - a[0])),
|
|
37
|
+
a[1] + (clampedT * (bToUse[1] - a[1])),
|
|
38
|
+
a[2] + (clampedT * (bToUse[2] - a[2])),
|
|
39
|
+
a[3] + (clampedT * (bToUse[3] - a[3])),
|
|
40
|
+
];
|
|
41
|
+
return QuaternionNormalize(result);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Performs spherical quadrangle interpolation (SQUAD) for smooth interpolation
|
|
45
|
+
* through multiple quaternions. This is useful for creating smooth animation paths.
|
|
46
|
+
*
|
|
47
|
+
* @param q0 - Previous quaternion (for tangent calculation)
|
|
48
|
+
* @param q1 - Start quaternion
|
|
49
|
+
* @param q2 - End quaternion
|
|
50
|
+
* @param q3 - Next quaternion (for tangent calculation)
|
|
51
|
+
* @param t - Interpolation parameter (0 = q1, 1 = q2)
|
|
52
|
+
* @returns Smoothly interpolated quaternion
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* // Create a smooth path through multiple rotations
|
|
56
|
+
* const path = [q0, q1, q2, q3]; // Array of quaternions
|
|
57
|
+
* const smooth = QuaternionSQUAD(path[0], path[1], path[2], path[3], 0.5);
|
|
58
|
+
*/
|
|
59
|
+
export function QuaternionSQUAD(q0, q1, q2, q3, t) {
|
|
60
|
+
AssertNormalizedQuaternion(q0);
|
|
61
|
+
AssertNormalizedQuaternion(q1);
|
|
62
|
+
AssertNormalizedQuaternion(q2);
|
|
63
|
+
AssertNormalizedQuaternion(q3);
|
|
64
|
+
AssertNumber(t, { gte: 0, lte: 1 });
|
|
65
|
+
// Calculate intermediate control points
|
|
66
|
+
const s1 = quaternionSquadControlPoint(q0, q1, q2);
|
|
67
|
+
const s2 = quaternionSquadControlPoint(q1, q2, q3);
|
|
68
|
+
// Interpolate using two SLERP operations
|
|
69
|
+
const slerp1 = QuaternionSLERP(q1, q2, t);
|
|
70
|
+
const slerp2 = QuaternionSLERP(s1, s2, t);
|
|
71
|
+
// Final SLERP between the two results
|
|
72
|
+
return QuaternionSLERP(slerp1, slerp2, 2 * t * (1 - t));
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Calculates a control point for SQUAD interpolation.
|
|
76
|
+
* This is an internal helper function for smooth quaternion interpolation.
|
|
77
|
+
*
|
|
78
|
+
* @param q0 - Previous quaternion
|
|
79
|
+
* @param q1 - Current quaternion
|
|
80
|
+
* @param q2 - Next quaternion
|
|
81
|
+
* @returns Control point quaternion for smooth interpolation
|
|
82
|
+
*/
|
|
83
|
+
function quaternionSquadControlPoint(q0, q1, q2) {
|
|
84
|
+
// Calculate logarithms for smooth interpolation
|
|
85
|
+
const q1Inv = QuaternionInverse(q1);
|
|
86
|
+
const log1 = quaternionLog(QuaternionMultiply(q1Inv, q0));
|
|
87
|
+
const log2 = quaternionLog(QuaternionMultiply(q1Inv, q2));
|
|
88
|
+
// Calculate the control point
|
|
89
|
+
const logSum = [
|
|
90
|
+
log1[0] + log2[0],
|
|
91
|
+
log1[1] + log2[1],
|
|
92
|
+
log1[2] + log2[2],
|
|
93
|
+
log1[3] + log2[3],
|
|
94
|
+
];
|
|
95
|
+
const scaledLog = [
|
|
96
|
+
logSum[0] * -0.25,
|
|
97
|
+
logSum[1] * -0.25,
|
|
98
|
+
logSum[2] * -0.25,
|
|
99
|
+
logSum[3] * -0.25,
|
|
100
|
+
];
|
|
101
|
+
return QuaternionMultiply(q1, quaternionExp(scaledLog));
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Calculates the natural logarithm of a quaternion.
|
|
105
|
+
* Used internally for advanced interpolation methods.
|
|
106
|
+
*
|
|
107
|
+
* @param quaternion - The quaternion to calculate logarithm for
|
|
108
|
+
* @returns The logarithmic quaternion
|
|
109
|
+
*/
|
|
110
|
+
function quaternionLog(quaternion) {
|
|
111
|
+
AssertNormalizedQuaternion(quaternion);
|
|
112
|
+
const [x, y, z, w] = quaternion;
|
|
113
|
+
const vectorLength = Math.sqrt((x * x) + (y * y) + (z * z));
|
|
114
|
+
if (vectorLength < QUATERNION_LOG_TOLERANCE)
|
|
115
|
+
return [0, 0, 0, 0];
|
|
116
|
+
const angle = Math.atan2(vectorLength, w);
|
|
117
|
+
const scale = angle / vectorLength;
|
|
118
|
+
return [x * scale, y * scale, z * scale, 0];
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Calculates the exponential of a quaternion.
|
|
122
|
+
* Used internally for advanced interpolation methods.
|
|
123
|
+
*
|
|
124
|
+
* @param quaternion - The quaternion to exponentiate
|
|
125
|
+
* @returns The exponential quaternion
|
|
126
|
+
*/
|
|
127
|
+
function quaternionExp(quaternion) {
|
|
128
|
+
const [x, y, z, w] = quaternion;
|
|
129
|
+
const vectorLength = Math.sqrt((x * x) + (y * y) + (z * z));
|
|
130
|
+
if (vectorLength < QUATERNION_LOG_TOLERANCE)
|
|
131
|
+
return [0, 0, 0, 1];
|
|
132
|
+
const expW = Math.exp(w);
|
|
133
|
+
const cosV = Math.cos(vectorLength);
|
|
134
|
+
const sinV = Math.sin(vectorLength);
|
|
135
|
+
const scale = expW * sinV / vectorLength;
|
|
136
|
+
return [
|
|
137
|
+
x * scale,
|
|
138
|
+
y * scale,
|
|
139
|
+
z * scale,
|
|
140
|
+
expW * cosV,
|
|
141
|
+
];
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Creates a smooth interpolation path through multiple quaternions.
|
|
145
|
+
* Returns a function that can be called with a parameter t ∈ [0, 1] to get
|
|
146
|
+
* interpolated quaternions along the path.
|
|
147
|
+
*
|
|
148
|
+
* @param quaternions - Array of quaternions defining the path
|
|
149
|
+
* @param method - Interpolation method ('slerp' | 'nlerp' | 'squad')
|
|
150
|
+
* @returns Function that takes t ∈ [0, 1] and returns interpolated quaternion
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* const path = [q1, q2, q3, q4];
|
|
154
|
+
* const interpolator = QuaternionCreatePath(path, 'slerp');
|
|
155
|
+
* const halfway = interpolator(0.5); // Interpolated quaternion at 50% along path
|
|
156
|
+
*/
|
|
157
|
+
export function QuaternionCreatePath(quaternions, method = 'slerp') {
|
|
158
|
+
AssertArray(quaternions, { minSize: 2 });
|
|
159
|
+
// Validate all quaternions
|
|
160
|
+
for (const q of quaternions) {
|
|
161
|
+
AssertNormalizedQuaternion(q);
|
|
162
|
+
}
|
|
163
|
+
return (t) => {
|
|
164
|
+
AssertNumber(t, { gte: 0, lte: 1 });
|
|
165
|
+
const [firstQuaternion] = quaternions;
|
|
166
|
+
const lastQuaternion = quaternions[quaternions.length - 1];
|
|
167
|
+
if (t === 0 && firstQuaternion)
|
|
168
|
+
return firstQuaternion;
|
|
169
|
+
if (t === 1 && lastQuaternion)
|
|
170
|
+
return lastQuaternion;
|
|
171
|
+
// Calculate which segment we're in
|
|
172
|
+
const segments = quaternions.length - 1;
|
|
173
|
+
const segmentLength = 1 / segments;
|
|
174
|
+
const segmentIndex = Math.floor(t / segmentLength);
|
|
175
|
+
const segmentT = (t - (segmentIndex * segmentLength)) / segmentLength;
|
|
176
|
+
const currentIndex = Math.min(segmentIndex, segments - 1);
|
|
177
|
+
const nextIndex = Math.min(currentIndex + 1, quaternions.length - 1);
|
|
178
|
+
const q1 = quaternions[currentIndex];
|
|
179
|
+
const q2 = quaternions[nextIndex];
|
|
180
|
+
// Ensure we have valid quaternions
|
|
181
|
+
if (!q1 || !q2)
|
|
182
|
+
throw new Error('Invalid quaternion path calculation');
|
|
183
|
+
switch (method) {
|
|
184
|
+
case 'nlerp':
|
|
185
|
+
return QuaternionNLERP(q1, q2, segmentT);
|
|
186
|
+
case 'squad': {
|
|
187
|
+
// For SQUAD, we need additional quaternions for tangent calculation
|
|
188
|
+
const q0 = quaternions[Math.max(0, currentIndex - 1)];
|
|
189
|
+
const q3 = quaternions[Math.min(quaternions.length - 1, nextIndex + 1)];
|
|
190
|
+
// Ensure we have valid quaternions
|
|
191
|
+
if (!q0 || !q3)
|
|
192
|
+
throw new Error('Invalid quaternion path calculation for SQUAD');
|
|
193
|
+
return QuaternionSQUAD(q0, q1, q2, q3, segmentT);
|
|
194
|
+
}
|
|
195
|
+
case 'slerp':
|
|
196
|
+
default:
|
|
197
|
+
return QuaternionSLERP(q1, q2, segmentT);
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=interpolation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpolation.js","sourceRoot":"","sources":["../../src/quaternions/interpolation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpolation.spec.d.ts","sourceRoot":"","sources":["../../src/quaternions/interpolation.spec.ts"],"names":[],"mappings":""}
|