@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.
Files changed (45) hide show
  1. package/dist/cloth/ClothSimulator.d.ts +127 -0
  2. package/dist/cloth/ClothSimulator.d.ts.map +1 -0
  3. package/dist/cloth/ClothSimulator.js +355 -0
  4. package/dist/cloth/ClothSimulator.js.map +1 -0
  5. package/dist/collision/BaseCollider.d.ts +19 -0
  6. package/dist/collision/BaseCollider.d.ts.map +1 -0
  7. package/dist/collision/BaseCollider.js +14 -0
  8. package/dist/collision/BaseCollider.js.map +1 -0
  9. package/dist/collision/CapsuleCollider.d.ts +29 -0
  10. package/dist/collision/CapsuleCollider.d.ts.map +1 -0
  11. package/dist/collision/CapsuleCollider.js +41 -0
  12. package/dist/collision/CapsuleCollider.js.map +1 -0
  13. package/dist/collision/PlaneCollider.d.ts +30 -0
  14. package/dist/collision/PlaneCollider.d.ts.map +1 -0
  15. package/dist/collision/PlaneCollider.js +38 -0
  16. package/dist/collision/PlaneCollider.js.map +1 -0
  17. package/dist/collision/SphereCollider.d.ts +25 -0
  18. package/dist/collision/SphereCollider.d.ts.map +1 -0
  19. package/dist/collision/SphereCollider.js +36 -0
  20. package/dist/collision/SphereCollider.js.map +1 -0
  21. package/dist/forces/WindForce.d.ts +39 -0
  22. package/dist/forces/WindForce.d.ts.map +1 -0
  23. package/dist/forces/WindForce.js +40 -0
  24. package/dist/forces/WindForce.js.map +1 -0
  25. package/dist/index.d.ts +14 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +10 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/rigidbody/RigidBodyConstraints.d.ts +179 -0
  30. package/dist/rigidbody/RigidBodyConstraints.d.ts.map +1 -0
  31. package/dist/rigidbody/RigidBodyConstraints.js +480 -0
  32. package/dist/rigidbody/RigidBodyConstraints.js.map +1 -0
  33. package/dist/rigidbody/RigidBodyWorld.d.ts +136 -0
  34. package/dist/rigidbody/RigidBodyWorld.d.ts.map +1 -0
  35. package/dist/rigidbody/RigidBodyWorld.js +319 -0
  36. package/dist/rigidbody/RigidBodyWorld.js.map +1 -0
  37. package/dist/softbody/SoftBodySimulator.d.ts +103 -0
  38. package/dist/softbody/SoftBodySimulator.d.ts.map +1 -0
  39. package/dist/softbody/SoftBodySimulator.js +311 -0
  40. package/dist/softbody/SoftBodySimulator.js.map +1 -0
  41. package/dist/utils/noise.d.ts +3 -0
  42. package/dist/utils/noise.d.ts.map +1 -0
  43. package/dist/utils/noise.js +20 -0
  44. package/dist/utils/noise.js.map +1 -0
  45. package/package.json +45 -0
