Rolling Motion

Started by
7 comments, last by Squirm 19 years, 1 month ago
Hi, guys. I'm having problems understanding rolling motion. Specifically, I am trying to simulate physically accurate pool ball movement. I'll tell you what I understand so far and what I don't. Hopefully, some of you can clear up my misconceptions and explain the answers to my questions: If the ball is hit hard enough, it slides at first. Because of kinetic friction, w gets bigger in the direction of motion, v gets smaller. When v = w x r, rolling motion now starts. From what I read, this type of motion is identical to sliding except with a much smaller coefficient of rolling friction. However, this doesn't make sense to me. I mean once v = w x r, the ball's gonna be rolling, but if v keeps decreasing and w keeps increasing, this condition is gonna break the next frame. And if w always increases, how is the ball gonna stop? Basically, I'm very confused about the transition from sliding motion to rolling motion, the conditions for each motion, and the movement of the ball during each type of motion. I'm very sorry, as this is a lot to explain, but if someone can even "common sensically" explain to me what's going on, I'd really appreciate it because I've read many tutorials and can't understand how this works.
Advertisement
Once the ball is rolling true, there is no motion of the point making contact with the table relative to the ball. That is, if you take the velocity of the point of contact, it is 0. So as far as the standard friction model is concerned, the object is at rest so no frictional force is applied. As the velocity of the COM slows due to viscous drag, w x r will be larger than v and a the relative velocity of contact is > 0 so a small frictional force is applied to w in the direction of v. This slows w and increases v restoring the balance.

These forces by themselves aren't really enough to stop the ball rolling true realistically. In practice, you need to add some rolling friction to slow the object rolling true.

Th ebest explaination I have seen of how this works in life, is that the compression of the rolling object and the surface it is rolling on leads to the object actually continuously rolling up a small hill.

I googled a site that has a good set of diagrams.
http://webphysics.davidson.edu/faculty/dmb/PY430/Friction/rolling.html
So how would I incorporate this into the equation. Like can someone post short pseudocode like:

if(rolling())   v = ...;   w = ...;else   v = ...;   w = ...;bool rolling(){   ...}
Please, guys. Even something common sense would do. Like "the ball starts rolling when... At this point, v =...." Please, I don't expect you to type up a thesis on rolling motion, but I would really appreciate ANY type of help.
Sorry, missed your reply.

You need to just make the coefficient of rolling friction another variable. It is much less than kinetic friction though. For example if the kinetic friction is something like 0.8, the rolling friction would be more like 0.01 or less. I just apply that as a damping on the angular velocity just as viscous drag acts on the linear velocity.

Don't set up special cases like you have in your code sample. Just have a general model that applies kinetic friction and rolling friction when the surfaces are in contact. Viscous drag would always be applied even if not in contact with the ground.
There is no 'real way' of solving this problem. I have solve it however. It takes into account "real physics" but because there's no exact formula for how to do it, this is considered an ad-hoc method.

So, you already established that friction in itself won't bring the ball to rest. That's because it's a mathematically perfect sphere, and it 'sits' on a single point on the table. This means that the normal force (the force of the table pushing up on the ball) doesn't exert a torque on the ball, correct? This should make sense to you because the normal to the surface always points through the ball's center of mass.

