@aura3d/physics 2.0.0 → 2.0.2
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/package.json +2 -2
- package/dist/CharacterController.d.ts +0 -135
- package/dist/CharacterController.d.ts.map +0 -1
- package/dist/CharacterController.js +0 -609
- package/dist/CharacterController.js.map +0 -1
- package/dist/ClothFixtures.d.ts +0 -87
- package/dist/ClothFixtures.d.ts.map +0 -1
- package/dist/ClothFixtures.js +0 -264
- package/dist/ClothFixtures.js.map +0 -1
- package/dist/Crowd.d.ts +0 -64
- package/dist/Crowd.d.ts.map +0 -1
- package/dist/Crowd.js +0 -209
- package/dist/Crowd.js.map +0 -1
- package/dist/FireSmokeFixtures.d.ts +0 -103
- package/dist/FireSmokeFixtures.d.ts.map +0 -1
- package/dist/FireSmokeFixtures.js +0 -271
- package/dist/FireSmokeFixtures.js.map +0 -1
- package/dist/FluidFixtures.d.ts +0 -75
- package/dist/FluidFixtures.d.ts.map +0 -1
- package/dist/FluidFixtures.js +0 -219
- package/dist/FluidFixtures.js.map +0 -1
- package/dist/FractureFixtures.d.ts +0 -68
- package/dist/FractureFixtures.d.ts.map +0 -1
- package/dist/FractureFixtures.js +0 -199
- package/dist/FractureFixtures.js.map +0 -1
- package/dist/NarrowPhase.d.ts +0 -11
- package/dist/NarrowPhase.d.ts.map +0 -1
- package/dist/NarrowPhase.js +0 -565
- package/dist/NarrowPhase.js.map +0 -1
- package/dist/Navigation.d.ts +0 -67
- package/dist/Navigation.d.ts.map +0 -1
- package/dist/Navigation.js +0 -261
- package/dist/Navigation.js.map +0 -1
- package/dist/PathFollowDriver.d.ts +0 -162
- package/dist/PathFollowDriver.d.ts.map +0 -1
- package/dist/PathFollowDriver.js +0 -163
- package/dist/PathFollowDriver.js.map +0 -1
- package/dist/PhysicsSandboxFixtures.d.ts +0 -53
- package/dist/PhysicsSandboxFixtures.d.ts.map +0 -1
- package/dist/PhysicsSandboxFixtures.js +0 -280
- package/dist/PhysicsSandboxFixtures.js.map +0 -1
- package/dist/PlatformerFixtures.d.ts +0 -70
- package/dist/PlatformerFixtures.d.ts.map +0 -1
- package/dist/PlatformerFixtures.js +0 -120
- package/dist/PlatformerFixtures.js.map +0 -1
- package/dist/RacingLineProfile.d.ts +0 -116
- package/dist/RacingLineProfile.d.ts.map +0 -1
- package/dist/RacingLineProfile.js +0 -181
- package/dist/RacingLineProfile.js.map +0 -1
- package/dist/SoftBodyFixtures.d.ts +0 -70
- package/dist/SoftBodyFixtures.d.ts.map +0 -1
- package/dist/SoftBodyFixtures.js +0 -272
- package/dist/SoftBodyFixtures.js.map +0 -1
- package/dist/Steering.d.ts +0 -161
- package/dist/Steering.d.ts.map +0 -1
- package/dist/Steering.js +0 -347
- package/dist/Steering.js.map +0 -1
- package/dist/VehicleDynamics.d.ts +0 -162
- package/dist/VehicleDynamics.d.ts.map +0 -1
- package/dist/VehicleDynamics.js +0 -363
- package/dist/VehicleDynamics.js.map +0 -1
- package/dist/VehicleMotion.d.ts +0 -125
- package/dist/VehicleMotion.d.ts.map +0 -1
- package/dist/VehicleMotion.js +0 -373
- package/dist/VehicleMotion.js.map +0 -1
- package/dist/solverless-entry.d.ts +0 -41
- package/dist/solverless-entry.d.ts.map +0 -1
- package/dist/solverless-entry.js +0 -40
- package/dist/solverless-entry.js.map +0 -1
- package/dist/world-entry.d.ts +0 -31
- package/dist/world-entry.d.ts.map +0 -1
- package/dist/world-entry.js +0 -30
- package/dist/world-entry.js.map +0 -1
package/dist/VehicleDynamics.js
DELETED
|
@@ -1,363 +0,0 @@
|
|
|
1
|
-
export function sampleArcadeVehicleDynamics(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("VehicleDynamics 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(`VehicleDynamics ${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(`VehicleDynamics ${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(`VehicleDynamics ${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=VehicleDynamics.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VehicleDynamics.js","sourceRoot":"","sources":["../../../../packages/physics/src/VehicleDynamics.ts"],"names":[],"mappings":"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"}
|
package/dist/VehicleMotion.d.ts
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { type PacejkaTirePreset } from "./VehicleDynamics.js";
|
|
2
|
-
/**
|
|
3
|
-
* Force-based planar vehicle motion.
|
|
4
|
-
*
|
|
5
|
-
* ## The gap this closes
|
|
6
|
-
*
|
|
7
|
-
* `samplePacejkaTireForce` is a real tyre model — slip ratio, slip angle, load-sensitive
|
|
8
|
-
* grip, a combined-slip friction circle and aligning torque. It had **zero consumers**.
|
|
9
|
-
* Meanwhile the racing kit drove a kinematic 2D point: heading integrated straight from
|
|
10
|
-
* steering input, speed from a throttle curve, and a `driftSlip` fudge factor standing in
|
|
11
|
-
* for lateral dynamics. Those two facts together are why `vehicle dynamics` claimed
|
|
12
|
-
* `exceed` while the car behaved like a sprite sliding on a plane.
|
|
13
|
-
*
|
|
14
|
-
* This module is the missing middle. It takes throttle, brake and steering, asks the tyre
|
|
15
|
-
* model for forces at each axle, and integrates the body's planar state from those forces.
|
|
16
|
-
* That produces the behaviours a kinematic point cannot:
|
|
17
|
-
*
|
|
18
|
-
* - **Understeer**: front slip angle saturates, so the car runs wide of where it is pointed.
|
|
19
|
-
* - **Wheelspin**: excess drive torque exceeds available longitudinal grip.
|
|
20
|
-
* - **Weight transfer**: braking loads the front axle and unloads the rear.
|
|
21
|
-
* - **Grip sensitivity**: a low-grip surface reduces available force rather than being a
|
|
22
|
-
* cosmetic multiplier on a scripted speed.
|
|
23
|
-
*/
|
|
24
|
-
export interface VehicleMotionSpec {
|
|
25
|
-
/** Total mass in kilograms. */
|
|
26
|
-
readonly mass: number;
|
|
27
|
-
/** Distance between axles, world units. */
|
|
28
|
-
readonly wheelbase: number;
|
|
29
|
-
/** Fraction of the wheelbase from the front axle to the centre of mass, 0..1. */
|
|
30
|
-
readonly frontWeightBias?: number | undefined;
|
|
31
|
-
/** Centre-of-mass height, which sets how much load transfers under braking. */
|
|
32
|
-
readonly centreOfMassHeight?: number | undefined;
|
|
33
|
-
/** Peak steering angle at the roadwheel, radians. */
|
|
34
|
-
readonly maxSteerAngle?: number | undefined;
|
|
35
|
-
/** Drive force at full throttle, newtons. */
|
|
36
|
-
readonly driveForce?: number | undefined;
|
|
37
|
-
/** Brake force at full brake, newtons. */
|
|
38
|
-
readonly brakeForce?: number | undefined;
|
|
39
|
-
/** Tyre compound. */
|
|
40
|
-
readonly tirePreset?: PacejkaTirePreset | undefined;
|
|
41
|
-
/** Aerodynamic drag coefficient, lumped. */
|
|
42
|
-
readonly dragCoefficient?: number | undefined;
|
|
43
|
-
/** Rolling resistance coefficient. */
|
|
44
|
-
readonly rollingResistance?: number | undefined;
|
|
45
|
-
/** Yaw inertia. Defaults to a plausible value derived from mass and wheelbase. */
|
|
46
|
-
readonly yawInertia?: number | undefined;
|
|
47
|
-
/**
|
|
48
|
-
* Gravitational acceleration expressed in the same length unit as `wheelbase` and the
|
|
49
|
-
* positions this integrator reports, per second squared. Defaults to `9.81`.
|
|
50
|
-
*
|
|
51
|
-
* This exists because gravity is the only place a force model silently assumes a length
|
|
52
|
-
* unit. Every corner speed this model can hold is bounded by `sqrt(mu * gravity * radius)`,
|
|
53
|
-
* so hardcoding 9.81 does not mean "SI" — it means "one world unit is one metre", and it
|
|
54
|
-
* makes the integrator unusable for any route authored at another scale. A circuit authored
|
|
55
|
-
* in game units where one unit is 0.352 scene units has an effective gravity of
|
|
56
|
-
* `9.81 / 0.352`, and with 9.81 assumed instead the same geometry demands roughly 2.8x the
|
|
57
|
-
* lateral grip that physically exists. The car then understeers off the outside of every
|
|
58
|
-
* corner, which reads as "the physics is broken" when the real fault is that the caller was
|
|
59
|
-
* never given a way to state its units.
|
|
60
|
-
*
|
|
61
|
-
* Pass `sceneGravity / sceneUnitsPerWorldUnit` to run in authored units.
|
|
62
|
-
*/
|
|
63
|
-
readonly gravity?: number | undefined;
|
|
64
|
-
}
|
|
65
|
-
export interface VehicleMotionInput {
|
|
66
|
-
/** 0..1 */
|
|
67
|
-
readonly throttle?: number | undefined;
|
|
68
|
-
/** 0..1 */
|
|
69
|
-
readonly brake?: number | undefined;
|
|
70
|
-
/** -1..1, scaled by `maxSteerAngle`. */
|
|
71
|
-
readonly steer?: number | undefined;
|
|
72
|
-
/** 0..1 grip multiplier from the surface under the car. */
|
|
73
|
-
readonly grip?: number | undefined;
|
|
74
|
-
/** Handbrake locks the rear axle, which is how a drift is initiated. */
|
|
75
|
-
readonly handbrake?: boolean | undefined;
|
|
76
|
-
}
|
|
77
|
-
export interface VehicleMotionState {
|
|
78
|
-
readonly x: number;
|
|
79
|
-
readonly z: number;
|
|
80
|
-
readonly heading: number;
|
|
81
|
-
/** Forward speed in the body frame. */
|
|
82
|
-
readonly speed: number;
|
|
83
|
-
/** Lateral speed in the body frame. Non-zero means the car is sliding. */
|
|
84
|
-
readonly lateralSpeed: number;
|
|
85
|
-
readonly yawRate: number;
|
|
86
|
-
}
|
|
87
|
-
export interface VehicleMotionSample extends VehicleMotionState {
|
|
88
|
-
/** Slip angle at the front axle, radians. */
|
|
89
|
-
readonly frontSlipAngle: number;
|
|
90
|
-
readonly rearSlipAngle: number;
|
|
91
|
-
/** Longitudinal slip ratio at the driven axle. */
|
|
92
|
-
readonly slipRatio: number;
|
|
93
|
-
/** True when drive torque exceeds available longitudinal grip. */
|
|
94
|
-
readonly wheelspin: boolean;
|
|
95
|
-
/**
|
|
96
|
-
* True when the front tyres have saturated, so the car runs wide of its heading.
|
|
97
|
-
*
|
|
98
|
-
* This is the diagnostic a kinematic model cannot produce: with heading integrated
|
|
99
|
-
* directly from steering input, the car always goes exactly where it points.
|
|
100
|
-
*/
|
|
101
|
-
readonly understeering: boolean;
|
|
102
|
-
readonly oversteering: boolean;
|
|
103
|
-
/** Normal load per axle in newtons, after transfer. */
|
|
104
|
-
readonly frontLoad: number;
|
|
105
|
-
readonly rearLoad: number;
|
|
106
|
-
/** Total lateral acceleration in g, the number a driver actually feels. */
|
|
107
|
-
readonly lateralG: number;
|
|
108
|
-
}
|
|
109
|
-
export interface VehicleMotionIntegrator {
|
|
110
|
-
readonly kind: "aura-vehicle-motion";
|
|
111
|
-
readonly spec: Required<Omit<VehicleMotionSpec, never>>;
|
|
112
|
-
step(dt: number, input: VehicleMotionInput): VehicleMotionSample;
|
|
113
|
-
/**
|
|
114
|
-
* The current state, including the derived tyre and load diagnostics from the last step.
|
|
115
|
-
*
|
|
116
|
-
* This returns the full sample rather than the bare pose: a caller reading `state()` before
|
|
117
|
-
* its first `step()` still needs `lateralG`, `frontLoad` and the slip angles to drive a HUD
|
|
118
|
-
* or a camera, and narrowing the return type forced route code to either cast or duplicate
|
|
119
|
-
* the derived maths locally.
|
|
120
|
-
*/
|
|
121
|
-
state(): VehicleMotionSample;
|
|
122
|
-
reset(state?: Partial<VehicleMotionState>): VehicleMotionSample;
|
|
123
|
-
}
|
|
124
|
-
export declare function createVehicleMotion(spec: VehicleMotionSpec): VehicleMotionIntegrator;
|
|
125
|
-
//# sourceMappingURL=VehicleMotion.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VehicleMotion.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/VehicleMotion.ts"],"names":[],"mappings":"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"}
|