@triforge/physics-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/cloth/ClothSimulator.d.ts +127 -0
- package/dist/cloth/ClothSimulator.d.ts.map +1 -0
- package/dist/cloth/ClothSimulator.js +355 -0
- package/dist/cloth/ClothSimulator.js.map +1 -0
- package/dist/collision/BaseCollider.d.ts +19 -0
- package/dist/collision/BaseCollider.d.ts.map +1 -0
- package/dist/collision/BaseCollider.js +14 -0
- package/dist/collision/BaseCollider.js.map +1 -0
- package/dist/collision/CapsuleCollider.d.ts +29 -0
- package/dist/collision/CapsuleCollider.d.ts.map +1 -0
- package/dist/collision/CapsuleCollider.js +41 -0
- package/dist/collision/CapsuleCollider.js.map +1 -0
- package/dist/collision/PlaneCollider.d.ts +30 -0
- package/dist/collision/PlaneCollider.d.ts.map +1 -0
- package/dist/collision/PlaneCollider.js +38 -0
- package/dist/collision/PlaneCollider.js.map +1 -0
- package/dist/collision/SphereCollider.d.ts +25 -0
- package/dist/collision/SphereCollider.d.ts.map +1 -0
- package/dist/collision/SphereCollider.js +36 -0
- package/dist/collision/SphereCollider.js.map +1 -0
- package/dist/forces/WindForce.d.ts +39 -0
- package/dist/forces/WindForce.d.ts.map +1 -0
- package/dist/forces/WindForce.js +40 -0
- package/dist/forces/WindForce.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/rigidbody/RigidBodyConstraints.d.ts +179 -0
- package/dist/rigidbody/RigidBodyConstraints.d.ts.map +1 -0
- package/dist/rigidbody/RigidBodyConstraints.js +480 -0
- package/dist/rigidbody/RigidBodyConstraints.js.map +1 -0
- package/dist/rigidbody/RigidBodyWorld.d.ts +136 -0
- package/dist/rigidbody/RigidBodyWorld.d.ts.map +1 -0
- package/dist/rigidbody/RigidBodyWorld.js +319 -0
- package/dist/rigidbody/RigidBodyWorld.js.map +1 -0
- package/dist/softbody/SoftBodySimulator.d.ts +103 -0
- package/dist/softbody/SoftBodySimulator.d.ts.map +1 -0
- package/dist/softbody/SoftBodySimulator.js +311 -0
- package/dist/softbody/SoftBodySimulator.js.map +1 -0
- package/dist/utils/noise.d.ts +3 -0
- package/dist/utils/noise.d.ts.map +1 -0
- package/dist/utils/noise.js +20 -0
- package/dist/utils/noise.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { BaseCollider } from './BaseCollider.js';
|
|
2
|
+
/**
|
|
3
|
+
* PlaneCollider — infinite flat plane collider.
|
|
4
|
+
* Blender: Collision object with a flat plane mesh.
|
|
5
|
+
*
|
|
6
|
+
* The plane is defined by a point on it and a normal vector.
|
|
7
|
+
* Default: ground plane at Y=0, normal pointing up.
|
|
8
|
+
*/
|
|
9
|
+
export declare class PlaneCollider extends BaseCollider {
|
|
10
|
+
readonly colliderType = "PlaneCollider";
|
|
11
|
+
parameters: {
|
|
12
|
+
/** Point on the plane (Y component used for horizontal planes). */
|
|
13
|
+
pointX: number;
|
|
14
|
+
pointY: number;
|
|
15
|
+
pointZ: number;
|
|
16
|
+
/** Normal direction (should be unit length). */
|
|
17
|
+
normalX: number;
|
|
18
|
+
normalY: number;
|
|
19
|
+
normalZ: number;
|
|
20
|
+
/** Friction coefficient [0, 1]. 0 = frictionless, 1 = full stop. */
|
|
21
|
+
friction: number;
|
|
22
|
+
};
|
|
23
|
+
constructor(opts?: {
|
|
24
|
+
point?: [number, number, number];
|
|
25
|
+
normal?: [number, number, number];
|
|
26
|
+
friction?: number;
|
|
27
|
+
});
|
|
28
|
+
resolve(px: number, py: number, pz: number): [number, number, number] | null;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=PlaneCollider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlaneCollider.d.ts","sourceRoot":"","sources":["../../src/collision/PlaneCollider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,QAAQ,CAAC,YAAY,mBAAkB;IAEvC,UAAU,EAAE;QACV,mEAAmE;QACnE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;QAC9C,gDAAgD;QAChD,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;QACjD,oEAAoE;QACpE,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;gBAEW,IAAI,GAAE;QAChB,KAAK,CAAC,EAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACjC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACjC,QAAQ,CAAC,EAAE,MAAM,CAAA;KACb;IAWN,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;CAgB7E"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { BaseCollider } from './BaseCollider.js';
|
|
2
|
+
/**
|
|
3
|
+
* PlaneCollider — infinite flat plane collider.
|
|
4
|
+
* Blender: Collision object with a flat plane mesh.
|
|
5
|
+
*
|
|
6
|
+
* The plane is defined by a point on it and a normal vector.
|
|
7
|
+
* Default: ground plane at Y=0, normal pointing up.
|
|
8
|
+
*/
|
|
9
|
+
export class PlaneCollider extends BaseCollider {
|
|
10
|
+
constructor(opts = {}) {
|
|
11
|
+
super();
|
|
12
|
+
this.colliderType = 'PlaneCollider';
|
|
13
|
+
const p = opts.point ?? [0, 0, 0];
|
|
14
|
+
const n = opts.normal ?? [0, 1, 0];
|
|
15
|
+
this.parameters = {
|
|
16
|
+
pointX: p[0], pointY: p[1], pointZ: p[2],
|
|
17
|
+
normalX: n[0], normalY: n[1], normalZ: n[2],
|
|
18
|
+
friction: opts.friction ?? 0.1,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
resolve(px, py, pz) {
|
|
22
|
+
if (!this.enabled)
|
|
23
|
+
return null;
|
|
24
|
+
const { pointX, pointY, pointZ, normalX, normalY, normalZ } = this.parameters;
|
|
25
|
+
// Signed distance from plane
|
|
26
|
+
const dx = px - pointX, dy = py - pointY, dz = pz - pointZ;
|
|
27
|
+
const dist = dx * normalX + dy * normalY + dz * normalZ;
|
|
28
|
+
if (dist >= 0)
|
|
29
|
+
return null; // above plane — no collision
|
|
30
|
+
// Push back to plane surface
|
|
31
|
+
return [
|
|
32
|
+
px - normalX * dist,
|
|
33
|
+
py - normalY * dist,
|
|
34
|
+
pz - normalZ * dist,
|
|
35
|
+
];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=PlaneCollider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlaneCollider.js","sourceRoot":"","sources":["../../src/collision/PlaneCollider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD;;;;;;GAMG;AACH,MAAM,OAAO,aAAc,SAAQ,YAAY;IAY7C,YAAY,OAIR,EAAE;QACJ,KAAK,EAAE,CAAA;QAhBA,iBAAY,GAAG,eAAe,CAAA;QAiBrC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,IAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAClC,IAAI,CAAC,UAAU,GAAG;YAChB,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1C,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3C,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,GAAG;SAC/B,CAAA;IACH,CAAC;IAED,OAAO,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU;QACxC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QAC9B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,CAAA;QAC7E,6BAA6B;QAC7B,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,MAAM,CAAA;QAC1D,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,GAAG,EAAE,GAAG,OAAO,GAAG,EAAE,GAAG,OAAO,CAAA;QAEvD,IAAI,IAAI,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA,CAAE,6BAA6B;QAEzD,6BAA6B;QAC7B,OAAO;YACL,EAAE,GAAG,OAAO,GAAG,IAAI;YACnB,EAAE,GAAG,OAAO,GAAG,IAAI;YACnB,EAAE,GAAG,OAAO,GAAG,IAAI;SACpB,CAAA;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BaseCollider } from './BaseCollider.js';
|
|
2
|
+
/**
|
|
3
|
+
* SphereCollider — sphere-shaped collider.
|
|
4
|
+
* Blender: Collision modifier on a sphere mesh object.
|
|
5
|
+
*
|
|
6
|
+
* Cloth particles are pushed to the sphere surface when inside.
|
|
7
|
+
*/
|
|
8
|
+
export declare class SphereCollider extends BaseCollider {
|
|
9
|
+
readonly colliderType = "SphereCollider";
|
|
10
|
+
parameters: {
|
|
11
|
+
centerX: number;
|
|
12
|
+
centerY: number;
|
|
13
|
+
centerZ: number;
|
|
14
|
+
radius: number;
|
|
15
|
+
/** Friction coefficient [0, 1]. */
|
|
16
|
+
friction: number;
|
|
17
|
+
};
|
|
18
|
+
constructor(opts?: {
|
|
19
|
+
center?: [number, number, number];
|
|
20
|
+
radius?: number;
|
|
21
|
+
friction?: number;
|
|
22
|
+
});
|
|
23
|
+
resolve(px: number, py: number, pz: number): [number, number, number] | null;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=SphereCollider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SphereCollider.d.ts","sourceRoot":"","sources":["../../src/collision/SphereCollider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD;;;;;GAKG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,QAAQ,CAAC,YAAY,oBAAmB;IAExC,UAAU,EAAE;QACV,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;QACjD,MAAM,EAAE,MAAM,CAAA;QACd,mCAAmC;QACnC,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;gBAEW,IAAI,GAAE;QAChB,MAAM,CAAC,EAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAClC,MAAM,CAAC,EAAG,MAAM,CAAA;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;KACb;IAUN,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;CAgB7E"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { BaseCollider } from './BaseCollider.js';
|
|
2
|
+
/**
|
|
3
|
+
* SphereCollider — sphere-shaped collider.
|
|
4
|
+
* Blender: Collision modifier on a sphere mesh object.
|
|
5
|
+
*
|
|
6
|
+
* Cloth particles are pushed to the sphere surface when inside.
|
|
7
|
+
*/
|
|
8
|
+
export class SphereCollider extends BaseCollider {
|
|
9
|
+
constructor(opts = {}) {
|
|
10
|
+
super();
|
|
11
|
+
this.colliderType = 'SphereCollider';
|
|
12
|
+
const c = opts.center ?? [0, 0, 0];
|
|
13
|
+
this.parameters = {
|
|
14
|
+
centerX: c[0], centerY: c[1], centerZ: c[2],
|
|
15
|
+
radius: opts.radius ?? 1,
|
|
16
|
+
friction: opts.friction ?? 0.1,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
resolve(px, py, pz) {
|
|
20
|
+
if (!this.enabled)
|
|
21
|
+
return null;
|
|
22
|
+
const { centerX, centerY, centerZ, radius } = this.parameters;
|
|
23
|
+
const dx = px - centerX, dy = py - centerY, dz = pz - centerZ;
|
|
24
|
+
const d2 = dx * dx + dy * dy + dz * dz;
|
|
25
|
+
if (d2 >= radius * radius)
|
|
26
|
+
return null; // outside sphere
|
|
27
|
+
const d = Math.sqrt(d2) || 1e-6;
|
|
28
|
+
const inv = radius / d;
|
|
29
|
+
return [
|
|
30
|
+
centerX + dx * inv,
|
|
31
|
+
centerY + dy * inv,
|
|
32
|
+
centerZ + dz * inv,
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=SphereCollider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SphereCollider.js","sourceRoot":"","sources":["../../src/collision/SphereCollider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD;;;;;GAKG;AACH,MAAM,OAAO,cAAe,SAAQ,YAAY;IAU9C,YAAY,OAIR,EAAE;QACJ,KAAK,EAAE,CAAA;QAdA,iBAAY,GAAG,gBAAgB,CAAA;QAetC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAClC,IAAI,CAAC,UAAU,GAAG;YAChB,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,EAAG,IAAI,CAAC,MAAM,IAAK,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,GAAG;SAC/B,CAAA;IACH,CAAC;IAED,OAAO,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU;QACxC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QAC9B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAA;QAC7D,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;QAC7D,MAAM,EAAE,GAAG,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAA;QAEhC,IAAI,EAAE,IAAI,MAAM,GAAG,MAAM;YAAE,OAAO,IAAI,CAAA,CAAE,iBAAiB;QAEzD,MAAM,CAAC,GAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAA;QACjC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,CAAA;QACtB,OAAO;YACL,OAAO,GAAG,EAAE,GAAG,GAAG;YAClB,OAAO,GAAG,EAAE,GAAG,GAAG;YAClB,OAAO,GAAG,EAAE,GAAG,GAAG;SACnB,CAAA;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WindForce — directional wind with turbulence.
|
|
3
|
+
* Blender: Force Field > Wind.
|
|
4
|
+
*
|
|
5
|
+
* Returns a per-step acceleration contribution for each cloth particle.
|
|
6
|
+
* The turbulence adds spatial noise so the cloth billows naturally.
|
|
7
|
+
*/
|
|
8
|
+
export declare class WindForce {
|
|
9
|
+
parameters: {
|
|
10
|
+
/** Wind direction X component. */
|
|
11
|
+
dirX: number;
|
|
12
|
+
/** Wind direction Y component. */
|
|
13
|
+
dirY: number;
|
|
14
|
+
/** Wind direction Z component. */
|
|
15
|
+
dirZ: number;
|
|
16
|
+
/** Wind strength (m/s²). Blender: Strength. */
|
|
17
|
+
strength: number;
|
|
18
|
+
/** Turbulence amplitude [0, 1]. Blender: Noise. */
|
|
19
|
+
turbulence: number;
|
|
20
|
+
/** Turbulence frequency — how fast the noise evolves over time. */
|
|
21
|
+
frequency: number;
|
|
22
|
+
};
|
|
23
|
+
private _time;
|
|
24
|
+
constructor(opts?: {
|
|
25
|
+
direction?: [number, number, number];
|
|
26
|
+
strength?: number;
|
|
27
|
+
turbulence?: number;
|
|
28
|
+
frequency?: number;
|
|
29
|
+
});
|
|
30
|
+
/**
|
|
31
|
+
* Get wind acceleration at position (px, py, pz) and current time.
|
|
32
|
+
* Returns [ax, ay, az].
|
|
33
|
+
*/
|
|
34
|
+
getAcceleration(px: number, py: number, pz: number, time: number): [number, number, number];
|
|
35
|
+
/** Advance internal time by dt (called by ClothSimulator). */
|
|
36
|
+
advance(dt: number): void;
|
|
37
|
+
get time(): number;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=WindForce.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WindForce.d.ts","sourceRoot":"","sources":["../../src/forces/WindForce.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,qBAAa,SAAS;IACpB,UAAU,EAAE;QACV,kCAAkC;QAClC,IAAI,EAAE,MAAM,CAAA;QACZ,kCAAkC;QAClC,IAAI,EAAE,MAAM,CAAA;QACZ,kCAAkC;QAClC,IAAI,EAAE,MAAM,CAAA;QACZ,+CAA+C;QAC/C,QAAQ,EAAE,MAAM,CAAA;QAChB,mDAAmD;QACnD,UAAU,EAAE,MAAM,CAAA;QAClB,mEAAmE;QACnE,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;IAED,OAAO,CAAC,KAAK,CAAI;gBAEL,IAAI,GAAE;QAChB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACpC,QAAQ,CAAC,EAAG,MAAM,CAAA;QAClB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,SAAS,CAAC,EAAE,MAAM,CAAA;KACd;IAUN;;;OAGG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IAc3F,8DAA8D;IAC9D,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIzB,IAAI,IAAI,IAAI,MAAM,CAAsB;CACzC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { noise3 } from '../utils/noise.js';
|
|
2
|
+
/**
|
|
3
|
+
* WindForce — directional wind with turbulence.
|
|
4
|
+
* Blender: Force Field > Wind.
|
|
5
|
+
*
|
|
6
|
+
* Returns a per-step acceleration contribution for each cloth particle.
|
|
7
|
+
* The turbulence adds spatial noise so the cloth billows naturally.
|
|
8
|
+
*/
|
|
9
|
+
export class WindForce {
|
|
10
|
+
constructor(opts = {}) {
|
|
11
|
+
this._time = 0;
|
|
12
|
+
const d = opts.direction ?? [1, 0, 0];
|
|
13
|
+
this.parameters = {
|
|
14
|
+
dirX: d[0], dirY: d[1], dirZ: d[2],
|
|
15
|
+
strength: opts.strength ?? 5,
|
|
16
|
+
turbulence: opts.turbulence ?? 0.3,
|
|
17
|
+
frequency: opts.frequency ?? 1.0,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get wind acceleration at position (px, py, pz) and current time.
|
|
22
|
+
* Returns [ax, ay, az].
|
|
23
|
+
*/
|
|
24
|
+
getAcceleration(px, py, pz, time) {
|
|
25
|
+
const { dirX, dirY, dirZ, strength, turbulence, frequency } = this.parameters;
|
|
26
|
+
// Normalize direction
|
|
27
|
+
const len = Math.sqrt(dirX * dirX + dirY * dirY + dirZ * dirZ) || 1;
|
|
28
|
+
const nx = dirX / len, ny = dirY / len, nz = dirZ / len;
|
|
29
|
+
// Simple value-noise turbulence: hash position + time
|
|
30
|
+
const t = turbulence * noise3(px * 0.3 + time * frequency, py * 0.3, pz * 0.3);
|
|
31
|
+
const s = strength * (1 + t);
|
|
32
|
+
return [nx * s, ny * s, nz * s];
|
|
33
|
+
}
|
|
34
|
+
/** Advance internal time by dt (called by ClothSimulator). */
|
|
35
|
+
advance(dt) {
|
|
36
|
+
this._time += dt;
|
|
37
|
+
}
|
|
38
|
+
get time() { return this._time; }
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=WindForce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WindForce.js","sourceRoot":"","sources":["../../src/forces/WindForce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE1C;;;;;;GAMG;AACH,MAAM,OAAO,SAAS;IAkBpB,YAAY,OAKR,EAAE;QAPE,UAAK,GAAG,CAAC,CAAA;QAQf,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACrC,IAAI,CAAC,UAAU,GAAG;YAChB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAClC,QAAQ,EAAI,IAAI,CAAC,QAAQ,IAAM,CAAC;YAChC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,GAAG;YAClC,SAAS,EAAG,IAAI,CAAC,SAAS,IAAK,GAAG;SACnC,CAAA;IACH,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,IAAY;QAC9D,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,UAAU,CAAA;QAE7E,sBAAsB;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7D,MAAM,EAAE,GAAI,IAAI,GAAC,GAAG,EAAE,EAAE,GAAG,IAAI,GAAC,GAAG,EAAE,EAAE,GAAG,IAAI,GAAC,GAAG,CAAA;QAElD,sDAAsD;QACtD,MAAM,CAAC,GAAK,UAAU,GAAG,MAAM,CAAC,EAAE,GAAC,GAAG,GAAG,IAAI,GAAC,SAAS,EAAE,EAAE,GAAC,GAAG,EAAE,EAAE,GAAC,GAAG,CAAC,CAAA;QACxE,MAAM,CAAC,GAAK,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAE9B,OAAO,CAAC,EAAE,GAAC,CAAC,EAAE,EAAE,GAAC,CAAC,EAAE,EAAE,GAAC,CAAC,CAAC,CAAA;IAC3B,CAAC;IAED,8DAA8D;IAC9D,OAAO,CAAC,EAAU;QAChB,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;IAClB,CAAC;IAED,IAAI,IAAI,KAAa,OAAO,IAAI,CAAC,KAAK,CAAA,CAAC,CAAC;CACzC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { BaseCollider } from './collision/BaseCollider.js';
|
|
2
|
+
export { PlaneCollider } from './collision/PlaneCollider.js';
|
|
3
|
+
export { SphereCollider } from './collision/SphereCollider.js';
|
|
4
|
+
export { CapsuleCollider } from './collision/CapsuleCollider.js';
|
|
5
|
+
export { WindForce } from './forces/WindForce.js';
|
|
6
|
+
export { ClothSimulator } from './cloth/ClothSimulator.js';
|
|
7
|
+
export type { ClothSimulatorOptions } from './cloth/ClothSimulator.js';
|
|
8
|
+
export { SoftBodySimulator } from './softbody/SoftBodySimulator.js';
|
|
9
|
+
export type { SoftBodySimulatorOptions } from './softbody/SoftBodySimulator.js';
|
|
10
|
+
export { RigidBodyWorld, RigidBody } from './rigidbody/RigidBodyWorld.js';
|
|
11
|
+
export type { RigidBodyOptions, RigidBodyWorldOptions, RigidBodyShape } from './rigidbody/RigidBodyWorld.js';
|
|
12
|
+
export { FixedConstraint, HingeConstraint, SliderConstraint, SpringConstraint, BallSocketConstraint, ConeTwistConstraint } from './rigidbody/RigidBodyConstraints.js';
|
|
13
|
+
export type { AnyConstraint } from './rigidbody/RigidBodyConstraints.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,YAAY,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,YAAY,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AACzE,YAAY,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC5G,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AACrK,YAAY,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { BaseCollider } from './collision/BaseCollider.js';
|
|
2
|
+
export { PlaneCollider } from './collision/PlaneCollider.js';
|
|
3
|
+
export { SphereCollider } from './collision/SphereCollider.js';
|
|
4
|
+
export { CapsuleCollider } from './collision/CapsuleCollider.js';
|
|
5
|
+
export { WindForce } from './forces/WindForce.js';
|
|
6
|
+
export { ClothSimulator } from './cloth/ClothSimulator.js';
|
|
7
|
+
export { SoftBodySimulator } from './softbody/SoftBodySimulator.js';
|
|
8
|
+
export { RigidBodyWorld, RigidBody } from './rigidbody/RigidBodyWorld.js';
|
|
9
|
+
export { FixedConstraint, HingeConstraint, SliderConstraint, SpringConstraint, BallSocketConstraint, ConeTwistConstraint } from './rigidbody/RigidBodyConstraints.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAEnE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AAEzE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { Vector3 } from 'three';
|
|
2
|
+
import type { RigidBody } from './RigidBodyWorld.js';
|
|
3
|
+
/**
|
|
4
|
+
* FixedConstraint — locks two bodies together at an anchor point.
|
|
5
|
+
* Blender: Rigid Body Constraint > Fixed.
|
|
6
|
+
*
|
|
7
|
+
* Corrects both position and relative velocity to keep bodies at their
|
|
8
|
+
* initial relative transform.
|
|
9
|
+
*/
|
|
10
|
+
export declare class FixedConstraint {
|
|
11
|
+
readonly type = "fixed";
|
|
12
|
+
parameters: {
|
|
13
|
+
stiffness: number;
|
|
14
|
+
damping: number;
|
|
15
|
+
};
|
|
16
|
+
readonly bodyA: RigidBody;
|
|
17
|
+
readonly bodyB: RigidBody;
|
|
18
|
+
private _restOffset;
|
|
19
|
+
enabled: boolean;
|
|
20
|
+
constructor(a: RigidBody, b: RigidBody, opts?: {
|
|
21
|
+
stiffness?: number;
|
|
22
|
+
damping?: number;
|
|
23
|
+
});
|
|
24
|
+
solve(): void;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* HingeConstraint — allows rotation around one axis only.
|
|
28
|
+
* Blender: Rigid Body Constraint > Hinge.
|
|
29
|
+
*
|
|
30
|
+
* Constrains the bodies to a shared pivot; lateral position is locked,
|
|
31
|
+
* leaving only rotation about the hinge axis free.
|
|
32
|
+
*/
|
|
33
|
+
export declare class HingeConstraint {
|
|
34
|
+
readonly type = "hinge";
|
|
35
|
+
parameters: {
|
|
36
|
+
stiffness: number;
|
|
37
|
+
damping: number;
|
|
38
|
+
useLimits: boolean;
|
|
39
|
+
limitMin: number;
|
|
40
|
+
limitMax: number;
|
|
41
|
+
};
|
|
42
|
+
readonly bodyA: RigidBody;
|
|
43
|
+
readonly bodyB: RigidBody;
|
|
44
|
+
private _pivot;
|
|
45
|
+
enabled: boolean;
|
|
46
|
+
constructor(a: RigidBody, b: RigidBody, pivot: [number, number, number], opts?: {
|
|
47
|
+
stiffness?: number;
|
|
48
|
+
damping?: number;
|
|
49
|
+
useLimits?: boolean;
|
|
50
|
+
limitMin?: number;
|
|
51
|
+
limitMax?: number;
|
|
52
|
+
});
|
|
53
|
+
/** World-space pivot point. */
|
|
54
|
+
get pivot(): Vector3;
|
|
55
|
+
set pivot(v: Vector3);
|
|
56
|
+
solve(): void;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* SliderConstraint — allows translation along one axis only.
|
|
60
|
+
* Blender: Rigid Body Constraint > Slider.
|
|
61
|
+
*
|
|
62
|
+
* Bodies can slide toward/away from each other along the axis,
|
|
63
|
+
* but are constrained laterally. Optional limits clamp the travel range.
|
|
64
|
+
*/
|
|
65
|
+
export declare class SliderConstraint {
|
|
66
|
+
readonly type = "slider";
|
|
67
|
+
parameters: {
|
|
68
|
+
stiffness: number;
|
|
69
|
+
damping: number;
|
|
70
|
+
useLimits: boolean;
|
|
71
|
+
limitMin: number;
|
|
72
|
+
limitMax: number;
|
|
73
|
+
};
|
|
74
|
+
readonly bodyA: RigidBody;
|
|
75
|
+
readonly bodyB: RigidBody;
|
|
76
|
+
private _axis;
|
|
77
|
+
enabled: boolean;
|
|
78
|
+
constructor(a: RigidBody, b: RigidBody, axis: [number, number, number], opts?: {
|
|
79
|
+
stiffness?: number;
|
|
80
|
+
damping?: number;
|
|
81
|
+
useLimits?: boolean;
|
|
82
|
+
limitMin?: number;
|
|
83
|
+
limitMax?: number;
|
|
84
|
+
});
|
|
85
|
+
/** Slider axis (world-space unit vector). */
|
|
86
|
+
get axis(): Vector3;
|
|
87
|
+
solve(): void;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* SpringConstraint — elastic spring between two bodies.
|
|
91
|
+
* Blender: Rigid Body Constraint > Generic Spring.
|
|
92
|
+
*/
|
|
93
|
+
export declare class SpringConstraint {
|
|
94
|
+
readonly type = "spring";
|
|
95
|
+
parameters: {
|
|
96
|
+
restLength: number;
|
|
97
|
+
stiffness: number;
|
|
98
|
+
damping: number;
|
|
99
|
+
};
|
|
100
|
+
readonly bodyA: RigidBody;
|
|
101
|
+
readonly bodyB: RigidBody;
|
|
102
|
+
enabled: boolean;
|
|
103
|
+
constructor(a: RigidBody, b: RigidBody, opts?: {
|
|
104
|
+
restLength?: number;
|
|
105
|
+
stiffness?: number;
|
|
106
|
+
damping?: number;
|
|
107
|
+
});
|
|
108
|
+
solve(): void;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* BallSocketConstraint — locks two bodies at a shared pivot while allowing
|
|
112
|
+
* free rotation in all directions.
|
|
113
|
+
* Blender: Rigid Body Constraint > Ball.
|
|
114
|
+
*
|
|
115
|
+
* Only translational DOF is removed; all rotational DOF remain free.
|
|
116
|
+
* Effectively a positional-only HingeConstraint with no angular restrictions.
|
|
117
|
+
*/
|
|
118
|
+
export declare class BallSocketConstraint {
|
|
119
|
+
readonly type = "ballsocket";
|
|
120
|
+
parameters: {
|
|
121
|
+
stiffness: number;
|
|
122
|
+
damping: number;
|
|
123
|
+
};
|
|
124
|
+
readonly bodyA: RigidBody;
|
|
125
|
+
readonly bodyB: RigidBody;
|
|
126
|
+
private _pivot;
|
|
127
|
+
/** Local-space anchor offset from body A centre to pivot (captured at construction). */
|
|
128
|
+
private _anchorA;
|
|
129
|
+
/** Local-space anchor offset from body B centre to pivot (captured at construction). */
|
|
130
|
+
private _anchorB;
|
|
131
|
+
enabled: boolean;
|
|
132
|
+
constructor(a: RigidBody, b: RigidBody, pivot: [number, number, number], opts?: {
|
|
133
|
+
stiffness?: number;
|
|
134
|
+
damping?: number;
|
|
135
|
+
});
|
|
136
|
+
/** World-space pivot point. */
|
|
137
|
+
get pivot(): Vector3;
|
|
138
|
+
solve(): void;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* ConeTwistConstraint — ball-and-socket joint that also limits swing angle
|
|
142
|
+
* (a cone) and twist angle around the primary axis.
|
|
143
|
+
* Blender: Rigid Body Constraint > Cone Twist.
|
|
144
|
+
*
|
|
145
|
+
* Position constraint: same as BallSocketConstraint.
|
|
146
|
+
* Swing constraint: body B's primary axis must stay within `swingLimit` of
|
|
147
|
+
* the constraint axis.
|
|
148
|
+
* Twist constraint: body B's rotation around the constraint axis is clamped
|
|
149
|
+
* to ±`twistLimit`.
|
|
150
|
+
*/
|
|
151
|
+
export declare class ConeTwistConstraint {
|
|
152
|
+
readonly type = "conetwist";
|
|
153
|
+
parameters: {
|
|
154
|
+
stiffness: number;
|
|
155
|
+
damping: number;
|
|
156
|
+
swingLimit: number;
|
|
157
|
+
twistLimit: number;
|
|
158
|
+
};
|
|
159
|
+
readonly bodyA: RigidBody;
|
|
160
|
+
readonly bodyB: RigidBody;
|
|
161
|
+
private _pivot;
|
|
162
|
+
private _axis;
|
|
163
|
+
private _anchorA;
|
|
164
|
+
private _anchorB;
|
|
165
|
+
enabled: boolean;
|
|
166
|
+
constructor(a: RigidBody, b: RigidBody, pivot: [number, number, number], axis: [number, number, number], opts?: {
|
|
167
|
+
stiffness?: number;
|
|
168
|
+
damping?: number;
|
|
169
|
+
swingLimit?: number;
|
|
170
|
+
twistLimit?: number;
|
|
171
|
+
});
|
|
172
|
+
/** World-space pivot point. */
|
|
173
|
+
get pivot(): Vector3;
|
|
174
|
+
/** World-space constraint axis (unit vector). */
|
|
175
|
+
get axis(): Vector3;
|
|
176
|
+
solve(): void;
|
|
177
|
+
}
|
|
178
|
+
export type AnyConstraint = FixedConstraint | HingeConstraint | SliderConstraint | SpringConstraint | BallSocketConstraint | ConeTwistConstraint;
|
|
179
|
+
//# sourceMappingURL=RigidBodyConstraints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RigidBodyConstraints.d.ts","sourceRoot":"","sources":["../../src/rigidbody/RigidBodyConstraints.ts"],"names":[],"mappings":"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"}
|