Many have reported a problem with terrain and vehicles using the physics engine. I believe that the reason for this, is that the last entity enabled in the physics engine will have faulty collision on terrain. Here is some vehicle code that will keep all 4 tires working well. Cheers - to Ventilator for getting me started.

Instructions:

1. Create 4 wheels, make sure there origins are set right!
2. Create your vehicle body.
3. Apply the code.

Code:


//---------------------------------------------------------------------------------------------------------------------------
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::Variables(Defines)::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//---------------------------------------------------------------------------------------------------------------------------

//Wheel & Kart Defines
entity* player;
entity* wheel_fr;
entity* wheel_fl;
entity* wheel_bl;
entity* wheel_br;

var FR_wheel_ID;
var FL_wheel_ID;
var RL_wheel_ID;
var RR_wheel_ID;

var p1[3];
var p2[3];
var p3[3];
var p4[3];
var p5[3];
var p6[3];

//Environment Defines

var earth_gravity[3] = 0,0, -2086;
var mars_gravity[3] = 0,0, -600;

var wheel_friction = 120;
var wheel_mass = 130;
var wheel_bounciness = 1;
var wheel_minimumSpeed = 7;

var kart_mass = 130;
var kart_friction = 40;
var kart_bounciness = 1;
var kart_minimumSpeed = 5;

// Movement Defines
var m1_1[3];
var m1_2[3];
var m2[3];
var wheel_target;

//---------------------------------------------------------------------------------------------------------------------------
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::PowerSlide(settings)::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//---------------------------------------------------------------------------------------------------------------------------


//---------------------------------------------------------------------------------------------------------------------------
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::Kart(settings)::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//---------------------------------------------------------------------------------------------------------------------------

action kart // the kart action
{
my.pan += 180;
p_player = me;

p_player.overlay = off;
p_player.flare = off;
p_player.bright = off;
p_player.transparent = off;
p_player.ambient = 50;

ph_setgravity(earth_gravity);
phent_settype(my,PH_RIGID,PH_poly);
phent_setgroup(my,2);
phent_setmass(my,kart_mass,PH_poly);
phent_setfriction(my,kart_friction);
phent_setelasticity(my,kart_bounciness,kart_minimumspeed);
}

//---------------------------------------------------------------------------------------------------------------------------
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::FrontLeft(Wheel)::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//---------------------------------------------------------------------------------------------------------------------------

action fl_wheel
{
my.pan += 180;

p_FL_tyre=my;

phent_settype(my,PH_RIGID,PH_sphere);
phent_setgroup(my,2);
phent_setmass(my,wheel_mass,PH_sphere);

phent_setfriction(my,wheel_friction);
phent_setelasticity(my,wheel_bounciness ,wheel_minimumSpeed);
phent_setdamping(my,20,20);

vec_set(p2,vector(0,0,1));
vec_set(p3,vector(0,1,0));
vec_set(p4,vector(-40,40,0));
vec_set(p6,vector(0,0,0));
FL_wheel_ID=phcon_add(PH_WHEEL,p_player,my);
phcon_setparams1(FL_wheel_ID,my.x,p2,p3);
phcon_setparams2(FL_wheel_ID,p4,nullvector,p6);
}

//---------------------------------------------------------------------------------------------------------------------------
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::FrontRight(Wheel)::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//---------------------------------------------------------------------------------------------------------------------------

action fr_wheel//front right tire
{
my.pan += 180;

p_FR_tyre=my;

phent_settype(my,PH_RIGID,PH_sphere);
phent_setgroup(my,2);
phent_setmass(my,wheel_mass,PH_sphere);

phent_setfriction(my,wheel_friction);
phent_setelasticity(my,wheel_bounciness ,wheel_minimumSpeed);
phent_setdamping(my,20,20);

vec_set(p2,vector(0,0,1));
vec_set(p3,vector(0,1,0));
vec_set(p4,vector(-40,40,0));
vec_set(p6,vector(0,0,0));
FR_wheel_ID=phcon_add(PH_WHEEL,p_player,my);
phcon_setparams1(FR_wheel_ID,my.x,p2,p3);
phcon_setparams2(FR_wheel_ID,p4,nullvector,p6);
}

//---------------------------------------------------------------------------------------------------------------------------
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::BackLeft(Wheel)::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//---------------------------------------------------------------------------------------------------------------------------

