@flighthq/physics2d 0.3.0-next.1032.e2b99fc → 0.3.0-next.1220.6982c21
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/contract.d.ts +2 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +2 -0
- package/dist/contract.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/jointRegistry.d.ts +6 -0
- package/dist/jointRegistry.d.ts.map +1 -0
- package/dist/jointRegistry.js +61 -0
- package/dist/jointRegistry.js.map +1 -0
- package/dist/joints.d.ts +39 -0
- package/dist/joints.d.ts.map +1 -0
- package/dist/joints.js +488 -0
- package/dist/joints.js.map +1 -0
- package/dist/solver.d.ts +1 -0
- package/dist/solver.d.ts.map +1 -1
- package/dist/solver.js +15 -10
- package/dist/solver.js.map +1 -1
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +111 -8
- package/dist/step.js.map +1 -1
- package/dist/world.d.ts.map +1 -1
- package/dist/world.js +10 -0
- package/dist/world.js.map +1 -1
- package/package.json +5 -5
- package/src/jointRegistry.test.ts +145 -0
- package/src/joints.test.ts +648 -0
- package/src/solver.test.ts +19 -0
- package/src/step.test.ts +298 -0
package/dist/joints.js
ADDED
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import { applyPhysics2DImpulse } from './solver';
|
|
2
|
+
import { findPhysics2DBody } from './world';
|
|
3
|
+
// The built-in joint kinds. Bare names are reserved for these; a user's own joint takes a vendor prefix.
|
|
4
|
+
export const Physics2DDistanceJointKind = 'Distance';
|
|
5
|
+
export const Physics2DMouseJointKind = 'Mouse';
|
|
6
|
+
export const Physics2DRevoluteJointKind = 'Revolute';
|
|
7
|
+
export const Physics2DRopeJointKind = 'Rope';
|
|
8
|
+
export const Physics2DWeldJointKind = 'Weld';
|
|
9
|
+
// Holds two anchors a fixed distance apart, rigidly or as a damped spring.
|
|
10
|
+
//
|
|
11
|
+
// One scalar constraint along the axis between the anchors. Softness enters as a modified effective mass
|
|
12
|
+
// plus a position bias rather than as a separate force: solving a spring as a constraint keeps it stable
|
|
13
|
+
// at any stiffness, where adding a spring FORCE explodes once the stiffness times the timestep exceeds
|
|
14
|
+
// what the integrator can follow.
|
|
15
|
+
export const physics2DDistanceJointSolver = {
|
|
16
|
+
warmStart(world, joint) {
|
|
17
|
+
const state = jointStateScratch.get(joint);
|
|
18
|
+
if (state === undefined)
|
|
19
|
+
return;
|
|
20
|
+
const bodyA = findPhysics2DBody(world, joint.bodyA);
|
|
21
|
+
const bodyB = findPhysics2DBody(world, joint.bodyB);
|
|
22
|
+
if (bodyA === null || bodyB === null)
|
|
23
|
+
return;
|
|
24
|
+
applyPhysics2DImpulse(bodyA, bodyB, joint.rAX, joint.rAY, joint.rBX, joint.rBY, -joint.impulse0 * state[3], -joint.impulse0 * state[4]);
|
|
25
|
+
},
|
|
26
|
+
clearAccumulatedImpulses(joint) {
|
|
27
|
+
joint.impulse0 = 0;
|
|
28
|
+
},
|
|
29
|
+
prepare(world, joint, dt) {
|
|
30
|
+
const distance = joint;
|
|
31
|
+
const bodyA = findPhysics2DBody(world, joint.bodyA);
|
|
32
|
+
const bodyB = findPhysics2DBody(world, joint.bodyB);
|
|
33
|
+
if (bodyA === null || bodyB === null)
|
|
34
|
+
return;
|
|
35
|
+
writeJointAnchors(bodyA, bodyB, joint);
|
|
36
|
+
const axisX = bodyB.x + joint.rBX - (bodyA.x + joint.rAX);
|
|
37
|
+
const axisY = bodyB.y + joint.rBY - (bodyA.y + joint.rAY);
|
|
38
|
+
const length = Math.sqrt(axisX * axisX + axisY * axisY);
|
|
39
|
+
if (length > EPSILON) {
|
|
40
|
+
axisScratch[0] = axisX / length;
|
|
41
|
+
axisScratch[1] = axisY / length;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Coincident anchors leave the axis undefined. Any unit vector is as correct as another and none is
|
|
45
|
+
// wrong for one step, where dividing by the length would seed NaN into both bodies permanently.
|
|
46
|
+
axisScratch[0] = 1;
|
|
47
|
+
axisScratch[1] = 0;
|
|
48
|
+
}
|
|
49
|
+
const mass = axisEffectiveMass(bodyA, bodyB, joint, axisScratch[0], axisScratch[1]);
|
|
50
|
+
const separation = length - distance.length;
|
|
51
|
+
if (distance.stiffness > 0) {
|
|
52
|
+
const angular = 2 * Math.PI * distance.stiffness;
|
|
53
|
+
const damp = 2 * mass * distance.damping * angular;
|
|
54
|
+
const spring = mass * angular * angular;
|
|
55
|
+
const gamma = dt * (damp + dt * spring);
|
|
56
|
+
jointScratch[2] = gamma > 0 ? 1 / gamma : 0;
|
|
57
|
+
jointScratch[1] = separation * dt * spring * jointScratch[2];
|
|
58
|
+
const softMass = mass + jointScratch[2];
|
|
59
|
+
jointScratch[0] = softMass > 0 ? 1 / softMass : 0;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
jointScratch[0] = mass > 0 ? 1 / mass : 0;
|
|
63
|
+
jointScratch[1] = separation * (BAUMGARTE / dt);
|
|
64
|
+
jointScratch[2] = 0;
|
|
65
|
+
}
|
|
66
|
+
distance.rAX = joint.rAX;
|
|
67
|
+
writeJointState(distance, [jointScratch[0], jointScratch[1], jointScratch[2], axisScratch[0], axisScratch[1]]);
|
|
68
|
+
},
|
|
69
|
+
solve(world, joint) {
|
|
70
|
+
const state = jointStateScratch.get(joint);
|
|
71
|
+
if (state === undefined)
|
|
72
|
+
return;
|
|
73
|
+
const bodyA = findPhysics2DBody(world, joint.bodyA);
|
|
74
|
+
const bodyB = findPhysics2DBody(world, joint.bodyB);
|
|
75
|
+
if (bodyA === null || bodyB === null)
|
|
76
|
+
return;
|
|
77
|
+
const [effectiveMass, bias, gamma, axisX, axisY] = state;
|
|
78
|
+
const velocity = axisRelativeVelocity(bodyA, bodyB, joint, axisX, axisY);
|
|
79
|
+
const lambda = -effectiveMass * (velocity + bias + gamma * joint.impulse0);
|
|
80
|
+
joint.impulse0 += lambda;
|
|
81
|
+
applyPhysics2DImpulse(bodyA, bodyB, joint.rAX, joint.rAY, joint.rBX, joint.rBY, -lambda * axisX, -lambda * axisY);
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
// Drags one body toward a moving world-space target with bounded force.
|
|
85
|
+
//
|
|
86
|
+
// Always soft, and that is not a tuning choice: a rigid drag lets a user inject unbounded energy simply by
|
|
87
|
+
// moving the cursor faster than the simulation can follow, and the rest of the world absorbs it. The force
|
|
88
|
+
// bound is what keeps a dragged body from tunnelling through a wall it is pulled into.
|
|
89
|
+
export const physics2DMouseJointSolver = {
|
|
90
|
+
// A mouse joint drags ONE body toward a world-space target; its other end is not a body at all, and
|
|
91
|
+
// callers pass whatever index is convenient. Canonical ordering exists to fix the solve order
|
|
92
|
+
// BETWEEN two bodies, so with only one body there is nothing to order and the exchange is pure
|
|
93
|
+
// corruption: it moved the dragged body into bodyA, and this solver acts on bodyB, so the drag
|
|
94
|
+
// silently applied to the anchor instead and the dragged body never moved.
|
|
95
|
+
swapEnds() {
|
|
96
|
+
return false;
|
|
97
|
+
},
|
|
98
|
+
// No warmStart: the drag target moves between steps, so last step's impulse is aimed at a place the
|
|
99
|
+
// cursor has already left. Seeding from it fights the new target rather than helping it converge.
|
|
100
|
+
clearAccumulatedImpulses(joint) {
|
|
101
|
+
joint.impulse0 = 0;
|
|
102
|
+
joint.impulse1 = 0;
|
|
103
|
+
},
|
|
104
|
+
prepare(world, joint, dt) {
|
|
105
|
+
const mouse = joint;
|
|
106
|
+
const bodyB = findPhysics2DBody(world, joint.bodyB);
|
|
107
|
+
if (bodyB === null)
|
|
108
|
+
return;
|
|
109
|
+
const cos = Math.cos(bodyB.angle);
|
|
110
|
+
const sin = Math.sin(bodyB.angle);
|
|
111
|
+
joint.rBX = joint.localAnchorBX * cos - joint.localAnchorBY * sin;
|
|
112
|
+
joint.rBY = joint.localAnchorBX * sin + joint.localAnchorBY * cos;
|
|
113
|
+
joint.rAX = 0;
|
|
114
|
+
joint.rAY = 0;
|
|
115
|
+
const angular = 2 * Math.PI * (mouse.stiffness > 0 ? mouse.stiffness : 5);
|
|
116
|
+
const damp = 2 * mouse.damping * angular;
|
|
117
|
+
const spring = angular * angular;
|
|
118
|
+
const gamma = dt * (damp + dt * spring);
|
|
119
|
+
const inverseGamma = gamma > 0 ? 1 / gamma : 0;
|
|
120
|
+
const biasFactor = dt * spring * inverseGamma;
|
|
121
|
+
// maxForce is a force; joint.impulse0/1 accumulate an impulse. Clamping one against the other was
|
|
122
|
+
// a unit error worth a factor of 1/dt — at dt 0.01 the bound admitted a hundred times the force it
|
|
123
|
+
// named. Convert once here, where dt is in hand, rather than in solve, which does not receive it.
|
|
124
|
+
writeJointState(mouse, [inverseGamma, biasFactor, dt * mouse.maxForce, 0, 0]);
|
|
125
|
+
},
|
|
126
|
+
solve(world, joint) {
|
|
127
|
+
const mouse = joint;
|
|
128
|
+
const state = jointStateScratch.get(joint);
|
|
129
|
+
if (state === undefined)
|
|
130
|
+
return;
|
|
131
|
+
const bodyB = findPhysics2DBody(world, joint.bodyB);
|
|
132
|
+
if (bodyB === null)
|
|
133
|
+
return;
|
|
134
|
+
const [inverseGamma, biasFactor, maxImpulse] = state;
|
|
135
|
+
const anchorX = bodyB.x + joint.rBX;
|
|
136
|
+
const anchorY = bodyB.y + joint.rBY;
|
|
137
|
+
const errorX = anchorX - mouse.targetX;
|
|
138
|
+
const errorY = anchorY - mouse.targetY;
|
|
139
|
+
const velocityX = bodyB.velocityX - bodyB.angularVelocity * joint.rBY;
|
|
140
|
+
const velocityY = bodyB.velocityY + bodyB.angularVelocity * joint.rBX;
|
|
141
|
+
const mass = bodyB.inverseMass > 0 ? 1 / bodyB.inverseMass : 0;
|
|
142
|
+
let impulseX = -mass * (velocityX + biasFactor * errorX + inverseGamma * joint.impulse0);
|
|
143
|
+
let impulseY = -mass * (velocityY + biasFactor * errorY + inverseGamma * joint.impulse1);
|
|
144
|
+
const previousX = joint.impulse0;
|
|
145
|
+
const previousY = joint.impulse1;
|
|
146
|
+
joint.impulse0 += impulseX;
|
|
147
|
+
joint.impulse1 += impulseY;
|
|
148
|
+
// Clamped on the ACCUMULATED impulse, so a later iteration can correct an earlier overshoot while the
|
|
149
|
+
// total force stays inside the bound.
|
|
150
|
+
const magnitude = Math.sqrt(joint.impulse0 * joint.impulse0 + joint.impulse1 * joint.impulse1);
|
|
151
|
+
if (magnitude > maxImpulse && magnitude > 0) {
|
|
152
|
+
const scale = maxImpulse / magnitude;
|
|
153
|
+
joint.impulse0 *= scale;
|
|
154
|
+
joint.impulse1 *= scale;
|
|
155
|
+
}
|
|
156
|
+
impulseX = joint.impulse0 - previousX;
|
|
157
|
+
impulseY = joint.impulse1 - previousY;
|
|
158
|
+
bodyB.velocityX += impulseX * bodyB.inverseMass;
|
|
159
|
+
bodyB.velocityY += impulseY * bodyB.inverseMass;
|
|
160
|
+
bodyB.angularVelocity += bodyB.inverseInertia * (joint.rBX * impulseY - joint.rBY * impulseX);
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
// Pins two bodies at a point, leaving rotation free — a hinge.
|
|
164
|
+
//
|
|
165
|
+
// Two scalar constraints, one per axis of the shared point, solved as a coupled pair rather than
|
|
166
|
+
// independently: solving x then y lets each undo part of the other's correction, and a hinge under load
|
|
167
|
+
// visibly creeps.
|
|
168
|
+
export const physics2DRevoluteJointSolver = {
|
|
169
|
+
warmStart(world, joint) {
|
|
170
|
+
const bodyA = findPhysics2DBody(world, joint.bodyA);
|
|
171
|
+
const bodyB = findPhysics2DBody(world, joint.bodyB);
|
|
172
|
+
if (bodyA === null || bodyB === null)
|
|
173
|
+
return;
|
|
174
|
+
applyPhysics2DImpulse(bodyA, bodyB, joint.rAX, joint.rAY, joint.rBX, joint.rBY, -joint.impulse0, -joint.impulse1);
|
|
175
|
+
},
|
|
176
|
+
clearAccumulatedImpulses(joint) {
|
|
177
|
+
joint.impulse0 = 0;
|
|
178
|
+
joint.impulse1 = 0;
|
|
179
|
+
joint.motorImpulse = 0;
|
|
180
|
+
},
|
|
181
|
+
// Swapping the ends reverses the sense of every angular quantity this solver reads. The relative
|
|
182
|
+
// angle is measured bodyA -> bodyB, so it negates; the limit interval negates AND its ends exchange
|
|
183
|
+
// (the old lower bound becomes the new upper); and the motor's target relative velocity reverses.
|
|
184
|
+
// Deriving it: the constraint is lower <= (angleB - angleA - reference) <= upper. Writing t for
|
|
185
|
+
// (angleB - angleA), that is lower + reference <= t <= upper + reference. After the swap t becomes
|
|
186
|
+
// -t, so the same physical interval requires reference' = -reference, lower' = -upper and
|
|
187
|
+
// upper' = -lower.
|
|
188
|
+
swapEnds(joint) {
|
|
189
|
+
const revolute = joint;
|
|
190
|
+
const lower = revolute.lowerAngle;
|
|
191
|
+
revolute.lowerAngle = -revolute.upperAngle;
|
|
192
|
+
revolute.upperAngle = -lower;
|
|
193
|
+
revolute.referenceAngle = -revolute.referenceAngle;
|
|
194
|
+
revolute.motorSpeed = -revolute.motorSpeed;
|
|
195
|
+
revolute.motorImpulse = -revolute.motorImpulse;
|
|
196
|
+
return true;
|
|
197
|
+
},
|
|
198
|
+
prepare(world, joint, dt) {
|
|
199
|
+
const revolute = joint;
|
|
200
|
+
const bodyA = findPhysics2DBody(world, joint.bodyA);
|
|
201
|
+
const bodyB = findPhysics2DBody(world, joint.bodyB);
|
|
202
|
+
if (bodyA === null || bodyB === null)
|
|
203
|
+
return;
|
|
204
|
+
writeJointAnchors(bodyA, bodyB, joint);
|
|
205
|
+
const errorX = bodyB.x + joint.rBX - (bodyA.x + joint.rAX);
|
|
206
|
+
const errorY = bodyB.y + joint.rBY - (bodyA.y + joint.rAY);
|
|
207
|
+
// The angular constraints share one effective mass: the pair's combined resistance to a relative
|
|
208
|
+
// spin. Zero when neither body can rotate, which disables motor and limits rather than dividing
|
|
209
|
+
// by zero.
|
|
210
|
+
const inverseInertiaSum = bodyA.inverseInertia + bodyB.inverseInertia;
|
|
211
|
+
const angularMass = inverseInertiaSum > 0 ? 1 / inverseInertiaSum : 0;
|
|
212
|
+
writeJointState(joint, [
|
|
213
|
+
errorX * (BAUMGARTE / dt),
|
|
214
|
+
errorY * (BAUMGARTE / dt),
|
|
215
|
+
angularMass,
|
|
216
|
+
0,
|
|
217
|
+
0,
|
|
218
|
+
dt * revolute.maxMotorTorque,
|
|
219
|
+
1 / dt,
|
|
220
|
+
]);
|
|
221
|
+
},
|
|
222
|
+
solve(world, joint) {
|
|
223
|
+
const revolute = joint;
|
|
224
|
+
const state = jointStateScratch.get(joint);
|
|
225
|
+
if (state === undefined)
|
|
226
|
+
return;
|
|
227
|
+
const bodyA = findPhysics2DBody(world, joint.bodyA);
|
|
228
|
+
const bodyB = findPhysics2DBody(world, joint.bodyB);
|
|
229
|
+
if (bodyA === null || bodyB === null)
|
|
230
|
+
return;
|
|
231
|
+
const angularMass = state[2];
|
|
232
|
+
if (angularMass > 0) {
|
|
233
|
+
// Motor first: it is a soft target the limits are allowed to override, so solving it before the
|
|
234
|
+
// limits lets a limit's impulse win in the same iteration when they disagree.
|
|
235
|
+
if (revolute.enableMotor) {
|
|
236
|
+
const maxMotorImpulse = state[5];
|
|
237
|
+
const relative = bodyB.angularVelocity - bodyA.angularVelocity - revolute.motorSpeed;
|
|
238
|
+
const desired = -angularMass * relative;
|
|
239
|
+
const previous = revolute.motorImpulse;
|
|
240
|
+
// Clamped on the ACCUMULATED impulse against torque * dt, so the bound is a torque and not a
|
|
241
|
+
// per-iteration one that would scale with the iteration count.
|
|
242
|
+
const total = Math.min(Math.max(previous + desired, -maxMotorImpulse), maxMotorImpulse);
|
|
243
|
+
revolute.motorImpulse = total;
|
|
244
|
+
const applied = total - previous;
|
|
245
|
+
bodyA.angularVelocity -= bodyA.inverseInertia * applied;
|
|
246
|
+
bodyB.angularVelocity += bodyB.inverseInertia * applied;
|
|
247
|
+
}
|
|
248
|
+
if (revolute.enableLimit) {
|
|
249
|
+
const bias = state[6];
|
|
250
|
+
const angle = bodyB.angle - bodyA.angle - revolute.referenceAngle;
|
|
251
|
+
// Each end is a one-sided constraint: it may only push the angle back inside the interval,
|
|
252
|
+
// never pull it in. Two things make that true together. The non-negative clamp on the running
|
|
253
|
+
// impulse means a limit can push and never pull. And the bias is the REMAINING ROOM to the
|
|
254
|
+
// bound, max(C, 0) / dt, not the violation depth: while the angle is inside the interval that
|
|
255
|
+
// room is large and positive, which drives the desired impulse negative, so the clamp holds
|
|
256
|
+
// the accumulator at zero and the limit contributes nothing.
|
|
257
|
+
//
|
|
258
|
+
// Using the violation depth instead — min(C, 0) — zeroes the bias while inside the interval,
|
|
259
|
+
// and the upper end then reads a positive desired impulse against any forward rotation and
|
|
260
|
+
// brakes it to a standstill. Measured while building this: a motor at speed 5 held the arm at
|
|
261
|
+
// exactly zero, spending its whole torque budget every step against a limit it was nowhere
|
|
262
|
+
// near.
|
|
263
|
+
const lowerError = angle - revolute.lowerAngle;
|
|
264
|
+
const lowerDesired = -angularMass * (bodyB.angularVelocity - bodyA.angularVelocity + Math.max(lowerError, 0) * bias);
|
|
265
|
+
const lowerPrevious = state[3];
|
|
266
|
+
const lowerTotal = Math.max(lowerPrevious + lowerDesired, 0);
|
|
267
|
+
state[3] = lowerTotal;
|
|
268
|
+
const lowerApplied = lowerTotal - lowerPrevious;
|
|
269
|
+
bodyA.angularVelocity -= bodyA.inverseInertia * lowerApplied;
|
|
270
|
+
bodyB.angularVelocity += bodyB.inverseInertia * lowerApplied;
|
|
271
|
+
const upperError = revolute.upperAngle - angle;
|
|
272
|
+
const upperDesired = -angularMass * (bodyA.angularVelocity - bodyB.angularVelocity + Math.max(upperError, 0) * bias);
|
|
273
|
+
const upperPrevious = state[4];
|
|
274
|
+
const upperTotal = Math.max(upperPrevious + upperDesired, 0);
|
|
275
|
+
state[4] = upperTotal;
|
|
276
|
+
const upperApplied = upperTotal - upperPrevious;
|
|
277
|
+
bodyA.angularVelocity += bodyA.inverseInertia * upperApplied;
|
|
278
|
+
bodyB.angularVelocity -= bodyB.inverseInertia * upperApplied;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
solvePointConstraint(bodyA, bodyB, joint, state[0], state[1]);
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
// An inequality constraint that acts only at full extension. Slack within `maxLength`, caught at it.
|
|
285
|
+
//
|
|
286
|
+
// The non-negative clamp on the accumulated impulse is what makes it a rope rather than a stiff bar: a
|
|
287
|
+
// rope may pull the bodies together and may never push them apart.
|
|
288
|
+
export const physics2DRopeJointSolver = {
|
|
289
|
+
warmStart(world, joint) {
|
|
290
|
+
const state = jointStateScratch.get(joint);
|
|
291
|
+
if (state === undefined)
|
|
292
|
+
return;
|
|
293
|
+
const bodyA = findPhysics2DBody(world, joint.bodyA);
|
|
294
|
+
const bodyB = findPhysics2DBody(world, joint.bodyB);
|
|
295
|
+
if (bodyA === null || bodyB === null)
|
|
296
|
+
return;
|
|
297
|
+
applyPhysics2DImpulse(bodyA, bodyB, joint.rAX, joint.rAY, joint.rBX, joint.rBY, -joint.impulse0 * state[3], -joint.impulse0 * state[4]);
|
|
298
|
+
},
|
|
299
|
+
clearAccumulatedImpulses(joint) {
|
|
300
|
+
joint.impulse0 = 0;
|
|
301
|
+
},
|
|
302
|
+
prepare(world, joint, dt) {
|
|
303
|
+
const rope = joint;
|
|
304
|
+
const bodyA = findPhysics2DBody(world, joint.bodyA);
|
|
305
|
+
const bodyB = findPhysics2DBody(world, joint.bodyB);
|
|
306
|
+
if (bodyA === null || bodyB === null)
|
|
307
|
+
return;
|
|
308
|
+
writeJointAnchors(bodyA, bodyB, joint);
|
|
309
|
+
const axisX = bodyB.x + joint.rBX - (bodyA.x + joint.rAX);
|
|
310
|
+
const axisY = bodyB.y + joint.rBY - (bodyA.y + joint.rAY);
|
|
311
|
+
const length = Math.sqrt(axisX * axisX + axisY * axisY);
|
|
312
|
+
const unitX = length > EPSILON ? axisX / length : 1;
|
|
313
|
+
const unitY = length > EPSILON ? axisY / length : 0;
|
|
314
|
+
const mass = axisEffectiveMass(bodyA, bodyB, joint, unitX, unitY);
|
|
315
|
+
const excess = length - rope.maxLength;
|
|
316
|
+
// Slack: no constraint at all this step, which is what a rope IS. Marked by a zero effective mass so
|
|
317
|
+
// the iterations skip it without a second flag to keep in sync.
|
|
318
|
+
const active = excess > 0;
|
|
319
|
+
writeJointState(rope, [active && mass > 0 ? 1 / mass : 0, active ? excess * (BAUMGARTE / dt) : 0, 0, unitX, unitY]);
|
|
320
|
+
if (!active)
|
|
321
|
+
joint.impulse0 = 0;
|
|
322
|
+
},
|
|
323
|
+
solve(world, joint) {
|
|
324
|
+
const state = jointStateScratch.get(joint);
|
|
325
|
+
if (state === undefined || state[0] === 0)
|
|
326
|
+
return;
|
|
327
|
+
const bodyA = findPhysics2DBody(world, joint.bodyA);
|
|
328
|
+
const bodyB = findPhysics2DBody(world, joint.bodyB);
|
|
329
|
+
if (bodyA === null || bodyB === null)
|
|
330
|
+
return;
|
|
331
|
+
const [effectiveMass, bias, , axisX, axisY] = state;
|
|
332
|
+
const velocity = axisRelativeVelocity(bodyA, bodyB, joint, axisX, axisY);
|
|
333
|
+
let lambda = -effectiveMass * (velocity + bias);
|
|
334
|
+
const previous = joint.impulse0;
|
|
335
|
+
joint.impulse0 = Math.min(0, previous + lambda);
|
|
336
|
+
lambda = joint.impulse0 - previous;
|
|
337
|
+
applyPhysics2DImpulse(bodyA, bodyB, joint.rAX, joint.rAY, joint.rBX, joint.rBY, -lambda * axisX, -lambda * axisY);
|
|
338
|
+
},
|
|
339
|
+
};
|
|
340
|
+
// Pins the anchors together and locks the relative angle — rigid attachment.
|
|
341
|
+
//
|
|
342
|
+
// The point constraint plus one angular constraint. It is solved rather than exact, so it flexes under
|
|
343
|
+
// enough load; a truly rigid attachment is one body with two colliders, and the difference is that a weld
|
|
344
|
+
// can be broken at runtime.
|
|
345
|
+
// Weld holds the pair at a fixed relative angle, measured from bodyA to bodyB, so exchanging the ends
|
|
346
|
+
// reverses that measurement and the stored reference angle must be negated with them. It is the only
|
|
347
|
+
// direction-bearing field any solver reads today: revolute declares one but does not yet read it, and
|
|
348
|
+
// prismatic has no solver at all, so their transforms land with the work that makes them live.
|
|
349
|
+
export const physics2DWeldJointSolver = {
|
|
350
|
+
warmStart(world, joint) {
|
|
351
|
+
const bodyA = findPhysics2DBody(world, joint.bodyA);
|
|
352
|
+
const bodyB = findPhysics2DBody(world, joint.bodyB);
|
|
353
|
+
if (bodyA === null || bodyB === null)
|
|
354
|
+
return;
|
|
355
|
+
applyPhysics2DImpulse(bodyA, bodyB, joint.rAX, joint.rAY, joint.rBX, joint.rBY, -joint.impulse0, -joint.impulse1);
|
|
356
|
+
bodyA.angularVelocity -= bodyA.inverseInertia * joint.impulse2;
|
|
357
|
+
bodyB.angularVelocity += bodyB.inverseInertia * joint.impulse2;
|
|
358
|
+
},
|
|
359
|
+
clearAccumulatedImpulses(joint) {
|
|
360
|
+
joint.impulse0 = 0;
|
|
361
|
+
joint.impulse1 = 0;
|
|
362
|
+
joint.impulse2 = 0;
|
|
363
|
+
},
|
|
364
|
+
swapEnds(joint) {
|
|
365
|
+
const weld = joint;
|
|
366
|
+
weld.referenceAngle = -weld.referenceAngle;
|
|
367
|
+
return true;
|
|
368
|
+
},
|
|
369
|
+
prepare(world, joint, dt) {
|
|
370
|
+
const weld = joint;
|
|
371
|
+
const bodyA = findPhysics2DBody(world, joint.bodyA);
|
|
372
|
+
const bodyB = findPhysics2DBody(world, joint.bodyB);
|
|
373
|
+
if (bodyA === null || bodyB === null)
|
|
374
|
+
return;
|
|
375
|
+
writeJointAnchors(bodyA, bodyB, joint);
|
|
376
|
+
const errorX = bodyB.x + joint.rBX - (bodyA.x + joint.rAX);
|
|
377
|
+
const errorY = bodyB.y + joint.rBY - (bodyA.y + joint.rAY);
|
|
378
|
+
const angleError = bodyB.angle - bodyA.angle - weld.referenceAngle;
|
|
379
|
+
const angularMass = bodyA.inverseInertia + bodyB.inverseInertia;
|
|
380
|
+
writeJointState(weld, [
|
|
381
|
+
errorX * (BAUMGARTE / dt),
|
|
382
|
+
errorY * (BAUMGARTE / dt),
|
|
383
|
+
angleError * (BAUMGARTE / dt),
|
|
384
|
+
angularMass > 0 ? 1 / angularMass : 0,
|
|
385
|
+
0,
|
|
386
|
+
]);
|
|
387
|
+
},
|
|
388
|
+
solve(world, joint) {
|
|
389
|
+
const state = jointStateScratch.get(joint);
|
|
390
|
+
if (state === undefined)
|
|
391
|
+
return;
|
|
392
|
+
const bodyA = findPhysics2DBody(world, joint.bodyA);
|
|
393
|
+
const bodyB = findPhysics2DBody(world, joint.bodyB);
|
|
394
|
+
if (bodyA === null || bodyB === null)
|
|
395
|
+
return;
|
|
396
|
+
const angularVelocity = bodyB.angularVelocity - bodyA.angularVelocity;
|
|
397
|
+
const angularLambda = -state[3] * (angularVelocity + state[2]);
|
|
398
|
+
joint.impulse2 += angularLambda;
|
|
399
|
+
bodyA.angularVelocity -= bodyA.inverseInertia * angularLambda;
|
|
400
|
+
bodyB.angularVelocity += bodyB.inverseInertia * angularLambda;
|
|
401
|
+
solvePointConstraint(bodyA, bodyB, joint, state[0], state[1]);
|
|
402
|
+
},
|
|
403
|
+
};
|
|
404
|
+
// The shared two-axis point solve behind revolute and weld. Each axis is solved against the velocities the
|
|
405
|
+
// other just left, which is the sequential-impulse property doing its job within one constraint.
|
|
406
|
+
function solvePointConstraint(bodyA, bodyB, joint, biasX, biasY) {
|
|
407
|
+
const massX = axisEffectiveMass(bodyA, bodyB, joint, 1, 0);
|
|
408
|
+
const velocityX = axisRelativeVelocity(bodyA, bodyB, joint, 1, 0);
|
|
409
|
+
const lambdaX = massX > 0 ? -(velocityX + biasX) / massX : 0;
|
|
410
|
+
joint.impulse0 += lambdaX;
|
|
411
|
+
applyPhysics2DImpulse(bodyA, bodyB, joint.rAX, joint.rAY, joint.rBX, joint.rBY, -lambdaX, 0);
|
|
412
|
+
const massY = axisEffectiveMass(bodyA, bodyB, joint, 0, 1);
|
|
413
|
+
const velocityY = axisRelativeVelocity(bodyA, bodyB, joint, 0, 1);
|
|
414
|
+
const lambdaY = massY > 0 ? -(velocityY + biasY) / massY : 0;
|
|
415
|
+
joint.impulse1 += lambdaY;
|
|
416
|
+
applyPhysics2DImpulse(bodyA, bodyB, joint.rAX, joint.rAY, joint.rBX, joint.rBY, 0, -lambdaY);
|
|
417
|
+
}
|
|
418
|
+
// Rotates each body's local anchor into world space, relative to that body's centre of mass — the lever
|
|
419
|
+
// arm every joint impulse acts through.
|
|
420
|
+
function writeJointAnchors(bodyA, bodyB, joint) {
|
|
421
|
+
const cosA = Math.cos(bodyA.angle);
|
|
422
|
+
const sinA = Math.sin(bodyA.angle);
|
|
423
|
+
const cosB = Math.cos(bodyB.angle);
|
|
424
|
+
const sinB = Math.sin(bodyB.angle);
|
|
425
|
+
joint.rAX = (joint.localAnchorAX - bodyA.centerX) * cosA - (joint.localAnchorAY - bodyA.centerY) * sinA;
|
|
426
|
+
joint.rAY = (joint.localAnchorAX - bodyA.centerX) * sinA + (joint.localAnchorAY - bodyA.centerY) * cosA;
|
|
427
|
+
joint.rBX = (joint.localAnchorBX - bodyB.centerX) * cosB - (joint.localAnchorBY - bodyB.centerY) * sinB;
|
|
428
|
+
joint.rBY = (joint.localAnchorBX - bodyB.centerX) * sinB + (joint.localAnchorBY - bodyB.centerY) * cosB;
|
|
429
|
+
}
|
|
430
|
+
// The pair's inverse effective mass along `axis` at the joint anchors — the same quantity a contact
|
|
431
|
+
// constraint uses, over the joint's lever arms instead of a contact point's.
|
|
432
|
+
function axisEffectiveMass(bodyA, bodyB, joint, axisX, axisY) {
|
|
433
|
+
const crossA = joint.rAX * axisY - joint.rAY * axisX;
|
|
434
|
+
const crossB = joint.rBX * axisY - joint.rBY * axisX;
|
|
435
|
+
return (bodyA.inverseMass +
|
|
436
|
+
bodyB.inverseMass +
|
|
437
|
+
bodyA.inverseInertia * crossA * crossA +
|
|
438
|
+
bodyB.inverseInertia * crossB * crossB);
|
|
439
|
+
}
|
|
440
|
+
function axisRelativeVelocity(bodyA, bodyB, joint, axisX, axisY) {
|
|
441
|
+
const vax = bodyA.velocityX - bodyA.angularVelocity * joint.rAY;
|
|
442
|
+
const vay = bodyA.velocityY + bodyA.angularVelocity * joint.rAX;
|
|
443
|
+
const vbx = bodyB.velocityX - bodyB.angularVelocity * joint.rBY;
|
|
444
|
+
const vby = bodyB.velocityY + bodyB.angularVelocity * joint.rBX;
|
|
445
|
+
// B relative to A, the same sense as the positional error the bias is built from, so a positive value
|
|
446
|
+
// means the pair is separating along this axis. The contact solver measures the OPPOSITE sense, because
|
|
447
|
+
// its normal points the other way. Mixing the two is not a sign slip that shows up as a small error: the
|
|
448
|
+
// correction then adds to the violation instead of cancelling it, every iteration compounds it, and the
|
|
449
|
+
// bodies leave the world within one step.
|
|
450
|
+
return (vbx - vax) * axisX + (vby - vay) * axisY;
|
|
451
|
+
}
|
|
452
|
+
// Fills this joint's per-step state in place, allocating the array only the first time the joint is
|
|
453
|
+
// prepared. Every solver rebuilds its whole block each step, so the array is pure scratch and reusing it
|
|
454
|
+
// costs nothing — but allocating a fresh one per joint per step made the step's allocation profile scale
|
|
455
|
+
// with the joint count, which is exactly the hidden per-frame allocation the package's own charter
|
|
456
|
+
// forbids.
|
|
457
|
+
function writeJointState(joint, values) {
|
|
458
|
+
let state = jointStateScratch.get(joint);
|
|
459
|
+
if (state === undefined) {
|
|
460
|
+
state = [];
|
|
461
|
+
jointStateScratch.set(joint, state);
|
|
462
|
+
}
|
|
463
|
+
state.length = values.length;
|
|
464
|
+
for (let i = 0; i < values.length; i++)
|
|
465
|
+
state[i] = values[i];
|
|
466
|
+
}
|
|
467
|
+
// Per-step solver state, keyed by joint. A Map rather than fields on the joint because the numbers each
|
|
468
|
+
// solver needs mean different things per kind, and putting a fixed block of untyped scratch on the
|
|
469
|
+
// public entity would make the header describe the solver's internals.
|
|
470
|
+
//
|
|
471
|
+
// Mutable, because a one-sided constraint accumulates its impulse ACROSS the velocity iterations of a
|
|
472
|
+
// single step: the revolute limits clamp their running totals to stay non-negative, which is what makes
|
|
473
|
+
// them limits rather than springs, and that total has to live somewhere between iterations.
|
|
474
|
+
//
|
|
475
|
+
// A WeakMap, not a Map. A module-global strong Map keyed by joint retains every joint ever prepared for
|
|
476
|
+
// the lifetime of the module: removing a joint from a world drops the world's reference but not this
|
|
477
|
+
// one, so the joint, its bodies' indices, and its state array all stay reachable forever. There is no
|
|
478
|
+
// deletion hook to forget either, because a joint can leave a world without this module being told.
|
|
479
|
+
// Keying weakly makes the retention question disappear rather than answering it — the entry goes when
|
|
480
|
+
// the joint does, at every exit path, including ones nobody has written yet.
|
|
481
|
+
const jointStateScratch = new WeakMap();
|
|
482
|
+
const axisScratch = [0, 0];
|
|
483
|
+
const jointScratch = [0, 0, 0];
|
|
484
|
+
const EPSILON = 1e-9;
|
|
485
|
+
// The fraction of a joint's positional error corrected per step. Matches the contact solver's rationale:
|
|
486
|
+
// correcting all of it at once turns a deep error into an explosion.
|
|
487
|
+
const BAUMGARTE = 0.2;
|
|
488
|
+
//# sourceMappingURL=joints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"joints.js","sourceRoot":"","sources":["../src/joints.ts"],"names":[],"mappings":"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"}
|
package/dist/solver.d.ts
CHANGED
|
@@ -2,5 +2,6 @@ import type { Physics2DContactPoint, Physics2DWorld, RigidBody2D } from '@flight
|
|
|
2
2
|
export declare function applyPhysics2DImpulse(bodyA: RigidBody2D, bodyB: RigidBody2D, rAX: number, rAY: number, rBX: number, rBY: number, impulseX: number, impulseY: number): void;
|
|
3
3
|
export declare function relativeNormalVelocity(bodyA: Readonly<RigidBody2D>, bodyB: Readonly<RigidBody2D>, point: Readonly<Physics2DContactPoint>, normalX: number, normalY: number): number;
|
|
4
4
|
export declare function solvePhysics2DContacts(world: Physics2DWorld): void;
|
|
5
|
+
export declare function solvePhysics2DContactsOnce(world: Physics2DWorld): void;
|
|
5
6
|
export declare function warmStartPhysics2DContacts(world: Physics2DWorld): void;
|
|
6
7
|
//# sourceMappingURL=solver.d.ts.map
|
package/dist/solver.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solver.d.ts","sourceRoot":"","sources":["../src/solver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,qBAAqB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAarH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,IAAI,CAON;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,EAC5B,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,EAC5B,KAAK,EAAE,QAAQ,CAAC,qBAAqB,CAAC,EACtC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,MAAM,CAMR;AAyED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"solver.d.ts","sourceRoot":"","sources":["../src/solver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,qBAAqB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAarH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,IAAI,CAON;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,EAC5B,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,EAC5B,KAAK,EAAE,QAAQ,CAAC,qBAAqB,CAAC,EACtC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,MAAM,CAMR;AAyED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAGlE;AAKD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAQtE;AAYD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAmBtE"}
|
package/dist/solver.js
CHANGED
|
@@ -65,16 +65,21 @@ function solvePhysics2DContact(contact, bodyA, bodyB) {
|
|
|
65
65
|
// non-negative, which is the difference between a stable stack and one that vibrates.
|
|
66
66
|
export function solvePhysics2DContacts(world) {
|
|
67
67
|
const iterations = world.config.velocityIterations;
|
|
68
|
-
for (let iteration = 0; iteration < iterations; iteration++)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
68
|
+
for (let iteration = 0; iteration < iterations; iteration++)
|
|
69
|
+
solvePhysics2DContactsOnce(world);
|
|
70
|
+
}
|
|
71
|
+
// One pass over the contact list. Split out so the step can interleave it with the joint pass inside a
|
|
72
|
+
// single iteration loop: joints and contacts constrain the same bodies, and giving either a whole pass to
|
|
73
|
+
// itself lets it undo what the other just corrected.
|
|
74
|
+
export function solvePhysics2DContactsOnce(world) {
|
|
75
|
+
for (const contact of world.contacts) {
|
|
76
|
+
if (contact.sensor)
|
|
77
|
+
continue;
|
|
78
|
+
const bodyA = findPhysics2DBody(world, contact.bodyA);
|
|
79
|
+
const bodyB = findPhysics2DBody(world, contact.bodyB);
|
|
80
|
+
if (bodyA === null || bodyB === null)
|
|
81
|
+
continue;
|
|
82
|
+
solvePhysics2DContact(contact, bodyA, bodyB);
|
|
78
83
|
}
|
|
79
84
|
}
|
|
80
85
|
// Applies each contact's cached impulses before the first iteration — the warm start.
|
package/dist/solver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solver.js","sourceRoot":"","sources":["../src/solver.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"solver.js","sourceRoot":"","sources":["../src/solver.ts"],"names":[],"mappings":"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"}
|
package/dist/step.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../src/step.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAIV,cAAc,EAIf,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../src/step.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAIV,cAAc,EAIf,MAAM,0BAA0B,CAAC;AA2SlC,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CA+DrE"}
|