I have touched the physics with my beat down stick.. The only thing I have consistently had to change is the "Slip" value for the tires on pretty much all the mod cars. Through much testing 0.57 seems to be THE starting point. It is the most realistic on grass and asphalt at speed and allows the tires to spin when you climb near vertical walls. Anything higher seems unrealistic.
I tweaked a load of stuff.
Here is the code.. //invoked only the first time the model is loaded, or upon reload
function init_chassis()
{
var wheelparam = {
radius: 0.38,
width: 0.265,
suspension_max: 0.25,
suspension_min: -0.10,
suspension_stiffness: 20.0,
damping_compression: 0.20,
damping_relaxation: 0.08,
slip: 0.60,
roll_influnce: 0.1,
rotation: -1,
}
this.add_wheel('wfl', wheelparam);
this.add_wheel('wfr', wheelparam);
this.add_wheel('wbl', wheelparam);
this.add_wheel('wbr', wheelparam);
//sounds
this.load_sound("mon_start.ogg");
this.load_sound("mon_idle.ogg");
this.add_sound_emitter("carpaint");
return {mass:2315, steering:6.0, steering_ecf:40, centering:2.8, centering_ecf: 120,
com:{z:-0.6, y:0.5}};
}
//invoked for each new instance of the vehicle
function init_vehicle()
{
this.set_fps_camera_pos({x:-0.4,y:-0.08,z:0.6});
this.snd = this.sound();
this.snd.set_ref_distance(0, 9.0);
this.started = 0;
}
function engine(start)
{
if(start) {
this.started=1;
this.snd.play(0, 0, false, false);
}
}
const EF = 8000.0;
const BF = 2500.0;
const maxkmh = 120;
const forceloss = EF / (0.4*maxkmh + 2);
//invoked each frame to handle inputs and animate the model
function update_frame(dt, engine, brake, steering)
{
var kmh = this.speed()*3.6;
//reduce engine force with speed (hack)
var redux = engine>=0 ? 0.2 : 0.6;
var esign = engine<0 ? -1 : 1;
engine = EF*Math.abs(engine);
var force = (esign>0) == (kmh>=0)
? engine/(redux*Math.abs(kmh) + 1)
: engine;
force -= forceloss;
force = Math.max(0.0, Math.min(force, engine));
engine = esign*force;
steering *= 0.6;
this.steer(0, steering);
this.steer(1, steering);
if(this.started>1)
this.wheel_force(0, engine);
this.wheel_force(1, engine);
this.wheel_force(2, engine);
this.wheel_force(3, engine);
brake *= BF;
this.wheel_brake(-1, brake);
if(this.started==1 && !this.snd.is_playing(0)) {
this.started=2;
this.snd.play(0, 1, true, false);
}
else if(this.started==2) {
var pitch = Math.abs(kmh)/20.0;
var g = kmh>0 ? Math.floor(pitch) : 0;
var f = pitch - g;
f += 0.5*g;
this.snd.set_pitch(0, 0.5*f + 1.0);
}
this.animate_wheels();
}
And a video of the cross country results!