@@ -0,0 +1,480 @@
1
+ import { Vector3 } from 'three';
2
+ // ── Constraint types ─────────────────────────────────────────────────────────
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 class FixedConstraint {
11
+ constructor(a, b, opts = {}) {
12
+ this.type = 'fixed';
13
+ this.enabled = true;
14
+ this.bodyA = a;
15
+ this.bodyB = b;
16
+ this.parameters = {
17
+ stiffness: opts.stiffness ?? 0.8,
18
+ damping: opts.damping ?? 0.1,
19
+ };
20
+ // Capture initial relative offset
21
+ this._restOffset = new Vector3().subVectors(b.position, a.position);
22
+ }
23
+ solve() {
24
+ if (!this.enabled)
25
+ return;
26
+ const { stiffness, damping } = this.parameters;
27
+ const a = this.bodyA, b = this.bodyB;
28
+ // Current offset
29
+ const dx = b.position.x - a.position.x - this._restOffset.x;
30
+ const dy = b.position.y - a.position.y - this._restOffset.y;
31
+ const dz = b.position.z - a.position.z - this._restOffset.z;
32
+ const mA = a.isStatic ? 0 : 1 / a.parameters.mass;
33
+ const mB = b.isStatic ? 0 : 1 / b.parameters.mass;
34
+ const total = mA + mB;
35
+ if (total < 1e-12)
36
+ return;
37
+ const wA = mA / total, wB = mB / total;
38
+ const k = stiffness;
39
+ if (!a.isStatic) {
40
+ a.position.x += dx * wA * k;
41
+ a.position.y += dy * wA * k;
42
+ a.position.z += dz * wA * k;
43
+ }
44
+ if (!b.isStatic) {
45
+ b.position.x -= dx * wB * k;
46
+ b.position.y -= dy * wB * k;
47
+ b.position.z -= dz * wB * k;
48
+ }
49
+ // Velocity damping toward shared average
50
+ const relVx = b.velocity.x - a.velocity.x;
51
+ const relVy = b.velocity.y - a.velocity.y;
52
+ const relVz = b.velocity.z - a.velocity.z;
53
+ const d = damping;
54
+ if (!a.isStatic) {
55
+ a.velocity.x += relVx * wA * d;
56
+ a.velocity.y += relVy * wA * d;
57
+ a.velocity.z += relVz * wA * d;
58
+ }
59
+ if (!b.isStatic) {
60
+ b.velocity.x -= relVx * wB * d;
61
+ b.velocity.y -= relVy * wB * d;
62
+ b.velocity.z -= relVz * wB * d;
63
+ }
64
+ }
65
+ }
66
+ /**
67
+ * HingeConstraint — allows rotation around one axis only.
68
+ * Blender: Rigid Body Constraint > Hinge.
69
+ *
70
+ * Constrains the bodies to a shared pivot; lateral position is locked,
71
+ * leaving only rotation about the hinge axis free.
72
+ */
73
+ export class HingeConstraint {
74
+ constructor(a, b, pivot, opts = {}) {
75
+ this.type = 'hinge';
76
+ this.enabled = true;
77
+ this.bodyA = a;
78
+ this.bodyB = b;
79
+ this._pivot = new Vector3(...pivot);
80
+ this.parameters = {
81
+ stiffness: opts.stiffness ?? 0.8,
82
+ damping: opts.damping ?? 0.1,
83
+ useLimits: opts.useLimits ?? false,
84
+ limitMin: opts.limitMin ?? -Math.PI,
85
+ limitMax: opts.limitMax ?? Math.PI,
86
+ };
87
+ }
88
+ /** World-space pivot point. */
89
+ get pivot() { return this._pivot; }
90
+ set pivot(v) { this._pivot.copy(v); }
91
+ solve() {
92
+ if (!this.enabled)
93
+ return;
94
+ const { stiffness, damping } = this.parameters;
95
+ const a = this.bodyA, b = this.bodyB;
96
+ // Pull both bodies toward the pivot
97
+ const mA = a.isStatic ? 0 : 1 / a.parameters.mass;
98
+ const mB = b.isStatic ? 0 : 1 / b.parameters.mass;
99
+ const total = mA + mB;
100
+ if (total < 1e-12)
101
+ return;
102
+ const wA = mA / total, wB = mB / total;
103
+ if (!a.isStatic) {
104
+ const eax = this._pivot.x - a.position.x;
105
+ const eay = this._pivot.y - a.position.y;
106
+ const eaz = this._pivot.z - a.position.z;
107
+ a.position.x += eax * wA * stiffness;
108
+ a.position.y += eay * wA * stiffness;
109
+ a.position.z += eaz * wA * stiffness;
110
+ }
111
+ if (!b.isStatic) {
112
+ const ebx = this._pivot.x - b.position.x;
113
+ const eby = this._pivot.y - b.position.y;
114
+ const ebz = this._pivot.z - b.position.z;
115
+ b.position.x += ebx * wB * stiffness;
116
+ b.position.y += eby * wB * stiffness;
117
+ b.position.z += ebz * wB * stiffness;
118
+ }
119
+ // Relative tangential velocity damping (allow rotation, damp lateral slip)
120
+ const relVx = b.velocity.x - a.velocity.x;
121
+ const relVy = b.velocity.y - a.velocity.y;
122
+ const relVz = b.velocity.z - a.velocity.z;
123
+ const d = damping;
124
+ if (!a.isStatic) {
125
+ a.velocity.x += relVx * wA * d;
126
+ a.velocity.y += relVy * wA * d;
127
+ a.velocity.z += relVz * wA * d;
128
+ }
129
+ if (!b.isStatic) {
130
+ b.velocity.x -= relVx * wB * d;
131
+ b.velocity.y -= relVy * wB * d;
132
+ b.velocity.z -= relVz * wB * d;
133
+ }
134
+ }
135
+ }
136
+ /**
137
+ * SliderConstraint — allows translation along one axis only.
138
+ * Blender: Rigid Body Constraint > Slider.
139
+ *
140
+ * Bodies can slide toward/away from each other along the axis,
141
+ * but are constrained laterally. Optional limits clamp the travel range.
142
+ */
143
+ export class SliderConstraint {
144
+ constructor(a, b, axis, opts = {}) {
145
+ this.type = 'slider';
146
+ this.enabled = true;
147
+ this.bodyA = a;
148
+ this.bodyB = b;
149
+ this._axis = new Vector3(...axis).normalize();
150
+ this.parameters = {
151
+ stiffness: opts.stiffness ?? 0.8,
152
+ damping: opts.damping ?? 0.1,
153
+ useLimits: opts.useLimits ?? false,
154
+ limitMin: opts.limitMin ?? -Infinity,
155
+ limitMax: opts.limitMax ?? Infinity,
156
+ };
157
+ }
158
+ /** Slider axis (world-space unit vector). */
159
+ get axis() { return this._axis; }
160
+ solve() {
161
+ if (!this.enabled)
162
+ return;
163
+ const { stiffness, damping } = this.parameters;
164
+ const a = this.bodyA, b = this.bodyB;
165
+ const mA = a.isStatic ? 0 : 1 / a.parameters.mass;
166
+ const mB = b.isStatic ? 0 : 1 / b.parameters.mass;
167
+ const total = mA + mB;
168
+ if (total < 1e-12)
169
+ return;
170
+ const wA = mA / total, wB = mB / total;
171
+ const dx = b.position.x - a.position.x;
172
+ const dy = b.position.y - a.position.y;
173
+ const dz = b.position.z - a.position.z;
174
+ // Project offset onto axis (this is the allowed DOF)
175
+ const ax = this._axis.x, ay = this._axis.y, az = this._axis.z;
176
+ const along = dx * ax + dy * ay + dz * az;
177
+ // Clamp along-axis travel
178
+ let clampedAlong = along;
179
+ if (this.parameters.useLimits) {
180
+ clampedAlong = Math.max(this.parameters.limitMin, Math.min(this.parameters.limitMax, along));
181
+ }
182
+ // Lateral error = full offset - allowed axial part
183
+ const lateralX = dx - along * ax;
184
+ const lateralY = dy - along * ay;
185
+ const lateralZ = dz - along * az;
186
+ // Axial limit correction
187
+ const axialErr = along - clampedAlong;
188
+ const corrX = lateralX * stiffness + axialErr * ax * stiffness;
189
+ const corrY = lateralY * stiffness + axialErr * ay * stiffness;
190
+ const corrZ = lateralZ * stiffness + axialErr * az * stiffness;
191
+ if (!a.isStatic) {
192
+ a.position.x += corrX * wA;
193
+ a.position.y += corrY * wA;
194
+ a.position.z += corrZ * wA;
195
+ }
196
+ if (!b.isStatic) {
197
+ b.position.x -= corrX * wB;
198
+ b.position.y -= corrY * wB;
199
+ b.position.z -= corrZ * wB;
200
+ }
201
+ // Lateral velocity damping
202
+ const relVx = b.velocity.x - a.velocity.x;
203
+ const relVy = b.velocity.y - a.velocity.y;
204
+ const relVz = b.velocity.z - a.velocity.z;
205
+ const latVx = relVx - (relVx * ax + relVy * ay + relVz * az) * ax;
206
+ const latVy = relVy - (relVx * ax + relVy * ay + relVz * az) * ay;
207
+ const latVz = relVz - (relVx * ax + relVy * ay + relVz * az) * az;
208
+ const d = damping;
209
+ if (!a.isStatic) {
210
+ a.velocity.x += latVx * wA * d;
211
+ a.velocity.y += latVy * wA * d;
212
+ a.velocity.z += latVz * wA * d;
213
+ }
214
+ if (!b.isStatic) {
215
+ b.velocity.x -= latVx * wB * d;
216
+ b.velocity.y -= latVy * wB * d;
217
+ b.velocity.z -= latVz * wB * d;
218
+ }
219
+ }
220
+ }
221
+ /**
222
+ * SpringConstraint — elastic spring between two bodies.
223
+ * Blender: Rigid Body Constraint > Generic Spring.
224
+ */
225
+ export class SpringConstraint {
226
+ constructor(a, b, opts = {}) {
227
+ this.type = 'spring';
228
+ this.enabled = true;
229
+ this.bodyA = a;
230
+ this.bodyB = b;
231
+ const defaultRest = a.position.distanceTo(b.position);
232
+ this.parameters = {
233
+ restLength: opts.restLength ?? defaultRest,
234
+ stiffness: opts.stiffness ?? 10,
235
+ damping: opts.damping ?? 0.5,
236
+ };
237
+ }
238
+ solve() {
239
+ if (!this.enabled)
240
+ return;
241
+ const { restLength, stiffness, damping } = this.parameters;
242
+ const a = this.bodyA, b = this.bodyB;
243
+ const dx = b.position.x - a.position.x;
244
+ const dy = b.position.y - a.position.y;
245
+ const dz = b.position.z - a.position.z;
246
+ const dist = Math.sqrt(dx * dx + dy * dy + dz * dz);
247
+ if (dist < 1e-12)
248
+ return;
249
+ const nx = dx / dist, ny = dy / dist, nz = dz / dist;
250
+ const stretch = dist - restLength;
251
+ const mA = a.isStatic ? 0 : 1 / a.parameters.mass;
252
+ const mB = b.isStatic ? 0 : 1 / b.parameters.mass;
253
+ const total = mA + mB;
254
+ if (total < 1e-12)
255
+ return;
256
+ const relV = (b.velocity.x - a.velocity.x) * nx +
257
+ (b.velocity.y - a.velocity.y) * ny +
258
+ (b.velocity.z - a.velocity.z) * nz;
259
+ const force = stiffness * stretch + damping * relV;
260
+ const wA = mA / total, wB = mB / total;
261
+ if (!a.isStatic) {
262
+ a.velocity.x += nx * force * wA;
263
+ a.velocity.y += ny * force * wA;
264
+ a.velocity.z += nz * force * wA;
265
+ }
266
+ if (!b.isStatic) {
267
+ b.velocity.x -= nx * force * wB;
268
+ b.velocity.y -= ny * force * wB;
269
+ b.velocity.z -= nz * force * wB;
270
+ }
271
+ }
272
+ }
273
+ /**
274
+ * BallSocketConstraint — locks two bodies at a shared pivot while allowing
275
+ * free rotation in all directions.
276
+ * Blender: Rigid Body Constraint > Ball.
277
+ *
278
+ * Only translational DOF is removed; all rotational DOF remain free.
279
+ * Effectively a positional-only HingeConstraint with no angular restrictions.
280
+ */
281
+ export class BallSocketConstraint {
282
+ constructor(a, b, pivot, opts = {}) {
283
+ this.type = 'ballsocket';
284
+ this.enabled = true;
285
+ this.bodyA = a;
286
+ this.bodyB = b;
287
+ this._pivot = new Vector3(...pivot);
288
+ this.parameters = {
289
+ stiffness: opts.stiffness ?? 0.8,
290
+ damping: opts.damping ?? 0.1,
291
+ };
292
+ // Record body-relative anchor offsets at rest pose
293
+ this._anchorA = new Vector3().subVectors(this._pivot, a.position);
294
+ this._anchorB = new Vector3().subVectors(this._pivot, b.position);
295
+ }
296
+ /** World-space pivot point. */
297
+ get pivot() { return this._pivot; }
298
+ solve() {
299
+ if (!this.enabled)
300
+ return;
301
+ const { stiffness, damping } = this.parameters;
302
+ const a = this.bodyA, b = this.bodyB;
303
+ const mA = a.isStatic ? 0 : 1 / a.parameters.mass;
304
+ const mB = b.isStatic ? 0 : 1 / b.parameters.mass;
305
+ const total = mA + mB;
306
+ if (total < 1e-12)
307
+ return;
308
+ const wA = mA / total, wB = mB / total;
309
+ // World-space anchor positions (apply orientation to local anchor)
310
+ const worldAnchorA = this._anchorA.clone().applyQuaternion(a.orientation).add(a.position);
311
+ const worldAnchorB = this._anchorB.clone().applyQuaternion(b.orientation).add(b.position);
312
+ // Error = how far the two anchor points are apart
313
+ const errX = worldAnchorB.x - worldAnchorA.x;
314
+ const errY = worldAnchorB.y - worldAnchorA.y;
315
+ const errZ = worldAnchorB.z - worldAnchorA.z;
316
+ if (!a.isStatic) {
317
+ a.position.x += errX * wA * stiffness;
318
+ a.position.y += errY * wA * stiffness;
319
+ a.position.z += errZ * wA * stiffness;
320
+ }
321
+ if (!b.isStatic) {
322
+ b.position.x -= errX * wB * stiffness;
323
+ b.position.y -= errY * wB * stiffness;
324
+ b.position.z -= errZ * wB * stiffness;
325
+ }
326
+ // Damp relative translational velocity
327
+ const relVx = b.velocity.x - a.velocity.x;
328
+ const relVy = b.velocity.y - a.velocity.y;
329
+ const relVz = b.velocity.z - a.velocity.z;
330
+ const d = damping;
331
+ if (!a.isStatic) {
332
+ a.velocity.x += relVx * wA * d;
333
+ a.velocity.y += relVy * wA * d;
334
+ a.velocity.z += relVz * wA * d;
335
+ }
336
+ if (!b.isStatic) {
337
+ b.velocity.x -= relVx * wB * d;
338
+ b.velocity.y -= relVy * wB * d;
339
+ b.velocity.z -= relVz * wB * d;
340
+ }
341
+ }
342
+ }
343
+ /**
344
+ * ConeTwistConstraint — ball-and-socket joint that also limits swing angle
345
+ * (a cone) and twist angle around the primary axis.
346
+ * Blender: Rigid Body Constraint > Cone Twist.
347
+ *
348
+ * Position constraint: same as BallSocketConstraint.
349
+ * Swing constraint: body B's primary axis must stay within `swingLimit` of
350
+ * the constraint axis.
351
+ * Twist constraint: body B's rotation around the constraint axis is clamped
352
+ * to ±`twistLimit`.
353
+ */
354
+ export class ConeTwistConstraint {
355
+ constructor(a, b, pivot, axis, opts = {}) {
356
+ this.type = 'conetwist';
357
+ this.enabled = true;
358
+ this.bodyA = a;
359
+ this.bodyB = b;
360
+ this._pivot = new Vector3(...pivot);
361
+ this._axis = new Vector3(...axis).normalize();
362
+ this.parameters = {
363
+ stiffness: opts.stiffness ?? 0.8,
364
+ damping: opts.damping ?? 0.1,
365
+ swingLimit: opts.swingLimit ?? Math.PI / 4,
366
+ twistLimit: opts.twistLimit ?? Math.PI / 6,
367
+ };
368
+ this._anchorA = new Vector3().subVectors(this._pivot, a.position);
369
+ this._anchorB = new Vector3().subVectors(this._pivot, b.position);
370
+ }
371
+ /** World-space pivot point. */
372
+ get pivot() { return this._pivot; }
373
+ /** World-space constraint axis (unit vector). */
374
+ get axis() { return this._axis; }
375
+ solve() {
376
+ if (!this.enabled)
377
+ return;
378
+ const { stiffness, damping, swingLimit, twistLimit } = this.parameters;
379
+ const a = this.bodyA, b = this.bodyB;
380
+ const mA = a.isStatic ? 0 : 1 / a.parameters.mass;
381
+ const mB = b.isStatic ? 0 : 1 / b.parameters.mass;
382
+ const total = mA + mB;
383
+ if (total < 1e-12)
384
+ return;
385
+ const wA = mA / total, wB = mB / total;
386
+ // ── 1. Position constraint (identical to BallSocket) ──────────────────────
387
+ const worldAnchorA = this._anchorA.clone().applyQuaternion(a.orientation).add(a.position);
388
+ const worldAnchorB = this._anchorB.clone().applyQuaternion(b.orientation).add(b.position);
389
+ const errX = worldAnchorB.x - worldAnchorA.x;
390
+ const errY = worldAnchorB.y - worldAnchorA.y;
391
+ const errZ = worldAnchorB.z - worldAnchorA.z;
392
+ if (!a.isStatic) {
393
+ a.position.x += errX * wA * stiffness;
394
+ a.position.y += errY * wA * stiffness;
395
+ a.position.z += errZ * wA * stiffness;
396
+ }
397
+ if (!b.isStatic) {
398
+ b.position.x -= errX * wB * stiffness;
399
+ b.position.y -= errY * wB * stiffness;
400
+ b.position.z -= errZ * wB * stiffness;
401
+ }
402
+ // Damp relative translational velocity
403
+ const relVx = b.velocity.x - a.velocity.x;
404
+ const relVy = b.velocity.y - a.velocity.y;
405
+ const relVz = b.velocity.z - a.velocity.z;
406
+ const d = damping;
407
+ if (!a.isStatic) {
408
+ a.velocity.x += relVx * wA * d;
409
+ a.velocity.y += relVy * wA * d;
410
+ a.velocity.z += relVz * wA * d;
411
+ }
412
+ if (!b.isStatic) {
413
+ b.velocity.x -= relVx * wB * d;
414
+ b.velocity.y -= relVy * wB * d;
415
+ b.velocity.z -= relVz * wB * d;
416
+ }
417
+ if (b.isStatic)
418
+ return;
419
+ // ── 2. Swing constraint (positional) ──────────────────────────────────────
420
+ // The swing angle is the angle between the constraint axis and the
421
+ // direction from A to B. Clamp B's position to stay inside the cone.
422
+ if (swingLimit < Math.PI) {
423
+ const dirX = b.position.x - a.position.x;
424
+ const dirY = b.position.y - a.position.y;
425
+ const dirZ = b.position.z - a.position.z;
426
+ const dist = Math.sqrt(dirX * dirX + dirY * dirY + dirZ * dirZ);
427
+ if (dist > 1e-8) {
428
+ const nx = dirX / dist, ny = dirY / dist, nz = dirZ / dist;
429
+ const ax = this._axis.x, ay = this._axis.y, az = this._axis.z;
430
+ const cosAngle = Math.max(-1, Math.min(1, nx * ax + ny * ay + nz * az));
431
+ const swingAngle = Math.acos(cosAngle);
432
+ if (swingAngle > swingLimit) {
433
+ // Project direction onto the cone boundary
434
+ // Decompose into axial + lateral components
435
+ const axialDot = nx * ax + ny * ay + nz * az;
436
+ const latX = nx - axialDot * ax;
437
+ const latY = ny - axialDot * ay;
438
+ const latZ = nz - axialDot * az;
439
+ const latLen = Math.sqrt(latX * latX + latY * latY + latZ * latZ);
440
+ let clampedX, clampedY, clampedZ;
441
+ if (latLen < 1e-8) {
442
+ // Pointing directly opposite the axis — pick arbitrary lateral
443
+ clampedX = ax;
444
+ clampedY = ay;
445
+ clampedZ = az;
446
+ }
447
+ else {
448
+ // Blend axial and lateral to sit on cone boundary
449
+ const cosL = Math.cos(swingLimit);
450
+ const sinL = Math.sin(swingLimit);
451
+ clampedX = ax * cosL + (latX / latLen) * sinL;
452
+ clampedY = ay * cosL + (latY / latLen) * sinL;
453
+ clampedZ = az * cosL + (latZ / latLen) * sinL;
454
+ }
455
+ const targetX = a.position.x + clampedX * dist;
456
+ const targetY = a.position.y + clampedY * dist;
457
+ const targetZ = a.position.z + clampedZ * dist;
458
+ const posErrX = targetX - b.position.x;
459
+ const posErrY = targetY - b.position.y;
460
+ const posErrZ = targetZ - b.position.z;
461
+ b.position.x += posErrX * stiffness;
462
+ b.position.y += posErrY * stiffness;
463
+ b.position.z += posErrZ * stiffness;
464
+ // Kill velocity component pushing outside the cone
465
+ const velDotErr = b.velocity.x * posErrX + b.velocity.y * posErrY + b.velocity.z * posErrZ;
466
+ if (velDotErr < 0) {
467
+ const errLen2 = posErrX * posErrX + posErrY * posErrY + posErrZ * posErrZ;
468
+ if (errLen2 > 1e-12) {
469
+ const scale = velDotErr / errLen2;
470
+ b.velocity.x -= scale * posErrX;
471
+ b.velocity.y -= scale * posErrY;
472
+ b.velocity.z -= scale * posErrZ;
473
+ }
474
+ }
475
+ }
476
+ }
477
+ }
478
+ }
479
+ }
480
+ //# sourceMappingURL=RigidBodyConstraints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RigidBodyConstraints.js","sourceRoot":"","sources":["../../src/rigidbody/RigidBodyConstraints.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ import { Vector3, Quaternion } from 'three';
2
+ import type { AnyConstraint } from './RigidBodyConstraints.js';
3
+ export type RigidBodyShape = 'sphere' | 'box' | 'capsule';
4
+ export interface RigidBodyOptions {
5
+ /** Collision shape. Default 'sphere'. */
6
+ shape?: RigidBodyShape;
7
+ /** Mass in kg. 0 = static/kinematic. Blender: Physics > Mass. Default 1. */
8
+ mass?: number;
9
+ /** Shape half-extents [hx,hy,hz] for 'box'; radius for 'sphere'/'capsule'. Default 0.5. */
10
+ size?: number | [number, number, number];
11
+ /** Capsule half-height (along Y) for 'capsule' shape. Default 1.0. */
12
+ halfHeight?: number;
13
+ /** Linear velocity damping [0–1]. Blender: Physics > Damping > Translation. Default 0.01. */
14
+ linearDamping?: number;
15
+ /** Angular velocity damping [0–1]. Blender: Physics > Damping > Rotation. Default 0.05. */
16
+ angularDamping?: number;
17
+ /** Bounciness [0–1]. Blender: Physics > Restitution. Default 0.3. */
18
+ restitution?: number;
19
+ /** Initial position [x,y,z]. */
20
+ position?: [number, number, number];
21
+ /** Initial velocity [x,y,z]. */
22
+ velocity?: [number, number, number];
23
+ }
24
+ /**
25
+ * RigidBody — a single rigid-body object managed by RigidBodyWorld.
26
+ *
27
+ * All scalar physics parameters live in `parameters` for GSAP/st-keyframe:
28
+ * gsap.to(body.parameters, { restitution: 1, duration: 0.5 })
29
+ */
30
+ export declare class RigidBody {
31
+ readonly shape: RigidBodyShape;
32
+ /** Scalar parameters — GSAP/st-keyframe compatible. */
33
+ parameters: {
34
+ mass: number;
35
+ linearDamping: number;
36
+ angularDamping: number;
37
+ restitution: number;
38
+ sizeX: number;
39
+ sizeY: number;
40
+ sizeZ: number;
41
+ halfHeight: number;
42
+ };
43
+ position: Vector3;
44
+ velocity: Vector3;
45
+ orientation: Quaternion;
46
+ angularVel: Vector3;
47
+ /** Accumulated force for this step. */
48
+ private _force;
49
+ /** Accumulated torque for this step. */
50
+ private _torque;
51
+ /** Set to true to prevent the body from moving (kinematic/static). */
52
+ isStatic: boolean;
53
+ constructor(opts?: RigidBodyOptions);
54
+ /** Apply a force (N) at the body's centre of mass. */
55
+ applyForce(fx: number, fy: number, fz: number): void;
56
+ /** Apply an instantaneous impulse (kg·m/s). */
57
+ applyImpulse(ix: number, iy: number, iz: number): void;
58
+ /** Apply a torque impulse (kg·m²/s). */
59
+ applyTorqueImpulse(tx: number, ty: number, tz: number): void;
60
+ /** Consume and reset accumulated forces. Returns force vector. */
61
+ _consumeForce(): Vector3;
62
+ _consumeTorque(): Vector3;
63
+ /**
64
+ * Approximate bounding radius (for broad-phase).
65
+ */
66
+ get boundingRadius(): number;
67
+ }
68
+ export interface RigidBodyWorldOptions {
69
+ /** Gravity [x,y,z]. Blender: Scene > Gravity. Default [0,-9.8,0]. */
70
+ gravity?: [number, number, number];
71
+ /** Substeps per frame. Higher = more stable. Default 4. */
72
+ substeps?: number;
73
+ }
74
+ /**
75
+ * RigidBodyWorld — Blender-matched rigid body simulation.
76
+ * Blender: Rigid Body World (Scene Properties).
77
+ *
78
+ * Impulse-based solver with sphere/box/capsule collision shapes.
79
+ * Supports plane floor, body–body overlap resolution, gravity.
80
+ *
81
+ * Usage:
82
+ * ```typescript
83
+ * const world = new RigidBodyWorld({ gravity: [0,-9.8,0] })
84
+ * const ball = world.createBody({ shape: 'sphere', mass: 1, position: [0,5,0] })
85
+ * const floor = world.createBody({ shape: 'box', mass: 0, size: [10,0.1,10] })
86
+ *
87
+ * // In animation loop:
88
+ * world.step(dt)
89
+ * mesh.position.copy(ball.position)
90
+ * mesh.quaternion.copy(ball.orientation)
91
+ * ```
92
+ */
93
+ export declare class RigidBodyWorld {
94
+ /** World gravity vector. GSAP-driveable via `parameters`. */
95
+ parameters: {
96
+ gravityX: number;
97
+ gravityY: number;
98
+ gravityZ: number;
99
+ substeps: number;
100
+ };
101
+ private _bodies;
102
+ private _constraints;
103
+ /** Simulation clock. */
104
+ time: number;
105
+ constructor(opts?: RigidBodyWorldOptions);
106
+ /**
107
+ * Create a new rigid body and add it to the world.
108
+ */
109
+ createBody(opts?: RigidBodyOptions): RigidBody;
110
+ /**
111
+ * Remove a body from the world.
112
+ */
113
+ removeBody(body: RigidBody): void;
114
+ /** All active bodies. */
115
+ get bodies(): readonly RigidBody[];
116
+ /** Add a constraint to the world. */
117
+ addConstraint(c: AnyConstraint): void;
118
+ /** Remove a constraint. */
119
+ removeConstraint(c: AnyConstraint): void;
120
+ /** All active constraints. */
121
+ get constraints(): readonly AnyConstraint[];
122
+ /**
123
+ * Advance the simulation by dt seconds.
124
+ * Call once per animation frame (dt ≈ 1/60).
125
+ */
126
+ step(dt: number): void;
127
+ private _substep;
128
+ private _resolveCollisions;
129
+ private _resolveBodyPair;
130
+ /** Returns penetration depth (> 0 means penetrating) for shape pair. */
131
+ private _penetrationDepth;
132
+ private _sphereBoxPen;
133
+ private _boxBoxPen;
134
+ private _capsuleSpherePen;
135
+ }
136
+ //# sourceMappingURL=RigidBodyWorld.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RigidBodyWorld.d.ts","sourceRoot":"","sources":["../../src/rigidbody/RigidBodyWorld.ts"],"names":[],"mappings":"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"}