//invoked only the first time the model is loaded, or upon reload
function init_chassis()
{
var wheelparam = {
radius: 0.62,
width: 0.295,
suspension_max: 0.45,
suspension_min: -0.26,
suspension_stiffness: 10.0,
damping_compression: 0.10,
damping_relaxation: 0.22,
slip: 0.6,
roll_influnce: 0.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("diesel-engine-start.ogg");
this.load_sound("diesel-engine-idle.ogg");
this.add_sound_emitter("sw");
return {mass:3950, steering:2.0, steering_ecf:60, centering: 2.0,
centering_ecf: 40, com:{z:-0.9, y:0.2}};
}
//invoked for each new instance of the vehicle
function init_vehicle()
{
this.set_fps_camera_pos({x:-0.40,y:-0.20,z:0.70});
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 = 55000.0;
const BF = 6000.0;
const maxkmh = 50;
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.45;
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();
}
There you go. I may tweak it some more but for now it rolls over and jumps and lands as one would expect. Had an issue when adjusting the suspension range where it seemed to simply shut off the suspension. Very odd but shouldn't happen with these numbers.
Some Vidya..