action bl_wheel //back left tire
{
my.pan += 180;

p_RL_tyre=my;

phent_settype(my,PH_RIGID,PH_sphere);
phent_setgroup(my,2);
phent_setmass(my,wheel_mass,PH_sphere);

phent_setfriction(my,wheel_friction);
phent_setelasticity(my,wheel_bounciness ,wheel_minimumSpeed);
phent_setdamping(my,20,20);

vec_set(p2,vector(0,0,1));
vec_set(p3,vector(0,1,0));
vec_set(p4,vector(0,0,0));
vec_set(p6,vector(0,0,0));
RL_wheel_ID=phcon_add(PH_WHEEL,p_player,my);
phcon_setparams1(RL_wheel_ID,my.x,p2,p3);
phcon_setparams2(RL_wheel_ID,p4,nullvector,p6);
}

//---------------------------------------------------------------------------------------------------------------------------
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::BackRight(Wheel)::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//---------------------------------------------------------------------------------------------------------------------------

action br_wheel
{
my.pan += 180;

p_RR_tyre=my;

phent_settype(my,PH_RIGID,PH_sphere);
phent_setgroup(my,2);
phent_setmass(my,wheel_mass,PH_sphere);

phent_setfriction(my,wheel_friction);
phent_setelasticity(my,wheel_bounciness ,wheel_minimumSpeed);
phent_setdamping(my,20,20);

vec_set(p2,vector(0,0,1));
vec_set(p3,vector(0,1,0));
vec_set(p4,vector(0,0,0));
vec_set(p6,vector(0,0,0));
RR_wheel_ID=phcon_add(PH_WHEEL,p_player,my);
phcon_setparams1(RR_wheel_ID,my.x,p2,p3);
phcon_setparams2(RR_wheel_ID,p4,nullvector,p6);
}

//---------------------------------------------------------------------------------------------------------------------------
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::Control(Input)::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//---------------------------------------------------------------------------------------------------------------------------

function control()
{
while(1)
{
if(key_a == 1)
{
wheel_target=-30;
}

if(key_d == 1)
{
wheel_target= 30;
}

if(key_a == 1 && key_d == 1)||(key_a == 0 && key_d == 0)
{
wheel_target=0;
}

if(key_s == 1)
{
vec_set(m2,vector(800,1000,0));
}

if(key_w == 1)
{
vec_set(m2,vector(-400,500,0));
}

if(key_w == 1 && key_s == 1)||(key_w == 0 && key_s == 0)
{
vec_set(m2,vector(0,0,0));
}

phcon_getposition(FR_wheel_ID,temp);
vec_set(m1_1,vector((wheel_target-temp.x)*0.2,500,0));

phcon_getposition(FL_wheel_ID,temp);
vec_set(m1_2,vector((wheel_target-temp.x)*0.2,500,0));

phcon_setmotor(FR_wheel_ID,m1_1,m2,nullvector);
phcon_setmotor(FL_wheel_ID,m1_2,m2,nullvector);
phcon_setmotor(RR_wheel_ID,nullvector,m2,nullvector);
phcon_setmotor(RL_wheel_ID,nullvector,m2,nullvector);

wait(1);
}
}

//---------------------------------------------------------------------------------------------------------------------------
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::Create(Player)::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//---------------------------------------------------------------------------------------------------------------------------

action Need_Me //Action for the last physics entity created
{
phent_settype(my,PH_RIGID,PH_sphere);
phent_setgroup(my,2);
phent_setmass(my,wheel_mass,PH_box);
}

function create_player()
{
ph_setgravity(vector(0,0,-380));
ph_setcorrections(30000,0.05);

ent_create(mdl_car, temp, kart);

vec_for_vertex(temp,p_player,627);
wheel_fr = ent_create("tirefr.mdl",temp,fr_wheel);

vec_for_vertex(temp,p_player,618);
wheel_fl = ent_create("tirefl.mdl",temp,fl_wheel);

vec_for_vertex(temp,p_player,614);
wheel_bl = ent_create("tirebl.mdl",temp,br_wheel);

vec_for_vertex(temp,p_player,634);
wheel_br = ent_create("tirebr.mdl",temp,bl_wheel);

vec_for_vertex(temp,p_player,634); // Note that I we have to create this so the collision detection works great for the original 4 wheels on terrain.
wheel_br = ent_create("tirebr.mdl",temp,Need_Me);
}




Check out Silas. www.kartsilas.com

Hear my band Finding Fire - www.myspace.com/findingfire

Daily dev updates - http://kartsilas.blogspot.com/