@aura3d/physics 1.5.2 → 2.0.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 (81) hide show
  1. package/dist/ArcadeCharacterController.d.ts +53 -0
  2. package/dist/ArcadeCharacterController.d.ts.map +1 -0
  3. package/dist/ArcadeCharacterController.js +98 -0
  4. package/dist/ArcadeCharacterController.js.map +1 -0
  5. package/dist/ArcadeVehicleTelemetry.d.ts +162 -0
  6. package/dist/ArcadeVehicleTelemetry.d.ts.map +1 -0
  7. package/dist/ArcadeVehicleTelemetry.js +363 -0
  8. package/dist/ArcadeVehicleTelemetry.js.map +1 -0
  9. package/dist/CharacterController.d.ts +52 -0
  10. package/dist/CharacterController.d.ts.map +1 -1
  11. package/dist/CharacterController.js +380 -7
  12. package/dist/CharacterController.js.map +1 -1
  13. package/dist/Constraint.d.ts +20 -4
  14. package/dist/Constraint.d.ts.map +1 -1
  15. package/dist/Constraint.js +34 -60
  16. package/dist/Constraint.js.map +1 -1
  17. package/dist/FightingCharacterController.d.ts +32 -0
  18. package/dist/FightingCharacterController.d.ts.map +1 -0
  19. package/dist/FightingCharacterController.js +76 -0
  20. package/dist/FightingCharacterController.js.map +1 -0
  21. package/dist/MeshBVH.d.ts +72 -0
  22. package/dist/MeshBVH.d.ts.map +1 -0
  23. package/dist/MeshBVH.js +244 -0
  24. package/dist/MeshBVH.js.map +1 -0
  25. package/dist/PathFollowDriver.d.ts +162 -0
  26. package/dist/PathFollowDriver.d.ts.map +1 -0
  27. package/dist/PathFollowDriver.js +163 -0
  28. package/dist/PathFollowDriver.js.map +1 -0
  29. package/dist/PhysicsDebugDraw.d.ts +40 -1
  30. package/dist/PhysicsDebugDraw.d.ts.map +1 -1
  31. package/dist/PhysicsDebugDraw.js +87 -17
  32. package/dist/PhysicsDebugDraw.js.map +1 -1
  33. package/dist/PhysicsWorld.d.ts +37 -18
  34. package/dist/PhysicsWorld.d.ts.map +1 -1
  35. package/dist/PhysicsWorld.js +231 -630
  36. package/dist/PhysicsWorld.js.map +1 -1
  37. package/dist/RacingLineProfile.d.ts +116 -0
  38. package/dist/RacingLineProfile.d.ts.map +1 -0
  39. package/dist/RacingLineProfile.js +181 -0
  40. package/dist/RacingLineProfile.js.map +1 -0
  41. package/dist/Raycast.d.ts +11 -0
  42. package/dist/Raycast.d.ts.map +1 -1
  43. package/dist/Raycast.js +62 -8
  44. package/dist/Raycast.js.map +1 -1
  45. package/dist/RigidBody.d.ts +16 -9
  46. package/dist/RigidBody.d.ts.map +1 -1
  47. package/dist/RigidBody.js +23 -75
  48. package/dist/RigidBody.js.map +1 -1
  49. package/dist/SurfaceQuery.d.ts +72 -0
  50. package/dist/SurfaceQuery.d.ts.map +1 -0
  51. package/dist/SurfaceQuery.js +89 -0
  52. package/dist/SurfaceQuery.js.map +1 -0
  53. package/dist/VehicleDynamics.d.ts +10 -0
  54. package/dist/VehicleDynamics.d.ts.map +1 -1
  55. package/dist/VehicleDynamics.js +31 -3
  56. package/dist/VehicleDynamics.js.map +1 -1
  57. package/dist/VehicleMotion.d.ts +125 -0
  58. package/dist/VehicleMotion.d.ts.map +1 -0
  59. package/dist/VehicleMotion.js +373 -0
  60. package/dist/VehicleMotion.js.map +1 -0
  61. package/dist/index.d.ts +62 -17
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +70 -17
  64. package/dist/index.js.map +1 -1
  65. package/dist/solverless-entry.d.ts +41 -0
  66. package/dist/solverless-entry.d.ts.map +1 -0
  67. package/dist/solverless-entry.js +40 -0
  68. package/dist/solverless-entry.js.map +1 -0
  69. package/dist/solverless.d.ts +37 -0
  70. package/dist/solverless.d.ts.map +1 -0
  71. package/dist/solverless.js +36 -0
  72. package/dist/solverless.js.map +1 -0
  73. package/dist/world-entry.d.ts +31 -0
  74. package/dist/world-entry.d.ts.map +1 -0
  75. package/dist/world-entry.js +30 -0
  76. package/dist/world-entry.js.map +1 -0
  77. package/dist/world.d.ts +18 -0
  78. package/dist/world.d.ts.map +1 -0
  79. package/dist/world.js +17 -0
  80. package/dist/world.js.map +1 -0
  81. package/package.json +10 -2
