i would like to make the movement of a plane framerate independant. It includes both rotation and acceleration.
Here is my actual code:
Code: Select all
void Vehicule::update(scene::ICameraSceneNode *camera, PlayerEventReceiver *r)
{
core::vector3df a, ar;//acceleration / acceleration of rotation
core::matrix4 n;
//frametime
u32 time = u->device()->getTimer()->getTime();
u32 delta = time - lasttime;
lasttime = time;
m.setRotationDegrees(node->getRotation());
core::vector3df campos(-1000, 500, 0);
//FORCES
//engine
if(r->IsKeyDown(KEY_KEY_Z))
{
ar += core::vector3df(0, 0, -0.005);
}
if(r->IsKeyDown(KEY_KEY_S))
{
ar += core::vector3df(0, 0, 0.005);
}
if(r->IsKeyDown(KEY_KEY_Q))
{
ar += core::vector3df(0.01, 0, 0);
}
if(r->IsKeyDown(KEY_KEY_D))
{
ar += core::vector3df(-0.01, 0, 0);
}
if(r->lmbPressed())
{
a += core::vector3df(0.01, 0, 0);
}
if(r->rmbPressed())
{
a += core::vector3df(-0.001, 0, 0);
}
if(r->IsKeyDown(KEY_SPACE))
{
campos = core::vector3df(1200, 500, 0);
}
//frictions
vr -= u->friction() * vr * delta;
v -= u->friction() * v * delta;
//position update (supposed to be framerate independent)
core::vector3df newpos;
newpos = v * delta + 0.5 * a * delta * delta;
v += a * delta;
m.transformVect(newpos);
//rotation update (clearly not framerate independent)
core::vector3df newrot = vr * delta + 0.5 * ar * delta * delta;
n.setRotationDegrees(vr);
vr += ar * delta;
m *= n;
m.transformVect(newrot);
newrot = m.getRotationDegrees();
//apply updates
node->setPosition(node->getPosition() + newpos);
node->setRotation(newrot);
camera->setPosition(campos);
//camera
core::vector3df c = core::vector3df(0, 1, 0);
m.transformVect(c);
camera->setUpVector(c);
}
Can someone help me ?
Thanks.