Sign in to follow this  
Gorbstein

Consistent mouse<->physics behaviour across machines

Recommended Posts

Gorbstein    120
Having a problem with my input, where the forces obtained from the mouse are not obtaining the same results when pushed into my (very simple) physics system, when run on slower/faster machines, or even just when I enable vsync.

The game is 2D top down. I'm using the delta X movement of the mouse per frame to add a rotational force to my spaceship.

So it looks something like this:


In my input component:
[code]
void playerControl()
{
float deltaX = input->getMouseXDelta();
physics->addRotationForce(deltaX);
input->clearMouseDeltas();

...the rest of the input...
}[/code]

in my physics component.......
[code]
void addRotationForce(float amount)
{
rotationForce+=amount;
}

//then on each timestep
void onUpdate(float deltaTime)
{
//apply forces
rotationalAcceleration = rotationForce / mass;
rotationalVelocity += (rotationalAcceleration * deltaTime);
heading += rotationalVelocity * deltaTime;

//simple friction
rotationalVelocity += (rotationalFriction*-rotationalVelocity*deltaTime);

//reset forces
rotationForce=0;
rotationalAcceleration = 0;

..other physics stuff...

}


[/code]

When I enable vsync or run on a slower machine, the mouse inputs seem to get massively multiplied and the ship spins too fast.

The input is coming from an Irrlicht device, which takes the windows mouse movement messages and adds them to a deltaX, then resets the cursor to screen centre. As you can see I reset the deltas every time I read them above.

It seems to me the physics isn't producing the same output when the mouse input forces are supplied in lots of small, frequent values (ie: when running at 500fps) when compared with far less, larger values (ie: running at 60fps with vsync).

I'm guessing the smaller, more frequent values may be getting 'eaten up' by the friction?

What am I doing wrong?

TIA
D

Share this post


Link to post
Share on other sites
Gorbstein    120
Hmm as usually happens, I spend hours working on this, then I solve it as soon as I post a message here......


Changed...
rotationalVelocity += (rotationalAcceleration * deltaTime);

To..

rotationalVelocity += rotationalAcceleration;

And this seems much better.

I'm guessing since the mouse movements will automatically be smaller for a smaller timestep that I shouldn't be factoring in DT here. I should only use that for keys that are pressed across frames...

D

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this