@codexo/exojs-physics 0.15.2 → 0.16.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/README.md +51 -23
- package/dist/esm/Aabb.d.ts +6 -10
- package/dist/esm/Aabb.d.ts.map +1 -0
- package/dist/esm/Aabb.js +9 -5
- package/dist/esm/Aabb.js.map +1 -1
- package/dist/esm/Collider.d.ts +62 -10
- package/dist/esm/Collider.d.ts.map +1 -0
- package/dist/esm/Collider.js +263 -157
- package/dist/esm/Collider.js.map +1 -1
- package/dist/esm/ContactGraph.d.ts +51 -5
- package/dist/esm/ContactGraph.d.ts.map +1 -0
- package/dist/esm/ContactGraph.js +282 -223
- package/dist/esm/ContactGraph.js.map +1 -1
- package/dist/esm/ContactModifier.d.ts +85 -0
- package/dist/esm/ContactModifier.d.ts.map +1 -0
- package/dist/esm/ContactModifier.js +49 -0
- package/dist/esm/ContactModifier.js.map +1 -0
- package/dist/esm/PhysicsBody.d.ts +56 -22
- package/dist/esm/PhysicsBody.d.ts.map +1 -0
- package/dist/esm/PhysicsBody.js +461 -443
- package/dist/esm/PhysicsBody.js.map +1 -1
- package/dist/esm/PhysicsWorld.d.ts +276 -43
- package/dist/esm/PhysicsWorld.d.ts.map +1 -0
- package/dist/esm/PhysicsWorld.js +890 -626
- package/dist/esm/PhysicsWorld.js.map +1 -1
- package/dist/esm/TimeStepper.d.ts +3 -2
- package/dist/esm/TimeStepper.d.ts.map +1 -0
- package/dist/esm/TimeStepper.js +56 -67
- package/dist/esm/TimeStepper.js.map +1 -1
- package/dist/esm/backend/NativePhysicsBackend.d.ts +8 -4
- package/dist/esm/backend/NativePhysicsBackend.d.ts.map +1 -0
- package/dist/esm/backend/NativePhysicsBackend.js +48 -41
- package/dist/esm/backend/NativePhysicsBackend.js.map +1 -1
- package/dist/esm/backend/PhysicsBackend.d.ts +9 -2
- package/dist/esm/backend/PhysicsBackend.d.ts.map +1 -0
- package/dist/esm/binding/BindingRegistry.d.ts +25 -4
- package/dist/esm/binding/BindingRegistry.d.ts.map +1 -0
- package/dist/esm/binding/BindingRegistry.js +70 -36
- package/dist/esm/binding/BindingRegistry.js.map +1 -1
- package/dist/esm/binding/PhysicsBinding.d.ts +22 -5
- package/dist/esm/binding/PhysicsBinding.d.ts.map +1 -0
- package/dist/esm/binding/PhysicsBinding.js +46 -21
- package/dist/esm/binding/PhysicsBinding.js.map +1 -1
- package/dist/esm/broadphase/AabbTreeBroadPhase.d.ts +68 -0
- package/dist/esm/broadphase/AabbTreeBroadPhase.d.ts.map +1 -0
- package/dist/esm/broadphase/AabbTreeBroadPhase.js +149 -0
- package/dist/esm/broadphase/AabbTreeBroadPhase.js.map +1 -0
- package/dist/esm/broadphase/BroadPhase.d.ts +7 -4
- package/dist/esm/broadphase/BroadPhase.d.ts.map +1 -0
- package/dist/esm/broadphase/index.d.ts +2 -1
- package/dist/esm/broadphase/index.d.ts.map +1 -0
- package/dist/esm/collision/CollisionProxy.d.ts +3 -2
- package/dist/esm/collision/CollisionProxy.d.ts.map +1 -0
- package/dist/esm/collision/Manifold.d.ts +5 -4
- package/dist/esm/collision/Manifold.d.ts.map +1 -0
- package/dist/esm/collision/Manifold.js +34 -25
- package/dist/esm/collision/Manifold.js.map +1 -1
- package/dist/esm/collision/chainAdjacency.d.ts +29 -0
- package/dist/esm/collision/chainAdjacency.d.ts.map +1 -0
- package/dist/esm/collision/chainAdjacency.js +44 -0
- package/dist/esm/collision/chainAdjacency.js.map +1 -0
- package/dist/esm/collision/dispatch.d.ts +35 -0
- package/dist/esm/collision/dispatch.d.ts.map +1 -0
- package/dist/esm/collision/dispatch.js +58 -0
- package/dist/esm/collision/dispatch.js.map +1 -0
- package/dist/esm/collision/index.d.ts +2 -0
- package/dist/esm/collision/index.d.ts.map +1 -0
- package/dist/esm/collision/narrowphase.d.ts +5 -2
- package/dist/esm/collision/narrowphase.d.ts.map +1 -0
- package/dist/esm/collision/narrowphase.js +524 -399
- package/dist/esm/collision/narrowphase.js.map +1 -1
- package/dist/esm/collision/segments.d.ts +19 -0
- package/dist/esm/collision/segments.d.ts.map +1 -0
- package/dist/esm/collision/segments.js +36 -0
- package/dist/esm/collision/segments.js.map +1 -0
- package/dist/esm/collision/sweep.d.ts +35 -0
- package/dist/esm/collision/sweep.d.ts.map +1 -0
- package/dist/esm/collision/sweep.js +437 -0
- package/dist/esm/collision/sweep.js.map +1 -0
- package/dist/esm/debug/PhysicsDebugDraw.d.ts +23 -4
- package/dist/esm/debug/PhysicsDebugDraw.d.ts.map +1 -0
- package/dist/esm/debug/PhysicsDebugDraw.js +230 -188
- package/dist/esm/debug/PhysicsDebugDraw.js.map +1 -1
- package/dist/esm/debug/index.d.ts +1 -0
- package/dist/esm/debug/index.d.ts.map +1 -0
- package/dist/esm/debug/index.js +3 -2
- package/dist/esm/events.d.ts +1 -0
- package/dist/esm/events.d.ts.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +24 -19
- package/dist/esm/joints/DistanceJoint.d.ts +4 -3
- package/dist/esm/joints/DistanceJoint.d.ts.map +1 -0
- package/dist/esm/joints/DistanceJoint.js +160 -172
- package/dist/esm/joints/DistanceJoint.js.map +1 -1
- package/dist/esm/joints/Joint.d.ts +5 -4
- package/dist/esm/joints/Joint.d.ts.map +1 -0
- package/dist/esm/joints/Joint.js +23 -21
- package/dist/esm/joints/Joint.js.map +1 -1
- package/dist/esm/joints/MouseJoint.d.ts +8 -7
- package/dist/esm/joints/MouseJoint.d.ts.map +1 -0
- package/dist/esm/joints/MouseJoint.js +132 -133
- package/dist/esm/joints/MouseJoint.js.map +1 -1
- package/dist/esm/joints/PrismaticJoint.d.ts +5 -4
- package/dist/esm/joints/PrismaticJoint.d.ts.map +1 -0
- package/dist/esm/joints/PrismaticJoint.js +211 -240
- package/dist/esm/joints/PrismaticJoint.js.map +1 -1
- package/dist/esm/joints/RevoluteJoint.d.ts +4 -3
- package/dist/esm/joints/RevoluteJoint.d.ts.map +1 -0
- package/dist/esm/joints/RevoluteJoint.js +191 -213
- package/dist/esm/joints/RevoluteJoint.js.map +1 -1
- package/dist/esm/joints/WeldJoint.d.ts +3 -2
- package/dist/esm/joints/WeldJoint.d.ts.map +1 -0
- package/dist/esm/joints/WeldJoint.js +156 -152
- package/dist/esm/joints/WeldJoint.js.map +1 -1
- package/dist/esm/joints/WheelJoint.d.ts +4 -3
- package/dist/esm/joints/WheelJoint.d.ts.map +1 -0
- package/dist/esm/joints/WheelJoint.js +228 -255
- package/dist/esm/joints/WheelJoint.js.map +1 -1
- package/dist/esm/math.d.ts +6 -9
- package/dist/esm/math.d.ts.map +1 -0
- package/dist/esm/math.js +37 -39
- package/dist/esm/math.js.map +1 -1
- package/dist/esm/physicsBuildInfo.d.ts +1 -0
- package/dist/esm/physicsBuildInfo.d.ts.map +1 -0
- package/dist/esm/physicsBuildInfo.js +6 -4
- package/dist/esm/physicsBuildInfo.js.map +1 -1
- package/dist/esm/public.d.ts +8 -3
- package/dist/esm/public.d.ts.map +1 -0
- package/dist/esm/query/QueryEngine.d.ts +56 -12
- package/dist/esm/query/QueryEngine.d.ts.map +1 -0
- package/dist/esm/query/QueryEngine.js +494 -237
- package/dist/esm/query/QueryEngine.js.map +1 -1
- package/dist/esm/query/SpatialIndex.d.ts +34 -0
- package/dist/esm/query/SpatialIndex.d.ts.map +1 -0
- package/dist/esm/shapes/AnyShape.d.ts +9 -4
- package/dist/esm/shapes/AnyShape.d.ts.map +1 -0
- package/dist/esm/shapes/BoxShape.d.ts +2 -1
- package/dist/esm/shapes/BoxShape.d.ts.map +1 -0
- package/dist/esm/shapes/BoxShape.js +37 -25
- package/dist/esm/shapes/BoxShape.js.map +1 -1
- package/dist/esm/shapes/CapsuleShape.d.ts +30 -0
- package/dist/esm/shapes/CapsuleShape.d.ts.map +1 -0
- package/dist/esm/shapes/CapsuleShape.js +88 -0
- package/dist/esm/shapes/CapsuleShape.js.map +1 -0
- package/dist/esm/shapes/ChainEdgeShape.d.ts +30 -0
- package/dist/esm/shapes/ChainEdgeShape.d.ts.map +1 -0
- package/dist/esm/shapes/ChainEdgeShape.js +66 -0
- package/dist/esm/shapes/ChainEdgeShape.js.map +1 -0
- package/dist/esm/shapes/ChainShape.d.ts +52 -0
- package/dist/esm/shapes/ChainShape.d.ts.map +1 -0
- package/dist/esm/shapes/ChainShape.js +85 -0
- package/dist/esm/shapes/ChainShape.js.map +1 -0
- package/dist/esm/shapes/CircleShape.d.ts +3 -4
- package/dist/esm/shapes/CircleShape.d.ts.map +1 -0
- package/dist/esm/shapes/CircleShape.js +27 -26
- package/dist/esm/shapes/CircleShape.js.map +1 -1
- package/dist/esm/shapes/PolygonShape.d.ts +7 -8
- package/dist/esm/shapes/PolygonShape.d.ts.map +1 -0
- package/dist/esm/shapes/PolygonShape.js +131 -162
- package/dist/esm/shapes/PolygonShape.js.map +1 -1
- package/dist/esm/shapes/SegmentShape.d.ts +31 -0
- package/dist/esm/shapes/SegmentShape.d.ts.map +1 -0
- package/dist/esm/shapes/SegmentShape.js +62 -0
- package/dist/esm/shapes/SegmentShape.js.map +1 -0
- package/dist/esm/shapes/Shape.d.ts +28 -17
- package/dist/esm/shapes/Shape.d.ts.map +1 -0
- package/dist/esm/shapes/Shape.js +12 -13
- package/dist/esm/shapes/Shape.js.map +1 -1
- package/dist/esm/shapes/convexParts.d.ts +21 -0
- package/dist/esm/shapes/convexParts.d.ts.map +1 -0
- package/dist/esm/shapes/convexParts.js +26 -0
- package/dist/esm/shapes/convexParts.js.map +1 -0
- package/dist/esm/shapes/decompose.d.ts +24 -0
- package/dist/esm/shapes/decompose.d.ts.map +1 -0
- package/dist/esm/shapes/decompose.js +272 -0
- package/dist/esm/shapes/decompose.js.map +1 -0
- package/dist/esm/shapes/index.d.ts +4 -0
- package/dist/esm/shapes/index.d.ts.map +1 -0
- package/dist/esm/solver/ContactSolver.d.ts +12 -5
- package/dist/esm/solver/ContactSolver.d.ts.map +1 -0
- package/dist/esm/solver/ContactSolver.js +425 -471
- package/dist/esm/solver/ContactSolver.js.map +1 -1
- package/dist/esm/solver/tolerances.d.ts +34 -0
- package/dist/esm/solver/tolerances.d.ts.map +1 -0
- package/dist/esm/solver/tolerances.js +38 -0
- package/dist/esm/solver/tolerances.js.map +1 -0
- package/dist/esm/sort.d.ts +5 -4
- package/dist/esm/sort.d.ts.map +1 -0
- package/dist/esm/sort.js +41 -51
- package/dist/esm/sort.js.map +1 -1
- package/dist/esm/types.d.ts +4 -8
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +15 -17
- package/dist/esm/types.js.map +1 -1
- package/package.json +6 -6
- package/dist/esm/broadphase/SweepAndPrune.d.ts +0 -15
- package/dist/esm/broadphase/SweepAndPrune.js +0 -77
- package/dist/esm/broadphase/SweepAndPrune.js.map +0 -1
- package/dist/esm/debug/index.js.map +0 -1
- package/dist/esm/index.js.map +0 -1
|
@@ -1,159 +1,163 @@
|
|
|
1
|
-
import { applyInverseTransform, applyTransform } from
|
|
2
|
-
import { Joint } from
|
|
1
|
+
import { applyInverseTransform, applyTransform } from "../math.js";
|
|
2
|
+
import { Joint } from "./Joint.js";
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
//#region src/joints/WeldJoint.ts
|
|
5
|
+
/** Reused output sink - physics steps single-threaded, so a shared scratch is safe. */
|
|
6
|
+
const scratch = {
|
|
7
|
+
x: 0,
|
|
8
|
+
y: 0
|
|
9
|
+
};
|
|
6
10
|
/** Box2D-v3 soft-constraint factors at sub-step `h`, or rigid Baumgarte when `hertz === 0`. */
|
|
7
11
|
const computeSoftFactors = (hertz, dampingRatio, h, out) => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
12
|
+
if (hertz > 0) {
|
|
13
|
+
const omega = 2 * Math.PI * hertz;
|
|
14
|
+
const a1 = 2 * dampingRatio + h * omega;
|
|
15
|
+
const a2 = h * omega * a1;
|
|
16
|
+
const a3 = 1 / (1 + a2);
|
|
17
|
+
out.biasRate = omega / a1;
|
|
18
|
+
out.massScale = a2 * a3;
|
|
19
|
+
out.impulseScale = a3;
|
|
20
|
+
} else {
|
|
21
|
+
out.biasRate = .2 / h;
|
|
22
|
+
out.massScale = 1;
|
|
23
|
+
out.impulseScale = 0;
|
|
24
|
+
}
|
|
22
25
|
};
|
|
23
26
|
/**
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
}
|
|
27
|
+
* Rigidly fixes the relative position and orientation of two bodies (they move
|
|
28
|
+
* as one rigid body). A 2-DOF point constraint (like {@link RevoluteJoint}) plus
|
|
29
|
+
* a 1-DOF angular constraint, solved in the sub-step loop. Both locks default to
|
|
30
|
+
* rigid; set `linearHertz`/`angularHertz` for a springy weld.
|
|
31
|
+
*/
|
|
32
|
+
var WeldJoint = class extends Joint {
|
|
33
|
+
/** Locked relative angle `angleB − angleA`. */
|
|
34
|
+
referenceAngle;
|
|
35
|
+
/** Soft frequency for the position lock (`0` = rigid). */
|
|
36
|
+
linearHertz;
|
|
37
|
+
/** Soft frequency for the angle lock (`0` = rigid). */
|
|
38
|
+
angularHertz;
|
|
39
|
+
/** Soft damping ratio. */
|
|
40
|
+
dampingRatio;
|
|
41
|
+
_localAnchorAx;
|
|
42
|
+
_localAnchorAy;
|
|
43
|
+
_localAnchorBx;
|
|
44
|
+
_localAnchorBy;
|
|
45
|
+
_rAx = 0;
|
|
46
|
+
_rAy = 0;
|
|
47
|
+
_rBx = 0;
|
|
48
|
+
_rBy = 0;
|
|
49
|
+
_cx = 0;
|
|
50
|
+
_cy = 0;
|
|
51
|
+
_invK11 = 0;
|
|
52
|
+
_invK12 = 0;
|
|
53
|
+
_invK22 = 0;
|
|
54
|
+
_angleError = 0;
|
|
55
|
+
_effMassAngle = 0;
|
|
56
|
+
_linear = {
|
|
57
|
+
biasRate: 0,
|
|
58
|
+
massScale: 1,
|
|
59
|
+
impulseScale: 0
|
|
60
|
+
};
|
|
61
|
+
_angular = {
|
|
62
|
+
biasRate: 0,
|
|
63
|
+
massScale: 1,
|
|
64
|
+
impulseScale: 0
|
|
65
|
+
};
|
|
66
|
+
_impulseX = 0;
|
|
67
|
+
_impulseY = 0;
|
|
68
|
+
_impulseAngle = 0;
|
|
69
|
+
constructor(options) {
|
|
70
|
+
super(options.bodyA, options.bodyB);
|
|
71
|
+
const ax = options.anchor?.x ?? (options.bodyA.x + options.bodyB.x) / 2;
|
|
72
|
+
const ay = options.anchor?.y ?? (options.bodyA.y + options.bodyB.y) / 2;
|
|
73
|
+
applyInverseTransform(options.bodyA.transform, ax, ay, scratch);
|
|
74
|
+
this._localAnchorAx = scratch.x;
|
|
75
|
+
this._localAnchorAy = scratch.y;
|
|
76
|
+
applyInverseTransform(options.bodyB.transform, ax, ay, scratch);
|
|
77
|
+
this._localAnchorBx = scratch.x;
|
|
78
|
+
this._localAnchorBy = scratch.y;
|
|
79
|
+
this.referenceAngle = options.referenceAngle ?? options.bodyB.angle - options.bodyA.angle;
|
|
80
|
+
this.linearHertz = options.linearHertz ?? 0;
|
|
81
|
+
this.angularHertz = options.angularHertz ?? 0;
|
|
82
|
+
this.dampingRatio = options.dampingRatio ?? 1;
|
|
83
|
+
}
|
|
84
|
+
_prepare(h) {
|
|
85
|
+
const bodyA = this.bodyA;
|
|
86
|
+
const bodyB = this.bodyB;
|
|
87
|
+
this._active = this.enabled && !bodyA.isSleeping && !bodyB.isSleeping && (bodyA.invMass > 0 || bodyB.invMass > 0);
|
|
88
|
+
if (!this._active) return;
|
|
89
|
+
applyTransform(bodyA.transform, this._localAnchorAx, this._localAnchorAy, scratch);
|
|
90
|
+
const pAx = scratch.x;
|
|
91
|
+
const pAy = scratch.y;
|
|
92
|
+
applyTransform(bodyB.transform, this._localAnchorBx, this._localAnchorBy, scratch);
|
|
93
|
+
const pBx = scratch.x;
|
|
94
|
+
const pBy = scratch.y;
|
|
95
|
+
this._rAx = pAx - bodyA.worldCenterOfMassX;
|
|
96
|
+
this._rAy = pAy - bodyA.worldCenterOfMassY;
|
|
97
|
+
this._rBx = pBx - bodyB.worldCenterOfMassX;
|
|
98
|
+
this._rBy = pBy - bodyB.worldCenterOfMassY;
|
|
99
|
+
this._cx = pBx - pAx;
|
|
100
|
+
this._cy = pBy - pAy;
|
|
101
|
+
const mA = bodyA.invMass;
|
|
102
|
+
const mB = bodyB.invMass;
|
|
103
|
+
const iA = bodyA.invInertia;
|
|
104
|
+
const iB = bodyB.invInertia;
|
|
105
|
+
const k11 = mA + mB + iA * this._rAy * this._rAy + iB * this._rBy * this._rBy;
|
|
106
|
+
const k12 = -iA * this._rAx * this._rAy - iB * this._rBx * this._rBy;
|
|
107
|
+
const k22 = mA + mB + iA * this._rAx * this._rAx + iB * this._rBx * this._rBx;
|
|
108
|
+
const det = k11 * k22 - k12 * k12;
|
|
109
|
+
const invDet = det !== 0 ? 1 / det : 0;
|
|
110
|
+
this._invK11 = invDet * k22;
|
|
111
|
+
this._invK12 = -invDet * k12;
|
|
112
|
+
this._invK22 = invDet * k11;
|
|
113
|
+
this._angleError = bodyB.angle - bodyA.angle - this.referenceAngle;
|
|
114
|
+
const kAngle = iA + iB;
|
|
115
|
+
this._effMassAngle = kAngle > 0 ? 1 / kAngle : 0;
|
|
116
|
+
computeSoftFactors(this.linearHertz, this.dampingRatio, h, this._linear);
|
|
117
|
+
computeSoftFactors(this.angularHertz, this.dampingRatio, h, this._angular);
|
|
118
|
+
}
|
|
119
|
+
_warmStart() {
|
|
120
|
+
if (!this._active) return;
|
|
121
|
+
const bodyA = this.bodyA;
|
|
122
|
+
const bodyB = this.bodyB;
|
|
123
|
+
bodyA.angularVelocity -= bodyA.invInertia * this._impulseAngle;
|
|
124
|
+
bodyB.angularVelocity += bodyB.invInertia * this._impulseAngle;
|
|
125
|
+
this._applyLinearImpulse(this._impulseX, this._impulseY);
|
|
126
|
+
}
|
|
127
|
+
_solve(useBias) {
|
|
128
|
+
if (!this._active) return;
|
|
129
|
+
const bodyA = this.bodyA;
|
|
130
|
+
const bodyB = this.bodyB;
|
|
131
|
+
const cdotAngle = bodyB.angularVelocity - bodyA.angularVelocity;
|
|
132
|
+
const biasAngle = useBias ? this._angular.biasRate * this._angleError : 0;
|
|
133
|
+
const impulseAngle = -this._effMassAngle * this._angular.massScale * (cdotAngle + biasAngle) - this._angular.impulseScale * this._impulseAngle;
|
|
134
|
+
this._impulseAngle += impulseAngle;
|
|
135
|
+
bodyA.angularVelocity -= bodyA.invInertia * impulseAngle;
|
|
136
|
+
bodyB.angularVelocity += bodyB.invInertia * impulseAngle;
|
|
137
|
+
const cdotX = bodyB.linearVelocityX - bodyB.angularVelocity * this._rBy - (bodyA.linearVelocityX - bodyA.angularVelocity * this._rAy);
|
|
138
|
+
const cdotY = bodyB.linearVelocityY + bodyB.angularVelocity * this._rBx - (bodyA.linearVelocityY + bodyA.angularVelocity * this._rAx);
|
|
139
|
+
const rhsX = cdotX + (useBias ? this._linear.biasRate * this._cx : 0);
|
|
140
|
+
const rhsY = cdotY + (useBias ? this._linear.biasRate * this._cy : 0);
|
|
141
|
+
const solvedX = this._invK11 * rhsX + this._invK12 * rhsY;
|
|
142
|
+
const solvedY = this._invK12 * rhsX + this._invK22 * rhsY;
|
|
143
|
+
const impulseX = -this._linear.massScale * solvedX - this._linear.impulseScale * this._impulseX;
|
|
144
|
+
const impulseY = -this._linear.massScale * solvedY - this._linear.impulseScale * this._impulseY;
|
|
145
|
+
this._impulseX += impulseX;
|
|
146
|
+
this._impulseY += impulseY;
|
|
147
|
+
this._applyLinearImpulse(impulseX, impulseY);
|
|
148
|
+
}
|
|
149
|
+
_applyLinearImpulse(jx, jy) {
|
|
150
|
+
const bodyA = this.bodyA;
|
|
151
|
+
const bodyB = this.bodyB;
|
|
152
|
+
bodyA.linearVelocityX -= bodyA.invMass * jx;
|
|
153
|
+
bodyA.linearVelocityY -= bodyA.invMass * jy;
|
|
154
|
+
bodyA.angularVelocity -= bodyA.invInertia * (this._rAx * jy - this._rAy * jx);
|
|
155
|
+
bodyB.linearVelocityX += bodyB.invMass * jx;
|
|
156
|
+
bodyB.linearVelocityY += bodyB.invMass * jy;
|
|
157
|
+
bodyB.angularVelocity += bodyB.invInertia * (this._rBx * jy - this._rBy * jx);
|
|
158
|
+
}
|
|
159
|
+
};
|
|
157
160
|
|
|
161
|
+
//#endregion
|
|
158
162
|
export { WeldJoint };
|
|
159
|
-
//# sourceMappingURL=WeldJoint.js.map
|
|
163
|
+
//# sourceMappingURL=WeldJoint.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WeldJoint.js","sources":["../../../../src/joints/WeldJoint.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WeldJoint.js","names":[],"sources":["../../../src/joints/WeldJoint.ts"],"sourcesContent":["import type { PointLike } from '@codexo/exojs';\n\nimport { applyInverseTransform, applyTransform } from '../math';\nimport type { PhysicsBody } from '../PhysicsBody';\nimport { Joint } from './Joint';\n\n/** Construction options for a {@link WeldJoint}. */\nexport interface WeldJointOptions {\n /** First body. */\n bodyA: PhysicsBody;\n /** Second body. */\n bodyB: PhysicsBody;\n /** World-space anchor the linear constraint acts at. Default: the midpoint of the two bodies. */\n anchor?: Readonly<PointLike>;\n /** Locked relative angle `angleB − angleA`. Default: the current relative angle at creation. */\n referenceAngle?: number;\n /** Soft frequency (Hz) for the position lock; `0` (default) is rigid. */\n linearHertz?: number;\n /** Soft frequency (Hz) for the angle lock; `0` (default) is rigid. */\n angularHertz?: number;\n /** Soft damping ratio (used when a hertz is `> 0`). Default `1`. */\n dampingRatio?: number;\n}\n\n/** Reused output sink - physics steps single-threaded, so a shared scratch is safe. */\nconst scratch: PointLike = { x: 0, y: 0 };\n\ninterface SoftFactors {\n biasRate: number;\n massScale: number;\n impulseScale: number;\n}\n\n/** Box2D-v3 soft-constraint factors at sub-step `h`, or rigid Baumgarte when `hertz === 0`. */\nconst computeSoftFactors = (hertz: number, dampingRatio: number, h: number, out: SoftFactors): void => {\n if (hertz > 0) {\n const omega = 2 * Math.PI * hertz;\n const a1 = 2 * dampingRatio + h * omega;\n const a2 = h * omega * a1;\n const a3 = 1 / (1 + a2);\n\n out.biasRate = omega / a1;\n out.massScale = a2 * a3;\n out.impulseScale = a3;\n } else {\n out.biasRate = 0.2 / h;\n out.massScale = 1;\n out.impulseScale = 0;\n }\n};\n\n/**\n * Rigidly fixes the relative position and orientation of two bodies (they move\n * as one rigid body). A 2-DOF point constraint (like {@link RevoluteJoint}) plus\n * a 1-DOF angular constraint, solved in the sub-step loop. Both locks default to\n * rigid; set `linearHertz`/`angularHertz` for a springy weld.\n */\nexport class WeldJoint extends Joint {\n /** Locked relative angle `angleB − angleA`. */\n public referenceAngle: number;\n /** Soft frequency for the position lock (`0` = rigid). */\n public linearHertz: number;\n /** Soft frequency for the angle lock (`0` = rigid). */\n public angularHertz: number;\n /** Soft damping ratio. */\n public dampingRatio: number;\n\n private readonly _localAnchorAx: number;\n private readonly _localAnchorAy: number;\n private readonly _localAnchorBx: number;\n private readonly _localAnchorBy: number;\n\n private _rAx = 0;\n private _rAy = 0;\n private _rBx = 0;\n private _rBy = 0;\n private _cx = 0;\n private _cy = 0;\n private _invK11 = 0;\n private _invK12 = 0;\n private _invK22 = 0;\n private _angleError = 0;\n private _effMassAngle = 0;\n private readonly _linear: SoftFactors = { biasRate: 0, massScale: 1, impulseScale: 0 };\n private readonly _angular: SoftFactors = { biasRate: 0, massScale: 1, impulseScale: 0 };\n private _impulseX = 0;\n private _impulseY = 0;\n private _impulseAngle = 0;\n\n public constructor(options: WeldJointOptions) {\n super(options.bodyA, options.bodyB);\n\n const ax = options.anchor?.x ?? (options.bodyA.x + options.bodyB.x) / 2;\n const ay = options.anchor?.y ?? (options.bodyA.y + options.bodyB.y) / 2;\n\n applyInverseTransform(options.bodyA.transform, ax, ay, scratch);\n this._localAnchorAx = scratch.x;\n this._localAnchorAy = scratch.y;\n applyInverseTransform(options.bodyB.transform, ax, ay, scratch);\n this._localAnchorBx = scratch.x;\n this._localAnchorBy = scratch.y;\n\n this.referenceAngle = options.referenceAngle ?? options.bodyB.angle - options.bodyA.angle;\n this.linearHertz = options.linearHertz ?? 0;\n this.angularHertz = options.angularHertz ?? 0;\n this.dampingRatio = options.dampingRatio ?? 1;\n }\n\n public override _prepare(h: number): void {\n const bodyA = this.bodyA;\n const bodyB = this.bodyB;\n\n this._active = this.enabled && !bodyA.isSleeping && !bodyB.isSleeping && (bodyA.invMass > 0 || bodyB.invMass > 0);\n\n if (!this._active) {\n return;\n }\n\n applyTransform(bodyA.transform, this._localAnchorAx, this._localAnchorAy, scratch);\n const pAx = scratch.x;\n const pAy = scratch.y;\n applyTransform(bodyB.transform, this._localAnchorBx, this._localAnchorBy, scratch);\n const pBx = scratch.x;\n const pBy = scratch.y;\n\n this._rAx = pAx - bodyA.worldCenterOfMassX;\n this._rAy = pAy - bodyA.worldCenterOfMassY;\n this._rBx = pBx - bodyB.worldCenterOfMassX;\n this._rBy = pBy - bodyB.worldCenterOfMassY;\n this._cx = pBx - pAx;\n this._cy = pBy - pAy;\n\n const mA = bodyA.invMass;\n const mB = bodyB.invMass;\n const iA = bodyA.invInertia;\n const iB = bodyB.invInertia;\n\n const k11 = mA + mB + iA * this._rAy * this._rAy + iB * this._rBy * this._rBy;\n const k12 = -iA * this._rAx * this._rAy - iB * this._rBx * this._rBy;\n const k22 = mA + mB + iA * this._rAx * this._rAx + iB * this._rBx * this._rBx;\n const det = k11 * k22 - k12 * k12;\n const invDet = det !== 0 ? 1 / det : 0;\n\n this._invK11 = invDet * k22;\n this._invK12 = -invDet * k12;\n this._invK22 = invDet * k11;\n\n this._angleError = bodyB.angle - bodyA.angle - this.referenceAngle;\n const kAngle = iA + iB;\n this._effMassAngle = kAngle > 0 ? 1 / kAngle : 0;\n\n computeSoftFactors(this.linearHertz, this.dampingRatio, h, this._linear);\n computeSoftFactors(this.angularHertz, this.dampingRatio, h, this._angular);\n }\n\n public override _warmStart(): void {\n if (!this._active) {\n return;\n }\n\n const bodyA = this.bodyA;\n const bodyB = this.bodyB;\n\n bodyA.angularVelocity -= bodyA.invInertia * this._impulseAngle;\n bodyB.angularVelocity += bodyB.invInertia * this._impulseAngle;\n this._applyLinearImpulse(this._impulseX, this._impulseY);\n }\n\n public override _solve(useBias: boolean): void {\n if (!this._active) {\n return;\n }\n\n const bodyA = this.bodyA;\n const bodyB = this.bodyB;\n\n // Angular lock first.\n const cdotAngle = bodyB.angularVelocity - bodyA.angularVelocity;\n const biasAngle = useBias ? this._angular.biasRate * this._angleError : 0;\n const impulseAngle = -this._effMassAngle * this._angular.massScale * (cdotAngle + biasAngle) - this._angular.impulseScale * this._impulseAngle;\n\n this._impulseAngle += impulseAngle;\n bodyA.angularVelocity -= bodyA.invInertia * impulseAngle;\n bodyB.angularVelocity += bodyB.invInertia * impulseAngle;\n\n // Linear (point) lock.\n const cdotX = bodyB.linearVelocityX - bodyB.angularVelocity * this._rBy - (bodyA.linearVelocityX - bodyA.angularVelocity * this._rAy);\n const cdotY = bodyB.linearVelocityY + bodyB.angularVelocity * this._rBx - (bodyA.linearVelocityY + bodyA.angularVelocity * this._rAx);\n const rhsX = cdotX + (useBias ? this._linear.biasRate * this._cx : 0);\n const rhsY = cdotY + (useBias ? this._linear.biasRate * this._cy : 0);\n const solvedX = this._invK11 * rhsX + this._invK12 * rhsY;\n const solvedY = this._invK12 * rhsX + this._invK22 * rhsY;\n const impulseX = -this._linear.massScale * solvedX - this._linear.impulseScale * this._impulseX;\n const impulseY = -this._linear.massScale * solvedY - this._linear.impulseScale * this._impulseY;\n\n this._impulseX += impulseX;\n this._impulseY += impulseY;\n this._applyLinearImpulse(impulseX, impulseY);\n }\n\n private _applyLinearImpulse(jx: number, jy: number): void {\n const bodyA = this.bodyA;\n const bodyB = this.bodyB;\n\n bodyA.linearVelocityX -= bodyA.invMass * jx;\n bodyA.linearVelocityY -= bodyA.invMass * jy;\n bodyA.angularVelocity -= bodyA.invInertia * (this._rAx * jy - this._rAy * jx);\n bodyB.linearVelocityX += bodyB.invMass * jx;\n bodyB.linearVelocityY += bodyB.invMass * jy;\n bodyB.angularVelocity += bodyB.invInertia * (this._rBx * jy - this._rBy * jx);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import type { PointLike } from '@codexo/exojs';
|
|
1
2
|
import type { PhysicsBody } from '../PhysicsBody';
|
|
2
|
-
import type { VectorLike } from '../types';
|
|
3
3
|
import { Joint } from './Joint';
|
|
4
4
|
/** Construction options for a {@link WheelJoint}. */
|
|
5
5
|
export interface WheelJointOptions {
|
|
@@ -8,9 +8,9 @@ export interface WheelJointOptions {
|
|
|
8
8
|
/** Second body (the wheel). */
|
|
9
9
|
bodyB: PhysicsBody;
|
|
10
10
|
/** Shared world-space anchor at creation (the wheel hub). */
|
|
11
|
-
anchor:
|
|
11
|
+
anchor: Readonly<PointLike>;
|
|
12
12
|
/** Suspension axis in world space at creation (normalised internally). */
|
|
13
|
-
axis:
|
|
13
|
+
axis: Readonly<PointLike>;
|
|
14
14
|
/** Suspension spring frequency in Hz (`0` makes the axis rigid). Default `0`. */
|
|
15
15
|
hertz?: number;
|
|
16
16
|
/** Suspension spring damping ratio. Default `1`. */
|
|
@@ -90,3 +90,4 @@ export declare class WheelJoint extends Joint {
|
|
|
90
90
|
private _applyAxial;
|
|
91
91
|
private _applyPerp;
|
|
92
92
|
}
|
|
93
|
+
//# sourceMappingURL=WheelJoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WheelJoint.d.ts","sourceRoot":"","sources":["../../../src/joints/WheelJoint.ts"],"names":[],"mappings":"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"}
|