Now, the "real" reason spheres come to rest is because spheres in real life, no matter how rigid you think they are, aren't 100% rigid and they never sit on a single point, they always rest over an area. The same is true for the plane that they sit on. Say you roll a billiard ball across the pool table. The fabric of the pool table bunches up in front of the billiard ball producing another torque which bleeds kinetic energy from the system and eventually makes it come to rest. This is what someone earlier said, it's like it's perpetually rolling up a hill when it's moving (even when it's on an incline).

So, in practice, I have solved it a different way (in code). My implementation may not make sense, but when there is a friction force to be applied, I change the direction of the normal force such that it points against the direction of the object's velocity. And, the effect is that the ball rolls for a while, taking into account kinetnc and static friction where applicable, but eventually comes to rest. Here's my implementation:

/*	December	4, 2004*/void	Physics::WorldImpulseOnSphere(PhysicsObject*a,InteractionData*b){	Vector3D	ContactPointVelocity	=	a->mLinearVelocity	+	CrossProduct(&a->mAngularVelocity,&b->Position);		double	NormalSpeed	=	DotProduct(&ContactPointVelocity,&b->Normal);	Vector3D	NormalComponent	=	b->Normal	*	NormalSpeed;	Vector3D	TangentComponent	=	ContactPointVelocity	-	NormalComponent;	double	TangentSpeed	=	TangentComponent.GetLength();	Vector3D	TangentDir(0,0,0);	if(TangentSpeed	>	0)	{		TangentDir	=	TangentComponent	/	TangentSpeed;	//normalizes the direction	}		Vector3D	CorrectedNormal	=	b->Normal	-	(a->mNormalizedLinearVelocity.Dir	*	.1);	CorrectedNormal.Normalize();		double		CorrectedNormalSpeed	=	DotProduct(&ContactPointVelocity,&CorrectedNormal);	//Must do this, else the impulse won't support the object enough in the																								//geometric normal direction and the object could fall through the world	double		NormalForce	=	WorldGetForceLinearOnSphere(a,b,CorrectedNormalSpeed);	//	a->mLinearVelocity	+=	(b->Normal	*	(NormalForce	/	a->mMass));	a->mLinearVelocity	+=	(CorrectedNormal	*	(NormalForce	/	a->mMass));	Vector3D	ActualFrictionForce(0,0,0);		double		ImpulseToStop(0);	double		ImpulseToStopNumerator	=	TangentSpeed;		double		InverseInertia	=	1/(.4	*	a->mMass	*	a->mRadius	*	a->mRadius);		Vector3D	RCrossNOverI	=	CrossProduct(&b->Position,&TangentDir)	*	InverseInertia;	double		ImpulseToStopDenominator	=	((1/a->mMass)	+ 		DotProduct(&CrossProduct(&RCrossNOverI,	&b->Position),&TangentDir)	/*		n	*	((r x n)/i x r)		*/	);	ImpulseToStop	=	ImpulseToStopNumerator	/	ImpulseToStopDenominator;	if(ImpulseToStop	<	(NormalForce	*	a->mStaticStickiness))	{		ActualFrictionForce	=	TangentDir	*	-1	*	ImpulseToStop;		/*			As an extra source of resistance, the surface normal bunches up in front of the ball inducing			an extra source of resistance to rotational motion.  It can be approximately equal to a fourth			of the friction force applied at a fourth of the distance away, 			but there's no way to really know for sure		*/	//	a->mLinearVelocity	*=	1-(.1*mFrameTime);		}	else	{		ActualFrictionForce	=	TangentDir	*	-1	*	(NormalForce	*	a->mDynamicStickiness);	}	a->mLinearVelocity	+=	ActualFrictionForce	/	a->mMass;		ApplyTorqueOnSphere(a,&b->Position,&ActualFrictionForce);		this->UpdateNormalizedAngularVel(a);	this->UpdateNormalizedLinearVel(a);}


EDIT:
also, there are no amateur problems with the concept. For instance, the normal force in the original normal direction doesn't decrease in magnitude (otherwise it could fall through the plane) I have taken things like that into account, and I typically know what I'm doign (although the next post willb e somebody pointing out a math mistake knowing mein luck lol)

Also ask me to in detail better explain what I am talking about. It's really just waht the others were speaking of however.
The thing is, I understand that there's kinetic friction and rolling friction and that the former is a lot bigger than the former. However, I am confused about when to use which. Also, the coefficient just affects the magnitude of the friction vector. As far as I can see, friction will still increase w and decrease v. So how does it all fit together?
Sorry I've not been of help. :(
Maybe someone else can explain better my solution (if it really was a "solution" [grin]).
Fil (il genio)
There is no when to use each - use both - the rolling friction is so small that you won't notice it when you are sliding, and when you are rolling the normal friction is so small that the rolling friction makes a difference, and when you are putting spin on a snooker ball they both apply in different directions, and it all just balances out.

TotalForce = NormalFriction + RollingFriction

There is no if statement :o)

This topic is closed to new replies.

Advertisement