@triforge/curve-core 0.1.0
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/core/BaseCurve.d.ts +44 -0
- package/dist/core/BaseCurve.d.ts.map +1 -0
- package/dist/core/BaseCurve.js +83 -0
- package/dist/core/BaseCurve.js.map +1 -0
- package/dist/core/BezierCurve.d.ts +63 -0
- package/dist/core/BezierCurve.d.ts.map +1 -0
- package/dist/core/BezierCurve.js +218 -0
- package/dist/core/BezierCurve.js.map +1 -0
- package/dist/core/CatmullRomCurve.d.ts +28 -0
- package/dist/core/CatmullRomCurve.d.ts.map +1 -0
- package/dist/core/CatmullRomCurve.js +100 -0
- package/dist/core/CatmullRomCurve.js.map +1 -0
- package/dist/core/NURBSCurve.d.ts +42 -0
- package/dist/core/NURBSCurve.d.ts.map +1 -0
- package/dist/core/NURBSCurve.js +103 -0
- package/dist/core/NURBSCurve.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/operations/CurveBevel.d.ts +43 -0
- package/dist/operations/CurveBevel.d.ts.map +1 -0
- package/dist/operations/CurveBevel.js +140 -0
- package/dist/operations/CurveBevel.js.map +1 -0
- package/dist/operations/CurveLine.d.ts +19 -0
- package/dist/operations/CurveLine.d.ts.map +1 -0
- package/dist/operations/CurveLine.js +25 -0
- package/dist/operations/CurveLine.js.map +1 -0
- package/dist/operations/CurveTube.d.ts +36 -0
- package/dist/operations/CurveTube.d.ts.map +1 -0
- package/dist/operations/CurveTube.js +141 -0
- package/dist/operations/CurveTube.js.map +1 -0
- package/dist/operations/PathFollow.d.ts +53 -0
- package/dist/operations/PathFollow.d.ts.map +1 -0
- package/dist/operations/PathFollow.js +84 -0
- package/dist/operations/PathFollow.js.map +1 -0
- package/dist/utils/frames.d.ts +30 -0
- package/dist/utils/frames.d.ts.map +1 -0
- package/dist/utils/frames.js +77 -0
- package/dist/utils/frames.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Vector3 } from 'three';
|
|
2
|
+
/**
|
|
3
|
+
* Abstract base for all curve types.
|
|
4
|
+
* Mirrors Blender's internal curve spline: evaluate at parameter t ∈ [0,1].
|
|
5
|
+
*/
|
|
6
|
+
export declare abstract class BaseCurve {
|
|
7
|
+
abstract readonly curveType: string;
|
|
8
|
+
/** All scalar inputs live here for GSAP/keyframe compatibility. */
|
|
9
|
+
abstract parameters: Record<string, number>;
|
|
10
|
+
/**
|
|
11
|
+
* Evaluate the curve at parameter t ∈ [0,1].
|
|
12
|
+
* t=0 → start point, t=1 → end point.
|
|
13
|
+
*/
|
|
14
|
+
abstract getPoint(t: number, target?: Vector3): Vector3;
|
|
15
|
+
/**
|
|
16
|
+
* Tangent vector at t (unit length).
|
|
17
|
+
* Default: finite difference. Override for analytic tangents.
|
|
18
|
+
*/
|
|
19
|
+
getTangent(t: number, target?: Vector3): Vector3;
|
|
20
|
+
/** Arc length of the curve, sampled at `divisions` points. */
|
|
21
|
+
getLength(divisions?: number): number;
|
|
22
|
+
/**
|
|
23
|
+
* Build a cumulative arc-length LUT (lookup table).
|
|
24
|
+
* Returns array of {t, len} pairs with `divisions+1` entries.
|
|
25
|
+
* Used internally for uniform-speed parameterization.
|
|
26
|
+
*/
|
|
27
|
+
buildArcLengthLUT(divisions?: number): {
|
|
28
|
+
t: number;
|
|
29
|
+
len: number;
|
|
30
|
+
}[];
|
|
31
|
+
/**
|
|
32
|
+
* Map a uniform arc-length fraction u ∈ [0,1] → curve parameter t ∈ [0,1].
|
|
33
|
+
* Enables constant-speed path-follow.
|
|
34
|
+
*/
|
|
35
|
+
getUtoTmapping(u: number, lut: {
|
|
36
|
+
t: number;
|
|
37
|
+
len: number;
|
|
38
|
+
}[]): number;
|
|
39
|
+
/**
|
|
40
|
+
* Sample N evenly-spaced points along the curve (arc-length uniform).
|
|
41
|
+
*/
|
|
42
|
+
getSpacedPoints(count: number, divisions?: number): Vector3[];
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=BaseCurve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseCurve.d.ts","sourceRoot":"","sources":["../../src/core/BaseCurve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE/B;;;GAGG;AACH,8BAAsB,SAAS;IAC7B,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IACnC,mEAAmE;IACnE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE3C;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO;IAEvD;;;OAGG;IACH,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,UAAgB,GAAG,OAAO;IAStD,8DAA8D;IAC9D,SAAS,CAAC,SAAS,SAAM,GAAG,MAAM;IAWlC;;;;OAIG;IACH,iBAAiB,CAAC,SAAS,SAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE;IAchE;;;OAGG;IACH,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,MAAM;IAiBpE;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,OAAO,EAAE;CAO3D"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Vector3 } from 'three';
|
|
2
|
+
/**
|
|
3
|
+
* Abstract base for all curve types.
|
|
4
|
+
* Mirrors Blender's internal curve spline: evaluate at parameter t ∈ [0,1].
|
|
5
|
+
*/
|
|
6
|
+
export class BaseCurve {
|
|
7
|
+
/**
|
|
8
|
+
* Tangent vector at t (unit length).
|
|
9
|
+
* Default: finite difference. Override for analytic tangents.
|
|
10
|
+
*/
|
|
11
|
+
getTangent(t, target = new Vector3()) {
|
|
12
|
+
const delta = 1e-4;
|
|
13
|
+
const t0 = Math.max(0, t - delta);
|
|
14
|
+
const t1 = Math.min(1, t + delta);
|
|
15
|
+
const p0 = this.getPoint(t0);
|
|
16
|
+
const p1 = this.getPoint(t1);
|
|
17
|
+
return target.subVectors(p1, p0).normalize();
|
|
18
|
+
}
|
|
19
|
+
/** Arc length of the curve, sampled at `divisions` points. */
|
|
20
|
+
getLength(divisions = 200) {
|
|
21
|
+
let len = 0;
|
|
22
|
+
let prev = this.getPoint(0);
|
|
23
|
+
for (let i = 1; i <= divisions; i++) {
|
|
24
|
+
const cur = this.getPoint(i / divisions);
|
|
25
|
+
len += prev.distanceTo(cur);
|
|
26
|
+
prev = cur;
|
|
27
|
+
}
|
|
28
|
+
return len;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Build a cumulative arc-length LUT (lookup table).
|
|
32
|
+
* Returns array of {t, len} pairs with `divisions+1` entries.
|
|
33
|
+
* Used internally for uniform-speed parameterization.
|
|
34
|
+
*/
|
|
35
|
+
buildArcLengthLUT(divisions = 200) {
|
|
36
|
+
const lut = [{ t: 0, len: 0 }];
|
|
37
|
+
let acc = 0;
|
|
38
|
+
let prev = this.getPoint(0);
|
|
39
|
+
for (let i = 1; i <= divisions; i++) {
|
|
40
|
+
const ti = i / divisions;
|
|
41
|
+
const cur = this.getPoint(ti);
|
|
42
|
+
acc += prev.distanceTo(cur);
|
|
43
|
+
lut.push({ t: ti, len: acc });
|
|
44
|
+
prev = cur;
|
|
45
|
+
}
|
|
46
|
+
return lut;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Map a uniform arc-length fraction u ∈ [0,1] → curve parameter t ∈ [0,1].
|
|
50
|
+
* Enables constant-speed path-follow.
|
|
51
|
+
*/
|
|
52
|
+
getUtoTmapping(u, lut) {
|
|
53
|
+
const totalLen = lut[lut.length - 1].len;
|
|
54
|
+
const target = u * totalLen;
|
|
55
|
+
// Binary search for the segment
|
|
56
|
+
let lo = 0, hi = lut.length - 1;
|
|
57
|
+
while (lo < hi) {
|
|
58
|
+
const mid = (lo + hi) >> 1;
|
|
59
|
+
if (lut[mid].len < target)
|
|
60
|
+
lo = mid + 1;
|
|
61
|
+
else
|
|
62
|
+
hi = mid;
|
|
63
|
+
}
|
|
64
|
+
if (lo === 0)
|
|
65
|
+
return 0;
|
|
66
|
+
const a = lut[lo - 1], b = lut[lo];
|
|
67
|
+
if (b.len === a.len)
|
|
68
|
+
return b.t;
|
|
69
|
+
const alpha = (target - a.len) / (b.len - a.len);
|
|
70
|
+
return a.t + alpha * (b.t - a.t);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Sample N evenly-spaced points along the curve (arc-length uniform).
|
|
74
|
+
*/
|
|
75
|
+
getSpacedPoints(count, divisions = 200) {
|
|
76
|
+
const lut = this.buildArcLengthLUT(divisions);
|
|
77
|
+
return Array.from({ length: count }, (_, i) => {
|
|
78
|
+
const t = this.getUtoTmapping(i / (count - 1), lut);
|
|
79
|
+
return this.getPoint(t);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=BaseCurve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseCurve.js","sourceRoot":"","sources":["../../src/core/BaseCurve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Vector3 } from 'three';
|
|
2
|
+
import { BaseCurve } from './BaseCurve.js';
|
|
3
|
+
/**
|
|
4
|
+
* BezierCurve — cubic Bezier spline through one or more segments.
|
|
5
|
+
* Blender: Bezier Curve spline type.
|
|
6
|
+
*
|
|
7
|
+
* Control points are stored as [anchor, handleRight, …, handleLeft, anchor] triplets.
|
|
8
|
+
* Each segment is defined by: anchor0, handleRight0, handleLeft1, anchor1.
|
|
9
|
+
*
|
|
10
|
+
* For a single segment, 4 control points: p0, p1 (right handle of p0), p2 (left handle of p1), p3.
|
|
11
|
+
* For N segments, 3N+1 points.
|
|
12
|
+
*/
|
|
13
|
+
export declare class BezierCurve extends BaseCurve {
|
|
14
|
+
readonly curveType = "BezierCurve";
|
|
15
|
+
parameters: Record<string, number>;
|
|
16
|
+
/** Flat array of control points: [p0, h0r, h1l, p1, h1r, h2l, p2, ...] */
|
|
17
|
+
private _points;
|
|
18
|
+
/** Whether the curve is closed (last point connects to first). */
|
|
19
|
+
closed: boolean;
|
|
20
|
+
constructor(points: Vector3[], closed?: boolean);
|
|
21
|
+
get points(): readonly Vector3[];
|
|
22
|
+
/** Number of Bezier segments. */
|
|
23
|
+
get segmentCount(): number;
|
|
24
|
+
getPoint(t: number, target?: Vector3): Vector3;
|
|
25
|
+
getTangent(t: number, target?: Vector3): Vector3;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Build aligned-handle control points.
|
|
29
|
+
* Blender: Aligned handle type — both handles share the same direction (mirrored).
|
|
30
|
+
* The caller supplies the right handle for each anchor; the left handle is the mirror.
|
|
31
|
+
*
|
|
32
|
+
* @param anchors Anchor positions (one per control point).
|
|
33
|
+
* @param rightHandles Right handle per anchor. Must be same length as anchors.
|
|
34
|
+
* @param closed Whether the curve closes back on the first anchor.
|
|
35
|
+
* @returns Flat control-point array accepted by the BezierCurve constructor.
|
|
36
|
+
*/
|
|
37
|
+
export declare function buildAlignedHandles(anchors: Vector3[], rightHandles: Vector3[], closed?: boolean): Vector3[];
|
|
38
|
+
/**
|
|
39
|
+
* Build vector-handle control points.
|
|
40
|
+
* Blender: Vector handle type — each handle points straight toward the adjacent anchor.
|
|
41
|
+
*
|
|
42
|
+
* @param anchors Anchor positions.
|
|
43
|
+
* @param closed Whether the curve closes back on the first anchor.
|
|
44
|
+
* @returns Flat control-point array accepted by the BezierCurve constructor.
|
|
45
|
+
*/
|
|
46
|
+
export declare function buildVectorHandles(anchors: Vector3[], closed?: boolean): Vector3[];
|
|
47
|
+
/**
|
|
48
|
+
* Build free-handle control points.
|
|
49
|
+
* Blender: Free handle type — each handle is fully user-specified; no mirroring.
|
|
50
|
+
*
|
|
51
|
+
* @param anchors Anchor positions.
|
|
52
|
+
* @param leftHandles Left (incoming) handle per anchor. Must be same length as anchors.
|
|
53
|
+
* @param rightHandles Right (outgoing) handle per anchor. Must be same length as anchors.
|
|
54
|
+
* @returns Flat control-point array accepted by the BezierCurve constructor.
|
|
55
|
+
*/
|
|
56
|
+
export declare function buildFreeHandles(anchors: Vector3[], leftHandles: Vector3[], rightHandles: Vector3[]): Vector3[];
|
|
57
|
+
/**
|
|
58
|
+
* Build a smooth Bezier curve through a set of anchor points with auto-handles.
|
|
59
|
+
* Blender: Smart Bezier / Auto handles.
|
|
60
|
+
* Uses Catmull-Rom–style handle generation for smooth passage through all points.
|
|
61
|
+
*/
|
|
62
|
+
export declare function buildAutoHandles(anchors: Vector3[], closed?: boolean, tension?: number): Vector3[];
|
|
63
|
+
//# sourceMappingURL=BezierCurve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BezierCurve.d.ts","sourceRoot":"","sources":["../../src/core/BezierCurve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C;;;;;;;;;GASG;AACH,qBAAa,WAAY,SAAQ,SAAS;IACxC,QAAQ,CAAC,SAAS,iBAAgB;IAClC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAK;IAEvC,0EAA0E;IAC1E,OAAO,CAAC,OAAO,CAAW;IAC1B,kEAAkE;IAClE,MAAM,EAAE,OAAO,CAAA;gBAEH,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,UAAQ;IAO7C,IAAI,MAAM,IAAI,SAAS,OAAO,EAAE,CAAwB;IAExD,iCAAiC;IACjC,IAAI,YAAY,IAAI,MAAM,CAIzB;IAED,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,UAAgB,GAAG,OAAO;IAgBpD,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,UAAgB,GAAG,OAAO;CAevD;AAqBD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAAE,EAClB,YAAY,EAAE,OAAO,EAAE,EACvB,MAAM,UAAQ,GACb,OAAO,EAAE,CA2BX;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,UAAQ,GAAG,OAAO,EAAE,CA2ChF;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAAE,EAClB,WAAW,EAAE,OAAO,EAAE,EACtB,YAAY,EAAE,OAAO,EAAE,GACtB,OAAO,EAAE,CAwBX;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,UAAQ,EAAE,OAAO,SAAM,GAAG,OAAO,EAAE,CAoC7F"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { Vector3 } from 'three';
|
|
2
|
+
import { BaseCurve } from './BaseCurve.js';
|
|
3
|
+
/**
|
|
4
|
+
* BezierCurve — cubic Bezier spline through one or more segments.
|
|
5
|
+
* Blender: Bezier Curve spline type.
|
|
6
|
+
*
|
|
7
|
+
* Control points are stored as [anchor, handleRight, …, handleLeft, anchor] triplets.
|
|
8
|
+
* Each segment is defined by: anchor0, handleRight0, handleLeft1, anchor1.
|
|
9
|
+
*
|
|
10
|
+
* For a single segment, 4 control points: p0, p1 (right handle of p0), p2 (left handle of p1), p3.
|
|
11
|
+
* For N segments, 3N+1 points.
|
|
12
|
+
*/
|
|
13
|
+
export class BezierCurve extends BaseCurve {
|
|
14
|
+
constructor(points, closed = false) {
|
|
15
|
+
super();
|
|
16
|
+
this.curveType = 'BezierCurve';
|
|
17
|
+
this.parameters = {};
|
|
18
|
+
if (points.length < 4)
|
|
19
|
+
throw new Error('BezierCurve requires at least 4 control points (1 segment)');
|
|
20
|
+
this._points = points;
|
|
21
|
+
this.closed = closed;
|
|
22
|
+
}
|
|
23
|
+
get points() { return this._points; }
|
|
24
|
+
/** Number of Bezier segments. */
|
|
25
|
+
get segmentCount() {
|
|
26
|
+
return this.closed
|
|
27
|
+
? Math.floor(this._points.length / 3)
|
|
28
|
+
: Math.floor((this._points.length - 1) / 3);
|
|
29
|
+
}
|
|
30
|
+
getPoint(t, target = new Vector3()) {
|
|
31
|
+
t = Math.max(0, Math.min(1, t));
|
|
32
|
+
const segments = this.segmentCount;
|
|
33
|
+
const seg = Math.min(Math.floor(t * segments), segments - 1);
|
|
34
|
+
const local = t * segments - seg;
|
|
35
|
+
const base = seg * 3;
|
|
36
|
+
const n = this._points.length;
|
|
37
|
+
const p0 = this._points[base % n];
|
|
38
|
+
const p1 = this._points[(base + 1) % n];
|
|
39
|
+
const p2 = this._points[(base + 2) % n];
|
|
40
|
+
const p3 = this._points[(base + 3) % n];
|
|
41
|
+
return deCasteljau(p0, p1, p2, p3, local, target);
|
|
42
|
+
}
|
|
43
|
+
getTangent(t, target = new Vector3()) {
|
|
44
|
+
t = Math.max(0, Math.min(1, t));
|
|
45
|
+
const segments = this.segmentCount;
|
|
46
|
+
const seg = Math.min(Math.floor(t * segments), segments - 1);
|
|
47
|
+
const local = t * segments - seg;
|
|
48
|
+
const base = seg * 3;
|
|
49
|
+
const n = this._points.length;
|
|
50
|
+
const p0 = this._points[base % n];
|
|
51
|
+
const p1 = this._points[(base + 1) % n];
|
|
52
|
+
const p2 = this._points[(base + 2) % n];
|
|
53
|
+
const p3 = this._points[(base + 3) % n];
|
|
54
|
+
return cubicBezierTangent(p0, p1, p2, p3, local, target);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Cubic Bezier evaluation via de Casteljau (numerically stable). */
|
|
58
|
+
function deCasteljau(p0, p1, p2, p3, t, out) {
|
|
59
|
+
const mt = 1 - t;
|
|
60
|
+
const x = mt * mt * mt * p0.x + 3 * mt * mt * t * p1.x + 3 * mt * t * t * p2.x + t * t * t * p3.x;
|
|
61
|
+
const y = mt * mt * mt * p0.y + 3 * mt * mt * t * p1.y + 3 * mt * t * t * p2.y + t * t * t * p3.y;
|
|
62
|
+
const z = mt * mt * mt * p0.z + 3 * mt * mt * t * p1.z + 3 * mt * t * t * p2.z + t * t * t * p3.z;
|
|
63
|
+
return out.set(x, y, z);
|
|
64
|
+
}
|
|
65
|
+
/** Cubic Bezier derivative (tangent) — analytic. */
|
|
66
|
+
function cubicBezierTangent(p0, p1, p2, p3, t, out) {
|
|
67
|
+
const mt = 1 - t;
|
|
68
|
+
const x = 3 * (mt * mt * (p1.x - p0.x) + 2 * mt * t * (p2.x - p1.x) + t * t * (p3.x - p2.x));
|
|
69
|
+
const y = 3 * (mt * mt * (p1.y - p0.y) + 2 * mt * t * (p2.y - p1.y) + t * t * (p3.y - p2.y));
|
|
70
|
+
const z = 3 * (mt * mt * (p1.z - p0.z) + 2 * mt * t * (p2.z - p1.z) + t * t * (p3.z - p2.z));
|
|
71
|
+
const len = Math.sqrt(x * x + y * y + z * z) || 1;
|
|
72
|
+
return out.set(x / len, y / len, z / len);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Build aligned-handle control points.
|
|
76
|
+
* Blender: Aligned handle type — both handles share the same direction (mirrored).
|
|
77
|
+
* The caller supplies the right handle for each anchor; the left handle is the mirror.
|
|
78
|
+
*
|
|
79
|
+
* @param anchors Anchor positions (one per control point).
|
|
80
|
+
* @param rightHandles Right handle per anchor. Must be same length as anchors.
|
|
81
|
+
* @param closed Whether the curve closes back on the first anchor.
|
|
82
|
+
* @returns Flat control-point array accepted by the BezierCurve constructor.
|
|
83
|
+
*/
|
|
84
|
+
export function buildAlignedHandles(anchors, rightHandles, closed = false) {
|
|
85
|
+
const n = anchors.length;
|
|
86
|
+
if (n < 2)
|
|
87
|
+
throw new Error('Need at least 2 anchor points');
|
|
88
|
+
if (rightHandles.length !== n)
|
|
89
|
+
throw new Error('rightHandles must have the same length as anchors');
|
|
90
|
+
const pts = [];
|
|
91
|
+
for (let i = 0; i < n; i++) {
|
|
92
|
+
const cur = anchors[i];
|
|
93
|
+
const hr = rightHandles[i];
|
|
94
|
+
// Left handle is the mirror of the right handle across the anchor
|
|
95
|
+
const hl = new Vector3(2 * cur.x - hr.x, 2 * cur.y - hr.y, 2 * cur.z - hr.z);
|
|
96
|
+
if (i === 0) {
|
|
97
|
+
pts.push(cur.clone(), hr.clone());
|
|
98
|
+
}
|
|
99
|
+
else if (i === n - 1 && !closed) {
|
|
100
|
+
pts.push(hl, cur.clone());
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
pts.push(hl, cur.clone(), hr.clone());
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return pts;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Build vector-handle control points.
|
|
110
|
+
* Blender: Vector handle type — each handle points straight toward the adjacent anchor.
|
|
111
|
+
*
|
|
112
|
+
* @param anchors Anchor positions.
|
|
113
|
+
* @param closed Whether the curve closes back on the first anchor.
|
|
114
|
+
* @returns Flat control-point array accepted by the BezierCurve constructor.
|
|
115
|
+
*/
|
|
116
|
+
export function buildVectorHandles(anchors, closed = false) {
|
|
117
|
+
const n = anchors.length;
|
|
118
|
+
if (n < 2)
|
|
119
|
+
throw new Error('Need at least 2 anchor points');
|
|
120
|
+
const pts = [];
|
|
121
|
+
const scale = 1 / 3;
|
|
122
|
+
for (let i = 0; i < n; i++) {
|
|
123
|
+
const cur = anchors[i];
|
|
124
|
+
const prev = anchors[(i - 1 + n) % n];
|
|
125
|
+
const next = anchors[(i + 1) % n];
|
|
126
|
+
const isFirst = !closed && i === 0;
|
|
127
|
+
const isLast = !closed && i === n - 1;
|
|
128
|
+
// Right handle: points toward next anchor (or stays at cur for open-end last)
|
|
129
|
+
const hr = isLast
|
|
130
|
+
? cur.clone()
|
|
131
|
+
: new Vector3(cur.x + (next.x - cur.x) * scale, cur.y + (next.y - cur.y) * scale, cur.z + (next.z - cur.z) * scale);
|
|
132
|
+
// Left handle: points toward prev anchor (or stays at cur for open-end first)
|
|
133
|
+
const hl = isFirst
|
|
134
|
+
? cur.clone()
|
|
135
|
+
: new Vector3(cur.x + (prev.x - cur.x) * scale, cur.y + (prev.y - cur.y) * scale, cur.z + (prev.z - cur.z) * scale);
|
|
136
|
+
if (i === 0) {
|
|
137
|
+
pts.push(cur.clone(), hr);
|
|
138
|
+
}
|
|
139
|
+
else if (i === n - 1 && !closed) {
|
|
140
|
+
pts.push(hl, cur.clone());
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
pts.push(hl, cur.clone(), hr);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return pts;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Build free-handle control points.
|
|
150
|
+
* Blender: Free handle type — each handle is fully user-specified; no mirroring.
|
|
151
|
+
*
|
|
152
|
+
* @param anchors Anchor positions.
|
|
153
|
+
* @param leftHandles Left (incoming) handle per anchor. Must be same length as anchors.
|
|
154
|
+
* @param rightHandles Right (outgoing) handle per anchor. Must be same length as anchors.
|
|
155
|
+
* @returns Flat control-point array accepted by the BezierCurve constructor.
|
|
156
|
+
*/
|
|
157
|
+
export function buildFreeHandles(anchors, leftHandles, rightHandles) {
|
|
158
|
+
const n = anchors.length;
|
|
159
|
+
if (n < 2)
|
|
160
|
+
throw new Error('Need at least 2 anchor points');
|
|
161
|
+
if (leftHandles.length !== n || rightHandles.length !== n) {
|
|
162
|
+
throw new Error('leftHandles and rightHandles must have the same length as anchors');
|
|
163
|
+
}
|
|
164
|
+
const pts = [];
|
|
165
|
+
for (let i = 0; i < n; i++) {
|
|
166
|
+
const cur = anchors[i];
|
|
167
|
+
const hr = rightHandles[i];
|
|
168
|
+
const hl = leftHandles[i];
|
|
169
|
+
if (i === 0) {
|
|
170
|
+
pts.push(cur.clone(), hr.clone());
|
|
171
|
+
}
|
|
172
|
+
else if (i === n - 1) {
|
|
173
|
+
pts.push(hl.clone(), cur.clone());
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
pts.push(hl.clone(), cur.clone(), hr.clone());
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return pts;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Build a smooth Bezier curve through a set of anchor points with auto-handles.
|
|
183
|
+
* Blender: Smart Bezier / Auto handles.
|
|
184
|
+
* Uses Catmull-Rom–style handle generation for smooth passage through all points.
|
|
185
|
+
*/
|
|
186
|
+
export function buildAutoHandles(anchors, closed = false, tension = 0.5) {
|
|
187
|
+
const n = anchors.length;
|
|
188
|
+
if (n < 2)
|
|
189
|
+
throw new Error('Need at least 2 anchor points');
|
|
190
|
+
const pts = [];
|
|
191
|
+
for (let i = 0; i < n; i++) {
|
|
192
|
+
const prev = anchors[(i - 1 + n) % n];
|
|
193
|
+
const cur = anchors[i];
|
|
194
|
+
const next = anchors[(i + 1) % n];
|
|
195
|
+
const isFirst = !closed && i === 0;
|
|
196
|
+
const isLast = !closed && i === n - 1;
|
|
197
|
+
// Tangent direction: difference of neighbours
|
|
198
|
+
const dx = isFirst ? (next.x - cur.x) : isLast ? (cur.x - prev.x) : (next.x - prev.x) * tension;
|
|
199
|
+
const dy = isFirst ? (next.y - cur.y) : isLast ? (cur.y - prev.y) : (next.y - prev.y) * tension;
|
|
200
|
+
const dz = isFirst ? (next.z - cur.z) : isLast ? (cur.z - prev.z) : (next.z - prev.z) * tension;
|
|
201
|
+
const scale = 1 / 3;
|
|
202
|
+
// Left handle (incoming)
|
|
203
|
+
const hl = new Vector3(cur.x - dx * scale, cur.y - dy * scale, cur.z - dz * scale);
|
|
204
|
+
// Right handle (outgoing)
|
|
205
|
+
const hr = new Vector3(cur.x + dx * scale, cur.y + dy * scale, cur.z + dz * scale);
|
|
206
|
+
if (i === 0) {
|
|
207
|
+
pts.push(cur.clone(), hr);
|
|
208
|
+
}
|
|
209
|
+
else if (i === n - 1) {
|
|
210
|
+
pts.push(hl, cur.clone());
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
pts.push(hl, cur.clone(), hr);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return pts;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=BezierCurve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BezierCurve.js","sourceRoot":"","sources":["../../src/core/BezierCurve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Vector3 } from 'three';
|
|
2
|
+
import { BaseCurve } from './BaseCurve.js';
|
|
3
|
+
/**
|
|
4
|
+
* CatmullRomCurve — smooth interpolating spline through all control points.
|
|
5
|
+
* Blender: Poly spline with smooth interpolation / Path animation target.
|
|
6
|
+
*
|
|
7
|
+
* Unlike Bezier, every point lies ON the curve. Ideal for camera paths,
|
|
8
|
+
* particle guides, and path-follow animations.
|
|
9
|
+
*
|
|
10
|
+
* Supports Catmull-Rom (tension=0.5) and general tension control.
|
|
11
|
+
* Blender uses Catmull-Rom for its path animation curves by default.
|
|
12
|
+
*/
|
|
13
|
+
export declare class CatmullRomCurve extends BaseCurve {
|
|
14
|
+
readonly curveType = "CatmullRomCurve";
|
|
15
|
+
parameters: {
|
|
16
|
+
tension: number;
|
|
17
|
+
};
|
|
18
|
+
private _points;
|
|
19
|
+
closed: boolean;
|
|
20
|
+
constructor(points: Vector3[], opts?: {
|
|
21
|
+
tension?: number;
|
|
22
|
+
closed?: boolean;
|
|
23
|
+
});
|
|
24
|
+
get points(): readonly Vector3[];
|
|
25
|
+
getPoint(t: number, target?: Vector3): Vector3;
|
|
26
|
+
getTangent(t: number, target?: Vector3): Vector3;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=CatmullRomCurve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CatmullRomCurve.d.ts","sourceRoot":"","sources":["../../src/core/CatmullRomCurve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C;;;;;;;;;GASG;AACH,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,QAAQ,CAAC,SAAS,qBAAoB;IACtC,UAAU,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IAE/B,OAAO,CAAC,OAAO,CAAW;IAC1B,MAAM,EAAE,OAAO,CAAA;gBAEH,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO;IAQhF,IAAI,MAAM,IAAI,SAAS,OAAO,EAAE,CAAwB;IAExD,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,UAAgB,GAAG,OAAO;IA6BpD,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,UAAgB,GAAG,OAAO;CAyBvD"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Vector3 } from 'three';
|
|
2
|
+
import { BaseCurve } from './BaseCurve.js';
|
|
3
|
+
/**
|
|
4
|
+
* CatmullRomCurve — smooth interpolating spline through all control points.
|
|
5
|
+
* Blender: Poly spline with smooth interpolation / Path animation target.
|
|
6
|
+
*
|
|
7
|
+
* Unlike Bezier, every point lies ON the curve. Ideal for camera paths,
|
|
8
|
+
* particle guides, and path-follow animations.
|
|
9
|
+
*
|
|
10
|
+
* Supports Catmull-Rom (tension=0.5) and general tension control.
|
|
11
|
+
* Blender uses Catmull-Rom for its path animation curves by default.
|
|
12
|
+
*/
|
|
13
|
+
export class CatmullRomCurve extends BaseCurve {
|
|
14
|
+
constructor(points, opts = {}) {
|
|
15
|
+
super();
|
|
16
|
+
this.curveType = 'CatmullRomCurve';
|
|
17
|
+
if (points.length < 2)
|
|
18
|
+
throw new Error('CatmullRomCurve requires at least 2 points');
|
|
19
|
+
this._points = points;
|
|
20
|
+
this.closed = opts.closed ?? false;
|
|
21
|
+
this.parameters = { tension: opts.tension ?? 0.5 };
|
|
22
|
+
}
|
|
23
|
+
get points() { return this._points; }
|
|
24
|
+
getPoint(t, target = new Vector3()) {
|
|
25
|
+
t = Math.max(0, Math.min(1, t));
|
|
26
|
+
const pts = this._points;
|
|
27
|
+
const n = pts.length;
|
|
28
|
+
const segments = this.closed ? n : n - 1;
|
|
29
|
+
const seg = Math.min(Math.floor(t * segments), segments - 1);
|
|
30
|
+
const local = t * segments - seg;
|
|
31
|
+
const alpha = this.parameters.tension;
|
|
32
|
+
let p0, p1, p2, p3;
|
|
33
|
+
if (this.closed) {
|
|
34
|
+
p0 = pts[(seg - 1 + n) % n];
|
|
35
|
+
p1 = pts[seg % n];
|
|
36
|
+
p2 = pts[(seg + 1) % n];
|
|
37
|
+
p3 = pts[(seg + 2) % n];
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// Clamp phantom points at both ends
|
|
41
|
+
p0 = seg === 0 ? pts[0] : pts[seg - 1];
|
|
42
|
+
p1 = pts[seg];
|
|
43
|
+
p2 = pts[seg + 1];
|
|
44
|
+
p3 = seg + 2 < n ? pts[seg + 2] : pts[n - 1];
|
|
45
|
+
}
|
|
46
|
+
return catmullRom(p0, p1, p2, p3, local, alpha, target);
|
|
47
|
+
}
|
|
48
|
+
getTangent(t, target = new Vector3()) {
|
|
49
|
+
t = Math.max(0, Math.min(1, t));
|
|
50
|
+
const pts = this._points;
|
|
51
|
+
const n = pts.length;
|
|
52
|
+
const segments = this.closed ? n : n - 1;
|
|
53
|
+
const seg = Math.min(Math.floor(t * segments), segments - 1);
|
|
54
|
+
const local = t * segments - seg;
|
|
55
|
+
const alpha = this.parameters.tension;
|
|
56
|
+
let p0, p1, p2, p3;
|
|
57
|
+
if (this.closed) {
|
|
58
|
+
p0 = pts[(seg - 1 + n) % n];
|
|
59
|
+
p1 = pts[seg % n];
|
|
60
|
+
p2 = pts[(seg + 1) % n];
|
|
61
|
+
p3 = pts[(seg + 2) % n];
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
p0 = seg === 0 ? pts[0] : pts[seg - 1];
|
|
65
|
+
p1 = pts[seg];
|
|
66
|
+
p2 = pts[seg + 1];
|
|
67
|
+
p3 = seg + 2 < n ? pts[seg + 2] : pts[n - 1];
|
|
68
|
+
}
|
|
69
|
+
return catmullRomTangent(p0, p1, p2, p3, local, alpha, target);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Cubic Hermite form of Catmull-Rom. alpha = tension (0.5 = standard). */
|
|
73
|
+
function catmullRom(p0, p1, p2, p3, t, alpha, out) {
|
|
74
|
+
const t2 = t * t, t3 = t2 * t;
|
|
75
|
+
// Tangent vectors at p1 and p2
|
|
76
|
+
const m1x = alpha * (p2.x - p0.x), m1y = alpha * (p2.y - p0.y), m1z = alpha * (p2.z - p0.z);
|
|
77
|
+
const m2x = alpha * (p3.x - p1.x), m2y = alpha * (p3.y - p1.y), m2z = alpha * (p3.z - p1.z);
|
|
78
|
+
// Hermite basis
|
|
79
|
+
const h00 = 2 * t3 - 3 * t2 + 1;
|
|
80
|
+
const h10 = t3 - 2 * t2 + t;
|
|
81
|
+
const h01 = -2 * t3 + 3 * t2;
|
|
82
|
+
const h11 = t3 - t2;
|
|
83
|
+
return out.set(h00 * p1.x + h10 * m1x + h01 * p2.x + h11 * m2x, h00 * p1.y + h10 * m1y + h01 * p2.y + h11 * m2y, h00 * p1.z + h10 * m1z + h01 * p2.z + h11 * m2z);
|
|
84
|
+
}
|
|
85
|
+
function catmullRomTangent(p0, p1, p2, p3, t, alpha, out) {
|
|
86
|
+
const t2 = t * t;
|
|
87
|
+
const m1x = alpha * (p2.x - p0.x), m1y = alpha * (p2.y - p0.y), m1z = alpha * (p2.z - p0.z);
|
|
88
|
+
const m2x = alpha * (p3.x - p1.x), m2y = alpha * (p3.y - p1.y), m2z = alpha * (p3.z - p1.z);
|
|
89
|
+
// Derivative of Hermite basis
|
|
90
|
+
const dh00 = 6 * t2 - 6 * t;
|
|
91
|
+
const dh10 = 3 * t2 - 4 * t + 1;
|
|
92
|
+
const dh01 = -6 * t2 + 6 * t;
|
|
93
|
+
const dh11 = 3 * t2 - 2 * t;
|
|
94
|
+
const x = dh00 * p1.x + dh10 * m1x + dh01 * p2.x + dh11 * m2x;
|
|
95
|
+
const y = dh00 * p1.y + dh10 * m1y + dh01 * p2.y + dh11 * m2y;
|
|
96
|
+
const z = dh00 * p1.z + dh10 * m1z + dh01 * p2.z + dh11 * m2z;
|
|
97
|
+
const len = Math.sqrt(x * x + y * y + z * z) || 1;
|
|
98
|
+
return out.set(x / len, y / len, z / len);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=CatmullRomCurve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CatmullRomCurve.js","sourceRoot":"","sources":["../../src/core/CatmullRomCurve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Vector3 } from 'three';
|
|
2
|
+
import { BaseCurve } from './BaseCurve.js';
|
|
3
|
+
/**
|
|
4
|
+
* NURBSCurve — Non-Uniform Rational B-Spline.
|
|
5
|
+
* Blender: NURBS spline type.
|
|
6
|
+
*
|
|
7
|
+
* Supports arbitrary degree (order = degree + 1), non-uniform knots, and per-point weights.
|
|
8
|
+
* A weight > 1 pulls the curve toward that control point; weight = 1 is uniform (B-spline).
|
|
9
|
+
* Circle arcs require weight = cos(θ/2) where θ is the arc angle.
|
|
10
|
+
*/
|
|
11
|
+
export declare class NURBSCurve extends BaseCurve {
|
|
12
|
+
readonly curveType = "NURBSCurve";
|
|
13
|
+
parameters: Record<string, number>;
|
|
14
|
+
private _points;
|
|
15
|
+
private _weights;
|
|
16
|
+
private _knots;
|
|
17
|
+
/** Blender: Order U — degree = order - 1. Default 4 (cubic). */
|
|
18
|
+
order: number;
|
|
19
|
+
closed: boolean;
|
|
20
|
+
constructor(points: Vector3[], opts?: {
|
|
21
|
+
order?: number;
|
|
22
|
+
weights?: number[];
|
|
23
|
+
knots?: number[];
|
|
24
|
+
closed?: boolean;
|
|
25
|
+
});
|
|
26
|
+
get points(): readonly Vector3[];
|
|
27
|
+
get weights(): readonly number[];
|
|
28
|
+
get knots(): readonly number[];
|
|
29
|
+
getPoint(t: number, target?: Vector3): Vector3;
|
|
30
|
+
}
|
|
31
|
+
/** Open uniform knot vector for n control points and given order (clamped at both ends). */
|
|
32
|
+
export declare function buildOpenUniformKnots(n: number, order: number): number[];
|
|
33
|
+
/**
|
|
34
|
+
* Build a NURBS circle in XY plane with given radius.
|
|
35
|
+
* Uses 9 control points with cos(45°) weights for exact circular arcs.
|
|
36
|
+
*/
|
|
37
|
+
export declare function buildNURBSCircle(radius?: number): {
|
|
38
|
+
points: Vector3[];
|
|
39
|
+
weights: number[];
|
|
40
|
+
knots: number[];
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=NURBSCurve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NURBSCurve.d.ts","sourceRoot":"","sources":["../../src/core/NURBSCurve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C;;;;;;;GAOG;AACH,qBAAa,UAAW,SAAQ,SAAS;IACvC,QAAQ,CAAC,SAAS,gBAAe;IACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAK;IAEvC,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,MAAM,CAAU;IACxB,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,OAAO,CAAA;gBAEH,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,GAAE;QACnC,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;QAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;QAChB,MAAM,CAAC,EAAE,OAAO,CAAA;KACZ;IAWN,IAAI,MAAM,IAAK,SAAS,OAAO,EAAE,CAAwB;IACzD,IAAI,OAAO,IAAI,SAAS,MAAM,EAAE,CAA0B;IAC1D,IAAI,KAAK,IAAM,SAAS,MAAM,EAAE,CAAwB;IAExD,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,UAAgB,GAAG,OAAO;CAwBrD;AAiBD,4FAA4F;AAC5F,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAUxE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,SAAI,GAAG;IAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAiBtG"}
|