@@ -0,0 +1,363 @@
1
+ export function sampleArcadeVehicleTelemetry(input) {
2
+ const elapsed = finiteNonNegative(input.elapsedSeconds, "elapsedSeconds");
3
+ const throttle = clamp(input.throttle ?? 1, -1, 1);
4
+ const brake = clamp(input.brake ?? 0, 0, 1);
5
+ const steer = clamp(input.steer ?? 0, -1, 1);
6
+ const maxSpeedKph = positive(input.maxSpeedKph ?? 220, "maxSpeedKph");
7
+ const acceleration = positive(input.acceleration ?? 9.5, "acceleration");
8
+ const brakeForce = positive(input.brakeForce ?? 14, "brakeForce");
9
+ const gripFactor = clamp(input.gripFactor ?? 0.82, 0, 1);
10
+ const driftFactor = clamp(input.driftFactor ?? 0.36, 0, 1);
11
+ const maxSpeedMps = maxSpeedKph / 3.6;
12
+ const accelerationCurve = 1 - Math.exp(-elapsed * acceleration / Math.max(1, maxSpeedMps));
13
+ const braking = Math.min(maxSpeedMps, brakeForce * brake * Math.min(elapsed, 4));
14
+ const nitroAvailable = Math.max(0, 100 - elapsed * 10.5);
15
+ const nitroBoost = input.nitro === true && nitroAvailable > 0 ? 1.18 : 1;
16
+ const signedSpeedMps = clamp((maxSpeedMps * accelerationCurve * throttle * nitroBoost) - braking, -maxSpeedMps * 0.32, maxSpeedMps * nitroBoost);
17
+ const speedRatio = Math.min(1, Math.abs(signedSpeedMps) / maxSpeedMps);
18
+ const highSpeedSteerLimit = 1 - speedRatio * 0.55;
19
+ const steerAngle = steer * 0.62 * highSpeedSteerLimit;
20
+ const handbrakeSlip = input.handbrake === true ? driftFactor * (0.45 + speedRatio * 0.55) : 0;
21
+ const steeringSlip = Math.abs(steer) * speedRatio * (1 - gripFactor) * 0.75;
22
+ const driftSlip = clamp(handbrakeSlip + steeringSlip, 0, 1);
23
+ const grip = clamp(gripFactor * (1 - driftSlip * 0.62), 0, 1);
24
+ const rpm = 1000 + speedRatio * 6100 + (input.nitro === true ? 650 : 0) + driftSlip * 450;
25
+ const wheelSpin = elapsed * Math.abs(signedSpeedMps) * (1 + driftSlip * 1.8);
26
+ const suspensionCompression = suspensionFor(steer, speedRatio, driftSlip);
27
+ return {
28
+ speedKph: Number((signedSpeedMps * 3.6).toFixed(3)),
29
+ rpm: Number(rpm.toFixed(3)),
30
+ nitro: Number(nitroAvailable.toFixed(3)),
31
+ steerAngle: Number(steerAngle.toFixed(5)),
32
+ driftSlip: Number(driftSlip.toFixed(5)),
33
+ grip: Number(grip.toFixed(5)),
34
+ wheelSpin: Number(wheelSpin.toFixed(5)),
35
+ suspensionCompression
36
+ };
37
+ }
38
+ export function sampleVehicleDamage(input) {
39
+ const health = clamp(finiteNonNegative(input.health ?? 100, "health"), 0, 100);
40
+ const impactSpeedKph = finiteNonNegative(input.impactSpeedKph ?? 0, "impactSpeedKph");
41
+ const collisionSeverity = clamp(input.collisionSeverity ?? 0, 0, 1);
42
+ const repair = clamp(input.repair ?? 0, 0, 100);
43
+ const impactDamage = Math.max(0, (impactSpeedKph - 18) * 0.34 * collisionSeverity);
44
+ const nextHealth = clamp(health - impactDamage + repair, 0, 100);
45
+ const damage = 100 - nextHealth;
46
+ return {
47
+ health: Number(nextHealth.toFixed(3)),
48
+ damage: Number(damage.toFixed(3)),
49
+ impactDamage: Number(impactDamage.toFixed(3)),
50
+ visualDamageLevel: damage >= 72 ? "critical" : damage >= 42 ? "dented" : damage > 0 ? "scratched" : "none",
51
+ disabled: nextHealth <= 0
52
+ };
53
+ }
54
+ export function sampleVehicleEffectEmitters(input) {
55
+ const speedKph = finiteNonNegative(input.speedKph, "speedKph");
56
+ const throttle = clamp(input.throttle ?? 0, -1, 1);
57
+ const steer = clamp(input.steer ?? 0, -1, 1);
58
+ const wheelOnGround = input.wheelOnGround ?? [true, true, true, true];
59
+ const smokeReason = input.handbrake === true
60
+ ? "handbrake"
61
+ : Math.abs(throttle) > 0.7 && speedKph < 30
62
+ ? "launch-wheelspin"
63
+ : Math.abs(steer) > 0.7 && speedKph > 50
64
+ ? "high-speed-steer"
65
+ : "none";
66
+ const baseSmokeRate = smokeReason === "none" ? 0 : smokeReason === "handbrake" ? 64 : smokeReason === "launch-wheelspin" ? 46 : 38;
67
+ const tireSmokeRates = wheelOnGround.map((onGround, index) => {
68
+ const rearBias = index >= 2 ? 1.18 : 0.86;
69
+ return onGround ? Number((baseSmokeRate * rearBias).toFixed(3)) : 0;
70
+ });
71
+ const nitroFlameRate = input.nitroActive === true ? Number((160 + Math.abs(throttle) * 80).toFixed(3)) : 0;
72
+ const totalTireSmokeRate = Number(tireSmokeRates.reduce((sum, rate) => sum + rate, 0).toFixed(3));
73
+ return {
74
+ tireSmokeRates,
75
+ totalTireSmokeRate,
76
+ nitroFlameRate,
77
+ visibleEffectEmitters: tireSmokeRates.filter((rate) => rate > 0).length + (nitroFlameRate > 0 ? 1 : 0),
78
+ smokeReason
79
+ };
80
+ }
81
+ export function sampleVehicleDrivetrain(input) {
82
+ const speedKph = finiteNonNegative(input.speedKph, "speedKph");
83
+ const throttle = clamp(input.throttle ?? 1, 0, 1);
84
+ const clutch = clamp(input.clutch ?? 1, 0, 1);
85
+ const gearRatios = validateGearRatios(input.gearRatios ?? [3.42, 2.21, 1.52, 1.14, 0.89, 0.71]);
86
+ const finalDriveRatio = positive(input.finalDriveRatio ?? 3.55, "finalDriveRatio");
87
+ const idleRpm = positive(input.idleRpm ?? 950, "idleRpm");
88
+ const maxRpm = Math.max(idleRpm + 1, positive(input.maxRpm ?? 7200, "maxRpm"));
89
+ const peakTorque = positive(input.peakTorque ?? 420, "peakTorque");
90
+ const peakTorqueRpm = clamp(positive(input.peakTorqueRpm ?? 4200, "peakTorqueRpm"), idleRpm, maxRpm);
91
+ const upshiftRpm = clamp(input.upshiftRpm ?? maxRpm * 0.86, idleRpm, maxRpm);
92
+ const downshiftRpm = clamp(input.downshiftRpm ?? peakTorqueRpm * 0.55, idleRpm, upshiftRpm);
93
+ const differential = input.differential ?? "limited-slip";
94
+ const frontRearSplit = clamp(input.frontRearSplit ?? 0.42, 0, 1);
95
+ const lockingFactor = clamp(input.lockingFactor ?? 0.35, 0, 1);
96
+ const dragCoefficient = positive(input.dragCoefficient ?? 0.32, "dragCoefficient");
97
+ const frontalArea = positive(input.frontalArea ?? 2.1, "frontalArea");
98
+ const downforceCoefficient = finiteNonNegative(input.downforceCoefficient ?? 0.58, "downforceCoefficient");
99
+ const speedMps = speedKph / 3.6;
100
+ const wheelRadius = 0.34;
101
+ const wheelRpm = speedMps <= 0 ? 0 : (speedMps / (Math.PI * 2 * wheelRadius)) * 60;
102
+ const selected = selectAutomaticGear(gearRatios, wheelRpm, finalDriveRatio, idleRpm, maxRpm, upshiftRpm, downshiftRpm);
103
+ const engineRpm = clamp(Math.max(idleRpm, wheelRpm * selected.ratio * finalDriveRatio), idleRpm, maxRpm);
104
+ const engineTorque = engineTorqueAt(engineRpm, peakTorque, peakTorqueRpm, idleRpm, maxRpm) * throttle;
105
+ const differentialEfficiency = differential === "open"
106
+ ? 0.92
107
+ : differential === "limited-slip"
108
+ ? 0.95 + lockingFactor * 0.025
109
+ : differential === "locked"
110
+ ? 0.96 + lockingFactor * 0.02
111
+ : 0.94 + lockingFactor * 0.04;
112
+ const wheelTorque = engineTorque * selected.ratio * finalDriveRatio * clutch * differentialEfficiency;
113
+ const torqueBias = differential === "open"
114
+ ? 0
115
+ : differential === "limited-slip"
116
+ ? lockingFactor * 0.04
117
+ : differential === "locked"
118
+ ? lockingFactor * 0.02
119
+ : lockingFactor * 0.06;
120
+ const frontSplit = clamp(frontRearSplit - torqueBias, 0, 1);
121
+ const dragForce = 0.5 * 1.225 * dragCoefficient * frontalArea * speedMps * speedMps;
122
+ const downforce = 0.5 * 1.225 * downforceCoefficient * frontalArea * speedMps * speedMps;
123
+ return {
124
+ gear: selected.gear,
125
+ gearRatio: Number(selected.ratio.toFixed(4)),
126
+ engineRpm: Number(engineRpm.toFixed(3)),
127
+ engineTorque: Number(engineTorque.toFixed(3)),
128
+ wheelTorque: Number(wheelTorque.toFixed(3)),
129
+ frontTorque: Number((wheelTorque * frontSplit).toFixed(3)),
130
+ rearTorque: Number((wheelTorque * (1 - frontSplit)).toFixed(3)),
131
+ dragForce: Number(dragForce.toFixed(3)),
132
+ downforce: Number(downforce.toFixed(3)),
133
+ shiftState: selected.shiftState,
134
+ differential
135
+ };
136
+ }
137
+ export function sampleRacingAiDriver(input) {
138
+ const elapsed = finiteNonNegative(input.elapsedSeconds, "elapsedSeconds");
139
+ const progress = clamp(finite(input.progress, "progress"), 0, 1);
140
+ const speedKph = finiteNonNegative(input.speedKph, "speedKph");
141
+ const targetSpeedKph = positive(input.targetSpeedKph ?? 220, "targetSpeedKph");
142
+ const curvature = clamp(input.trackCurvature ?? 0, -1, 1);
143
+ const opponentDistance = input.opponentDistance === undefined ? Number.POSITIVE_INFINITY : finiteNonNegative(input.opponentDistance, "opponentDistance");
144
+ const playerGapSeconds = finite(input.playerGapSeconds ?? 0, "playerGapSeconds");
145
+ const difficulty = input.difficulty ?? "medium";
146
+ const settings = racingAiSettings(difficulty);
147
+ const rubberbandBoost = clamp((-playerGapSeconds) * settings.rubberbandStrength * 0.08, -0.08, 0.18);
148
+ const desiredSpeed = targetSpeedKph * settings.targetSpeedFactor * (1 - Math.abs(curvature) * 0.24) * (1 + rubberbandBoost);
149
+ const speedError = desiredSpeed - speedKph;
150
+ const overtaking = input.opponentAhead === true && opponentDistance < 22 && settings.aggressiveness >= 0.55;
151
+ const deterministicSide = Math.sin((progress + elapsed * 0.13) * Math.PI * 6) >= 0 ? 1 : -1;
152
+ const overtakeOffset = overtaking ? deterministicSide * (0.28 + settings.aggressiveness * 0.18) : 0;
153
+ const racingLineSteer = Math.sin(progress * Math.PI * 2) * 0.18 + curvature * 0.62;
154
+ const rawSteer = racingLineSteer + overtakeOffset;
155
+ const steer = clamp(rawSteer * settings.steerSmoothing, -1, 1);
156
+ return {
157
+ difficulty,
158
+ throttle: Number(clamp(speedError / 48 + 0.5, 0, 1).toFixed(4)),
159
+ brake: Number(clamp(-speedError / 38 + Math.abs(curvature) * 0.18, 0, 1).toFixed(4)),
160
+ steer: Number(steer.toFixed(4)),
161
+ targetSpeedKph: Number(desiredSpeed.toFixed(3)),
162
+ lookaheadDistance: Number((15 + speedKph / 10 + (overtaking ? -4 : 0)).toFixed(3)),
163
+ reactionTime: settings.reactionTime,
164
+ aggressiveness: settings.aggressiveness,
165
+ overtaking,
166
+ overtakeOffset: Number(overtakeOffset.toFixed(4)),
167
+ rubberbandBoost: Number(rubberbandBoost.toFixed(4))
168
+ };
169
+ }
170
+ /**
171
+ * Peak lateral cornering stiffness of a tyre preset, per newton of vertical load.
172
+ *
173
+ * This is the initial slope of the Magic Formula lateral curve, `d * c * b`, in units of
174
+ * force per radian of slip per newton of load. An integrator needs it to size a stable
175
+ * timestep: the tyre is the stiffest spring in a vehicle model, so it sets the step, and
176
+ * assuming a fixed 1/60 s regardless of tyre, mass and wheelbase is what let the vehicle
177
+ * integrator go unstable and produce yaw opposing its own steering input.
178
+ */
179
+ export function tirePeakCorneringStiffness(tire) {
180
+ const { value } = coefficients(tire);
181
+ return value.d * value.c * value.b;
182
+ }
183
+ export function samplePacejkaTireForces(input) {
184
+ const normalForce = finiteNonNegative(input.normalForce, "normalForce");
185
+ const longitudinalVelocity = finite(input.longitudinalVelocity, "longitudinalVelocity");
186
+ const lateralVelocity = finite(input.lateralVelocity ?? 0, "lateralVelocity");
187
+ const angularVelocity = finite(input.angularVelocity, "angularVelocity");
188
+ const steeringAngle = finite(input.steeringAngle ?? 0, "steeringAngle");
189
+ const camberAngle = finite(input.camberAngle ?? 0, "camberAngle");
190
+ const radius = positive(input.radius ?? 0.33, "radius");
191
+ const width = positive(input.width ?? 0.225, "width");
192
+ const maxLoad = positive(input.maxLoad ?? 5000, "maxLoad");
193
+ const loadSensitivity = positive(input.loadSensitivity ?? 1, "loadSensitivity");
194
+ const rollingResistance = clamp(input.rollingResistance ?? 0.015, 0, 1);
195
+ const longitudinal = coefficients(input.longitudinal ?? "sport");
196
+ const lateral = coefficients(input.lateral ?? "sport");
197
+ if (normalForce === 0) {
198
+ return {
199
+ longitudinalForce: 0,
200
+ lateralForce: 0,
201
+ combinedForce: 0,
202
+ slipRatio: 0,
203
+ slipAngle: 0,
204
+ aligningTorque: 0,
205
+ optimalSlipRatio: optimalSlipRatio(longitudinal.value),
206
+ optimalSlipAngle: optimalSlipAngle(lateral.value),
207
+ preset: { longitudinal: longitudinal.preset, lateral: lateral.preset }
208
+ };
209
+ }
210
+ const slipRatio = tireSlipRatio(longitudinalVelocity, angularVelocity, radius);
211
+ const slipAngle = tireSlipAngle(longitudinalVelocity, lateralVelocity, steeringAngle);
212
+ const loadFactor = clamp(Math.pow(normalForce / maxLoad, loadSensitivity), 0.1, 1.5);
213
+ const camberGrip = clamp(1 - Math.abs(camberAngle) * 0.1, 0.75, 1.08);
214
+ const longitudinalPure = pacejka(slipRatio, longitudinal.value) * normalForce * loadFactor * camberGrip
215
+ - Math.sign(longitudinalVelocity) * normalForce * rollingResistance;
216
+ /*
217
+ * Slip angle stays in radians.
218
+ *
219
+ * The lateral presets use stiffness factors around b=10..14, which is the radian
220
+ * convention for the Magic Formula. (The degree convention runs b=0.2..0.3.) Feeding
221
+ * degrees into radian coefficients moved the grip peak from ~6.9 degrees of slip to
222
+ * ~0.08 degrees, so every physically real cornering slip angle landed far down the
223
+ * falloff: at 19 degrees of slip the model returned mu=0.20 instead of mu=1.21.
224
+ *
225
+ * A tyre that loses 85% of its grip the instant it is asked to corner cannot hold a
226
+ * line, and it makes tiny near-zero slip angles produce enormous force swings, which
227
+ * showed up as yaw-rate chatter. Verified in `tyre-slip-curve.test.ts`.
228
+ */
229
+ const lateralPure = pacejka(slipAngle, lateral.value) * normalForce * loadFactor * clamp(1 + camberAngle * 0.1, 0.75, 1.15);
230
+ const slipMagnitude = Math.hypot(Math.abs(slipRatio), Math.abs(slipAngle));
231
+ const longitudinalScale = slipMagnitude < 0.001 ? 1 : Math.sqrt(Math.max(0, 1 - Math.pow((Math.abs(slipAngle) / slipMagnitude) * 0.9, 2)));
232
+ const lateralScale = slipMagnitude < 0.001 ? 1 : Math.sqrt(Math.max(0, 1 - Math.pow((Math.abs(slipRatio) / slipMagnitude) * 0.9, 2)));
233
+ const longitudinalForce = longitudinalPure * longitudinalScale;
234
+ const lateralForce = lateralPure * lateralScale;
235
+ const pneumaticTrail = width * 0.5;
236
+ // Pneumatic trail collapses as the tyre saturates; 20 degrees expressed in radians.
237
+ const torqueCoeff = -pneumaticTrail * clamp(1 - Math.abs(slipAngle) / (20 * Math.PI / 180), 0, 1);
238
+ const aligningTorque = clamp(lateralForce * torqueCoeff, -normalForce * width, normalForce * width);
239
+ return {
240
+ longitudinalForce: Number(longitudinalForce.toFixed(3)),
241
+ lateralForce: Number(lateralForce.toFixed(3)),
242
+ combinedForce: Number(Math.hypot(longitudinalForce, lateralForce).toFixed(3)),
243
+ slipRatio: Number(slipRatio.toFixed(5)),
244
+ slipAngle: Number(slipAngle.toFixed(5)),
245
+ aligningTorque: Number(aligningTorque.toFixed(3)),
246
+ optimalSlipRatio: Number(optimalSlipRatio(longitudinal.value).toFixed(5)),
247
+ optimalSlipAngle: Number(optimalSlipAngle(lateral.value).toFixed(5)),
248
+ preset: { longitudinal: longitudinal.preset, lateral: lateral.preset }
249
+ };
250
+ }
251
+ function validateGearRatios(values) {
252
+ if (values.length === 0) {
253
+ throw new RangeError("Arcade vehicle telemetry gearRatios must contain at least one ratio.");
254
+ }
255
+ return values.map((value, index) => positive(value, `gearRatios[${index}]`));
256
+ }
257
+ function selectAutomaticGear(gearRatios, wheelRpm, finalDriveRatio, idleRpm, maxRpm, upshiftRpm, downshiftRpm) {
258
+ if (wheelRpm <= 1)
259
+ return { gear: 1, ratio: gearRatios[0] ?? 1, shiftState: "hold" };
260
+ let gearIndex = 0;
261
+ let rpm = wheelRpm * (gearRatios[gearIndex] ?? 1) * finalDriveRatio;
262
+ while (gearIndex < gearRatios.length - 1 && rpm > upshiftRpm) {
263
+ gearIndex += 1;
264
+ rpm = wheelRpm * (gearRatios[gearIndex] ?? 1) * finalDriveRatio;
265
+ }
266
+ while (gearIndex > 0 && rpm < downshiftRpm) {
267
+ gearIndex -= 1;
268
+ rpm = wheelRpm * (gearRatios[gearIndex] ?? 1) * finalDriveRatio;
269
+ }
270
+ const clampedRpm = clamp(rpm, idleRpm, maxRpm);
271
+ return {
272
+ gear: gearIndex + 1,
273
+ ratio: gearRatios[gearIndex] ?? 1,
274
+ shiftState: clampedRpm >= upshiftRpm && gearIndex < gearRatios.length - 1 ? "upshift" : clampedRpm <= downshiftRpm && gearIndex > 0 ? "downshift" : "hold"
275
+ };
276
+ }
277
+ function engineTorqueAt(engineRpm, peakTorque, peakTorqueRpm, idleRpm, maxRpm) {
278
+ if (engineRpm <= peakTorqueRpm) {
279
+ const t = clamp((engineRpm - idleRpm) / Math.max(1, peakTorqueRpm - idleRpm), 0, 1);
280
+ return peakTorque * (0.8 + 0.2 * t);
281
+ }
282
+ const t = clamp((engineRpm - peakTorqueRpm) / Math.max(1, maxRpm - peakTorqueRpm), 0, 1);
283
+ return peakTorque * (1 - 0.4 * t);
284
+ }
285
+ function racingAiSettings(difficulty) {
286
+ switch (difficulty) {
287
+ case "easy":
288
+ return { targetSpeedFactor: 0.7, steerSmoothing: 0.3, reactionTime: 0.3, aggressiveness: 0.3, rubberbandStrength: 0.5 };
289
+ case "hard":
290
+ return { targetSpeedFactor: 0.95, steerSmoothing: 0.7, reactionTime: 0.05, aggressiveness: 0.9, rubberbandStrength: 0.1 };
291
+ case "medium":
292
+ return { targetSpeedFactor: 0.85, steerSmoothing: 0.5, reactionTime: 0.15, aggressiveness: 0.6, rubberbandStrength: 0.3 };
293
+ }
294
+ }
295
+ function suspensionFor(steer, speedRatio, driftSlip) {
296
+ const loadTransfer = steer * speedRatio * 0.18;
297
+ const brakeDive = driftSlip * 0.08;
298
+ return [
299
+ clamp(Number((0.48 - loadTransfer + brakeDive).toFixed(5)), 0, 1),
300
+ clamp(Number((0.48 + loadTransfer + brakeDive).toFixed(5)), 0, 1),
301
+ clamp(Number((0.42 - loadTransfer * 0.55).toFixed(5)), 0, 1),
302
+ clamp(Number((0.42 + loadTransfer * 0.55).toFixed(5)), 0, 1)
303
+ ];
304
+ }
305
+ function finite(value, label) {
306
+ if (!Number.isFinite(value)) {
307
+ throw new RangeError(`Arcade vehicle telemetry ${label} must be finite.`);
308
+ }
309
+ return value;
310
+ }
311
+ function finiteNonNegative(value, label) {
312
+ if (!Number.isFinite(value) || value < 0) {
313
+ throw new RangeError(`Arcade vehicle telemetry ${label} must be finite and non-negative.`);
314
+ }
315
+ return value;
316
+ }
317
+ function positive(value, label) {
318
+ if (!Number.isFinite(value) || value <= 0) {
319
+ throw new RangeError(`Arcade vehicle telemetry ${label} must be finite and positive.`);
320
+ }
321
+ return value;
322
+ }
323
+ function coefficients(value) {
324
+ if (typeof value !== "string")
325
+ return { preset: "custom", value };
326
+ switch (value) {
327
+ case "street":
328
+ return { preset: value, value: { b: 10, c: 1.9, d: 1, e: 0.97 } };
329
+ case "sport":
330
+ return { preset: value, value: { b: 12, c: 2, d: 1.3, e: 0.95 } };
331
+ case "racing":
332
+ return { preset: value, value: { b: 14, c: 2.1, d: 1.6, e: 0.9 } };
333
+ case "offroad":
334
+ return { preset: value, value: { b: 7, c: 1.7, d: 0.9, e: 1 } };
335
+ }
336
+ }
337
+ function tireSlipRatio(longitudinalVelocity, angularVelocity, radius) {
338
+ const wheelVelocity = angularVelocity * radius;
339
+ const denominator = Math.max(Math.abs(wheelVelocity), Math.abs(longitudinalVelocity));
340
+ if (denominator < 0.1)
341
+ return 0;
342
+ return clamp((wheelVelocity - longitudinalVelocity) / denominator, -1, 1);
343
+ }
344
+ function tireSlipAngle(longitudinalVelocity, lateralVelocity, steeringAngle) {
345
+ if (Math.abs(longitudinalVelocity) < 0.1)
346
+ return 0;
347
+ return clamp(Math.atan2(lateralVelocity, longitudinalVelocity) - steeringAngle, -Math.PI * 0.4, Math.PI * 0.4);
348
+ }
349
+ function pacejka(slip, coeff) {
350
+ const bx = coeff.b * slip;
351
+ return coeff.d * Math.sin(coeff.c * Math.atan(bx - coeff.e * (bx - Math.atan(bx))));
352
+ }
353
+ function optimalSlipRatio(coeff) {
354
+ return Math.min(Math.tan(Math.PI / (2 * coeff.c)) / coeff.b, 0.2);
355
+ }
356
+ function optimalSlipAngle(coeff) {
357
+ // Radians, matching the units the lateral curve is now evaluated in.
358
+ return Math.min(Math.tan(Math.PI / (2 * coeff.c)) / coeff.b, 0.3);
359
+ }
360
+ function clamp(value, min, max) {
361
+ return Math.max(min, Math.min(max, value));
362
+ }
363
+ //# sourceMappingURL=ArcadeVehicleTelemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArcadeVehicleTelemetry.js","sourceRoot":"","sources":["../../../../packages/physics/src/ArcadeVehicleTelemetry.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,24 @@ export type CharacterControllerDescriptor = {
13
13
  readonly groundProbeDistance?: number;
