Jump to content
  • Advertisement
Sign in to follow this  
MTclip

physics simulation timing help?

This topic is 4841 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Okay I have this little problem with my physics simulation... if i run this on a fast computer the guys cant move ... but on a slower one they move just fine... time is founf by... 1 / (float)fps ... I tired using "elapsed time" for time but that caused jumpy movement any help would be much appreciated. here is my simualtion code...

time = 1 / (float)fps;

void CActor::simulate(float time)
{
	m_VLastPosition		= m_VPosition;
	m_VLinearVelocity       += (m_VTotalForce / m_mass) * time;
	m_VPosition		+= m_VLinearVelocity * time;


	//MAKE SURE FRICTION DOES NOT CAUSE MOVEMENT *X*
	if(fabs(m_VLinearVelocity.m_x) >= fabs((m_VFrictionForce.m_x / m_mass) * time))
	{
		m_VLinearVelocity.m_x += (m_VFrictionForce.m_x / m_mass) * time;
	}
	else
	{
		m_VLinearVelocity.m_x = 0;
	}

	//MAKE SURE FRICTION DOES NOT CAUSE MEVEMENT *Y*
	if(fabs(m_VLinearVelocity.m_y) >= fabs((m_VFrictionForce.m_y / m_mass) * time))
	{
		m_VLinearVelocity.m_y += (m_VFrictionForce.m_y / m_mass) * time;
	}
	else
	{
		m_VLinearVelocity.m_y = 0;
	}

	//DAMPING
	if(fabs(m_VLinearVelocity.m_x) < .5f)
	{
		m_VLinearVelocity.m_x = 0;
	}

	if(fabs(m_VLinearVelocity.m_y) < .5f)
	{
		m_VLinearVelocity.m_y = 0;
	}


	//reset
	m_totalTorque		= 0;
	m_totalImpulse		= 0;
	m_VTotalForce		= CVector(0,0);
	m_VFrictionForce	= CVector(0,0);

}



any ideas on how to make it run the same at all speeds... I know the problem may be in the DAMPING... but i have to get the ACTORS to stop some how?? [Edited by - MTclip on August 13, 2005 1:05:25 AM]

Share this post


Link to post
Share on other sites
Advertisement
The reason you have different results with different frame rates is this code:

m_VLastPosition = m_VPosition;
m_VLinearVelocity += (m_VTotalForce / m_mass) * time;
m_VPosition += m_VLinearVelocity * time;
Though your computation might seem correct because it follows the equations v = v0 + at and p = p0 + vt, the equations assume that a and v are constant, and v is not constant. The result is that your code is only approximately correct and the frame rate affects the amount of error. There are a couple things you can do to fix the problem. One would be to switch to a better approximation (look up verlet or Runga-Kutta integration). Another way is to simply use equations that give the correct results:

v = v0 + at
p = p0 + v0t + at2/2

Using these, your code would look like this:

m_VLastPosition = m_VPosition;
m_VLastLinearVelocity = m_VLinearVelocity;
m_VLinearVelocity += (m_VTotalForce / m_mass) * time;
m_VPosition += m_VLastLinearVelocity * time + (m_VTotalForce / m_mass) * time * time * 0.5f;
Now, assuming that the acceleration due to friction is constant, you need handle friction in your code in the same way. If friction depends on velocity, then there are still equations that give the correct results, but they are complicated and expensive (they involve ekt), and you might instead want to go with a better method of approximation.

Share this post


Link to post
Share on other sites
ok first of thanks for the help...

second.. I have still not gotten the timing correct...
with what you wote are you suggesting that i take out my whole simulation code and use what you provided.. simply replace the top portion of my code..

for my step i use 1/FPS ..but this is calculated and averaged only once per second.. thus allowing inacturate step... is that a problem...
should i instead switch to an elapsedtime on a perframe basis...

thanks agian

Share this post


Link to post
Share on other sites
Try replacing the top part and the friction part. I would also remove the damping until things work right.

Calculating 1/fps once per second might be ok. Generally, people use the duration of the frame directly. Sometimes, people use a moving average to smooth out any spikes in the frame rate.

Share this post


Link to post
Share on other sites
okay.. well replacing the friction part certainly helped alot.. though its not perfect (but what is)

one final question(hopefuly)
I have projectiles that recieve a large amount of force on a single frame wich causes error when there is a spike in delta Time...
so

where this = the projector
m_pEquipedItem = projectile

CVector2D dist((this->m_pEquipedItem->m_CollisionPoint) - (this->m_CollisionPoint));
CVector2D tempVelocity(this->m_VLinearVelocity);
tempVelocity.normalize();
dist += tempVelocity;
dist.m_x *= 30000;
dist.m_y *= 30000;
this->m_pEquipedItem->applyLinearForce(dist);

thats not the full source.. but basically it gets the angle the projector is facing and shoots/throws the projectile in that direction...

the 30000 is just some number that i found that works (for the most part)
idealy it will be based off the projectors strength..

so is there a way to go about correcting the error from frame spikes...
perhaps a better solution would be to limit the frame rate that way i can find a delta time from the constant frame rate ..

or maybe only do simulations at certain delta times ....

thanks for the help.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!