Fixed power delivery from engine, now 0-100 time seems to be in the right ballpark
This commit is contained in:
parent
cbe0dd20e5
commit
5c797145ae
@ -402,13 +402,13 @@ update_runtime_world :: proc(runtime_world: ^Runtime_World, dt: f32) {
|
||||
physics.Engine_Config {
|
||||
rpm_torque_curve = assets.get_curve_2d(&g_mem.assetman, "assets/ae86_rpm_torque.csv").points,
|
||||
lowest_rpm = 1000,
|
||||
inertia = 0.0264,
|
||||
internal_friction = 0.00,
|
||||
inertia = 0.264,
|
||||
internal_friction = 0.01,
|
||||
gear_ratios = []f32{3.48, 3.587, 2.022, 1.384, 1, 0.861},
|
||||
axle = physics.Drive_Axle_Config {
|
||||
wheels = {wheel_rl, wheel_rr},
|
||||
wheel_count = 2,
|
||||
diff_type = .Fixed,
|
||||
diff_type = .Open,
|
||||
final_drive_ratio = 4.1,
|
||||
},
|
||||
},
|
||||
|
@ -177,6 +177,7 @@ Suspension_Constraint :: struct {
|
||||
}
|
||||
|
||||
Diff_Type :: enum {
|
||||
Open,
|
||||
Fixed,
|
||||
// TODO: LSD
|
||||
}
|
||||
|
@ -587,27 +587,57 @@ pgs_solve_engines :: proc(sim_state: ^Sim_State, config: Solver_Config, dt: f32,
|
||||
gear_ratio := lookup_gear_ratio(gear_ratios, engine.gear)
|
||||
|
||||
if engine.gear != 0 {
|
||||
for i in 0 ..< engine.axle.wheel_count {
|
||||
drive_wheel := &engine.axle.wheels[i]
|
||||
wheel := get_suspension_constraint(sim_state, drive_wheel.wheel)
|
||||
ratio := gear_ratio * engine.axle.final_drive_ratio
|
||||
inv_ratio := f32(1.0 / (ratio))
|
||||
|
||||
ratio := gear_ratio * engine.axle.final_drive_ratio
|
||||
inv_ratio := f32(1.0 / (ratio))
|
||||
drive_wheel1 := &engine.axle.wheels[0]
|
||||
wheel1 := get_suspension_constraint(sim_state, drive_wheel1.wheel)
|
||||
|
||||
w1 := wheel.inv_inertia
|
||||
w2 := f32(1.0 / (engine.inertia * ratio * ratio))
|
||||
drive_wheel2 := &engine.axle.wheels[1]
|
||||
wheel2 := get_suspension_constraint(sim_state, drive_wheel2.wheel)
|
||||
|
||||
w := w1 + w2
|
||||
inv_w := f32(1.0 / w)
|
||||
w1 := f32(1.0 / (engine.inertia * ratio * ratio))
|
||||
w2 := wheel1.inv_inertia
|
||||
w3 := wheel2.inv_inertia
|
||||
|
||||
delta_omega := wheel.w * ratio - (-engine.w)
|
||||
w := w1 + w2 + w3
|
||||
inv_w := f32(1.0 / w)
|
||||
|
||||
incremental_impulse := -inv_w * delta_omega
|
||||
// drive_wheel.impulse += incremental_impulse
|
||||
avg_wheel_vel := (wheel1.w + wheel2.w) * 0.5
|
||||
|
||||
wheel.w += incremental_impulse * w1 * inv_ratio
|
||||
engine.w += incremental_impulse / (engine.inertia * ratio * ratio)
|
||||
}
|
||||
delta_omega := avg_wheel_vel * ratio - (-engine.w)
|
||||
|
||||
incremental_impulse := -inv_w * delta_omega
|
||||
|
||||
engine.w += incremental_impulse * w1
|
||||
wheel1.w += incremental_impulse * w2 * inv_ratio
|
||||
wheel2.w += incremental_impulse * w3 * inv_ratio
|
||||
}
|
||||
}
|
||||
|
||||
// Diff
|
||||
{
|
||||
switch engine.axle.diff_type {
|
||||
case .Open:
|
||||
case .Fixed:
|
||||
drive_wheel1 := &engine.axle.wheels[0]
|
||||
wheel1 := get_suspension_constraint(sim_state, drive_wheel1.wheel)
|
||||
|
||||
drive_wheel2 := &engine.axle.wheels[1]
|
||||
wheel2 := get_suspension_constraint(sim_state, drive_wheel2.wheel)
|
||||
|
||||
w1 := wheel1.inv_inertia
|
||||
w2 := wheel2.inv_inertia
|
||||
|
||||
w := w1 + w2
|
||||
inv_w := f32(1.0 / w)
|
||||
|
||||
delta_omega := wheel2.w - wheel1.w
|
||||
|
||||
incremental_impulse := -inv_w * delta_omega
|
||||
|
||||
wheel1.w += -incremental_impulse * wheel1.inv_inertia
|
||||
wheel2.w += incremental_impulse * wheel2.inv_inertia
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user