framerate independent rotation

If you are a new Irrlicht Engine user, and have a newbie-question, this is the forum for you. You may also post general programming questions here.
Post Reply
Glaucos
Posts: 4
Joined: Fri Apr 06, 2012 7:15 pm

framerate independent rotation

Post by Glaucos »

Hi,

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);
}
 
im not used to accelerated rotation movement so i must have done a mistake...
Can someone help me ?

Thanks.
Post Reply