i just tried the panzer out and mentioned, the turret just jumps between max and min positions during controlling, or have i just got a bad link ? ... if its truly bad, i played whyte it a little :
//vehicle script file
//see http://xtrac.outerra.com/index.fcgi/wiki/vehicle for example and documentation
var turret,mantlet,barrel;
const MaxTurretXSpeed = 10; //deg/s
const MaxTurretYSpeed = 10; //deg/s
const MaxTurretXAccel = 120;//deg/s^2
const MaxTurretYAccel = 160;//deg/s^2
const MinTurretAngle = -8; //in deg gun depression
const MaxTurretAngle = 10; //in deg gun elevation
const TurningBoost = 0.4; //boost coefficient to help with turning at speed
const TurnForceCoef = 0.8; //portion of engine force for neutral turns
const RollingFriction = 1000;//force that needs to be overcome to get wheels turning
const EF = 25000.0; //engine force
const BF = 20000.0; //braking force
const EFr = 0.02; //engine force reduction coef with speed
const maxkmh = 40; //top speed
function radians(v){
return v*Math.PI/180.0;
}
//invoked only the first time the model is loaded, or upon reload
function init_chassis(){
var wheelparam = {
radius: 0.50,
width: 0.20,
suspension_max: 0.25,
suspension_min: -0.25,
//ride height
suspension_stiffness: 3.9,
damping_compression: 0.5,
damping_relaxation: 0.4,
slip: 0.5,
slip_lateral_coef: 0.7,
roll_influence: 0.1
//rotation: -1
};
this.add_wheel('2a', wheelparam);
this.add_wheel('2b', wheelparam);
this.add_wheel('3a', wheelparam);
this.add_wheel('3b', wheelparam);
this.add_wheel('4a', wheelparam);
this.add_wheel('4b', wheelparam);
this.add_wheel('5a', wheelparam);
this.add_wheel('5b', wheelparam);
this.add_wheel('6a', wheelparam);
this.add_wheel('6b', wheelparam);
this.add_wheel('7a', wheelparam);
this.add_wheel('7b', wheelparam);
this.add_wheel('8a', wheelparam);
this.add_wheel('8b', wheelparam);
this.add_wheel('9a', wheelparam);
this.add_wheel('9b', wheelparam);
this.add_wheel('10a', wheelparam);
this.add_wheel('10b', wheelparam);
var geom = this.get_geomob(0);
turret = geom.get_joint('turret');
mantlet = geom.get_joint('mantlet');
barrel = geom.get_joint('barrel');
this.load_sound("tiger2_eng_starter.ogg");
this.load_sound("tiger2_forward.ogg");
this.load_sound("turret.ogg");
this.add_sound_emitter("turret");
this.add_sound_emitter("mantlet");
return {mass:20000, com:{z:0.1,y:0.0}, steering:2.0, steering_ecf:60, centering: 100, centering_ecf:20,
};
}
//invoked for each new instance of the vehicle
function init_vehicle(){
//this.set_fps_camera_pos({x:-0.5,y:2.15,z:1.14});//commander view
this.set_fps_camera_pos({x:-0.5,y:-0.3,z:2.5});//driver view
this.snd = this.sound();
this.snd.set_ref_distance(0, 15.0);
this.geom = this.get_geomob(0);
this.turx = new axis_integrator(radians(MaxTurretXSpeed), radians(MaxTurretXAccel));
this.tury = new axis_integrator(radians(MaxTurretYSpeed), radians(MaxTurretYAccel), radians(MinTurretAngle), radians(MaxTurretAngle));
this.turretsnd = 0;
}
//invoked when engine starts or stops
function engine(start){
if(start){
this.snd.play(0, 0, false, false);
this.snd.play(0, 1, true, true);
}
else
this.snd.stop(0);
this.started = start;
}
//handle extra actions
function action(k,v,dt)
{
switch(k){
//Turret movements
case ATurretX: this.turx.set(v); break;
case ATurretY: this.tury.set(v); break;
}
}
const forceloss = 1.0 / (EFr*maxkmh + 1);
//invoked each frame to handle the inputs and animate the model
function update_frame(dt, engine, brake, steering)
{
//turret handling
var tmov=false;
if(this.turx.changed(dt)){
this.geom.rotate_joint_orig(turret, this.turx.value, {x:0,y:0,z:-1});
tmov = true;
}
if(this.tury.changed(dt)){
this.geom.rotate_joint_orig(mantlet, this.tury.value, {x:1,y:0,z:0});
tmov = true;
}
if(tmov) {
if(!this.turretsnd)
this.snd.play_loop(1, 2);
}
else this.snd.stop(1);
this.turretsnd = tmov;
var kmh = this.max_tire_speed()*3.6;
//reduce engine force with speed (hack)
var esign = engine<0 ? -1 : 1;
engine = EF*Math.abs(engine);
var force = (esign>0) == (kmh>=0)
? 1.0/(EFr*Math.abs(kmh) + 1)
: 1.0;
force -= forceloss;
force = esign*Math.max(0.0, Math.min(force, 1.0));
engine *= force;
this.snd.set_pitch(0, 1+0.01*kmh);
//if(steering!=0) engine *= 1.5;
//var el = steering>0 ? 0 : engine;
//var er = steering<0 ? 0 : engine;
var df = EF*TurnForceCoef*force;
var el=engine,er=engine;
var spd = 1 + TurningBoost*this.speed();
if(this.started){
if(steering>0){
el-=spd*df; er+=df;
}
else if(steering<0){
er-=spd*df; el+=df;
}
}
this.wheel_force(-2, el);
this.wheel_force(-3, er);
brake *= BF;
brake += RollingFriction;
this.wheel_brake(-1, brake);
//this.log_inf("L:"+el+" R:"+er+" B:"+brake+" SPD:"+kmh);
//this.geom.rotate_joint_orig(turret, this.turx, {x:0,y:0,z:-1});
//this.geom.rotate_joint_orig(mantlet, this.tury, {x:1,y:0,z:0});
this.animate_wheels();
}