14
14
  readonly maxSlopeAngleRadians?: number;
15
15
  readonly collisionMask?: number;
16
+ /**
17
+ * Tallest ledge the character walks up without jumping, in world units.
18
+ *
19
+ * Without this a capsule stops dead at a kerb: the solver sees a vertical wall and
20
+ * pushes back. Every platformer needs it, because level geometry is full of small steps
21
+ * that a player expects to walk over rather than jump.
22
+ */
23
+ readonly maxStepHeight?: number | undefined;
24
+ /**
25
+ * Snap distance when walking off a small ledge, in world units.
26
+ *
27
+ * Without step-down a character walking down stairs launches off each edge and
28
+ * repeatedly loses `grounded`, which breaks coyote time, footstep audio and any state
29
+ * machine keyed on being on the floor.
30
+ */
31
+ readonly stepDownDistance?: number | undefined;
32
+ /** Slide along a wall instead of stopping when movement is blocked. Defaults to true. */
33
+ readonly wallSlide?: boolean | undefined;
16
34
  };
17
35
  export type CharacterControllerMoveInput = {
18
36
  readonly x: number;
@@ -25,6 +43,18 @@ export type CharacterControllerState = {
25
43
  readonly desiredVelocity: Vec3;
26
44
  readonly velocity: Vec3;
27
45
  readonly speed: number;
46
+ /** Height the character was lifted this step to clear a ledge. Zero when flat. */
47
+ readonly steppedUp: number;
48
+ /** Distance the character was snapped down this step to stay on a descending surface. */
49
+ readonly steppedDown: number;
50
+ /** True when horizontal motion was redirected along a wall rather than stopped. */
51
+ readonly wallSliding: boolean;
52
+ /** True when the head struck geometry, so upward velocity was cancelled. */
53
+ readonly ceilingHit: boolean;
54
+ /** Slope angle under the character in radians. Zero on flat ground. */
55
+ readonly slopeAngle: number;
56
+ /** True when standing on a surface steeper than `maxSlopeAngleRadians`. */
57
+ readonly onSteepSlope: boolean;
28
58
  readonly jumpedThisFrame: boolean;
29
59
  };
30
60
  export type FightingCharacterControllerState = "idle" | "walk" | "dash" | "jump" | "fast-fall" | "crouch" | "landing";
@@ -68,6 +98,9 @@ export declare class CharacterController {
68
98
  readonly jumpSpeed: number;
69
99
  readonly groundProbeDistance: number;
70
100
  readonly maxSlopeAngleRadians: number;
101
+ readonly maxStepHeight: number;
102
+ readonly stepDownDistance: number;
103
+ readonly wallSlide: boolean;
71
104
  private readonly collisionMask;
72
105
  private moveInput;
73
106
  private jumpQueued;
@@ -78,6 +111,25 @@ export declare class CharacterController {
78
111
  teleport(position: Vec3): void;
79
112
  step(dt: number): CharacterControllerState;
80
113
  snapshot(): CharacterControllerState;
114
+ /**
115
+ * Horizontal sweep ahead of the capsule's mid-section, for wall and ledge detection.
116
+ *
117
+ * Returns both the sweep's own travel (`distance`, which callers feed back into
118
+ * `probeStepSurface` so the two probes stay consistent) and `gap`, the distance from the
119
+ * **capsule's surface** to the obstacle. The two differ by the probe sphere's radius less
120
+ * the capsule's, and conflating them is what made step-up fire early: see the comment at
121
+ * the step-up call site.
122
+ */
123
+ private castHorizontal;
124
+ /**
125
+ * Surface height just past an obstacle, or undefined when there is nothing to stand on.
126
+ *
127
+ * Probes downward from above the maximum step height at a point slightly ahead of the
128
+ * capsule. If it finds a walkable surface, that height is the top of the step.
129
+ */
130
+ private probeStepSurface;
131
+ /** Ground probe with a caller-supplied reach, used by step-down. */
132
+ private probeGroundAt;
81
133
  private probeGround;
82
134
  }
83
135
  //# sourceMappingURL=CharacterController.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CharacterController.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/CharacterController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CharacterController.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/CharacterController.ts"],"names":[],"mappings":"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"}