Sign in to follow this  

Collisions, linear momentum and angular momentum

This topic is 2336 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

So I have this situation in a collision. Two OBBs with a linear velocity (represented with the green arrows), no angular velocity, point of contact (yellow dot), and normal from object A to B (red arrow)
[img]http://lazyfoo.net/files/collision.png[/img]
I'm looking to make this a elastic collision. My system allows for angular movement (angular velocity, torque, etc).

My question is, is any the linear momentum from this collision supposed to be turned into angular momentum on collision? My intuition and amnesia of physics says yes.

Share this post


Link to post
Share on other sites
Yes, at a continuous level, there will be angular momentum in the general case: if the red arrow is the force applied to the upper box at the yellow point, as long as it does not go toward the center of mass of the box, it will induce some rotation (I think it's called "torque").

Now if you want to resolve all this in 1 step, I have no idea ... I guess it depends on some "elasticity" parameters.

Share this post


Link to post
Share on other sites
If you want a full deriviation; i can give you one. But basicly:

[code]
fun resolve(body b1, body b2, vec contact_point, vec contact_normal, real elasticity in [0,1]) {
vec r1 = b1.position - contact_point;
vec r2 = b2.position - contact_point;
real cx1 = perpdot(contact_normal, r1);
real cx2 = perpdot(contact_normal, r2);

vec vrel = b2.velocity + perpdot(b2.angularVel, r2) - b1.velocity - perpdot(b1.angularVel, r1);
real vdot = dot(contact_normal, vrel);
if(vdot < 0.0d) return; //don't want to do anything if bodies are already seperating. (this depends on whether contact_normal is on body1, or body2 for the sign)

real K = b1.inv_mass + b2.inv_mass + cx1*cx1*b1.inv_inertia + cx2*cx2*b2.inv_inertia;
real lambda = -(1+elasticity) * vdot / K;

vec imp = contact_normal * lambda;
b1.velocity -= imp*b1.inv_mass;
b1.angularVel -= cx1*lambda*b1.inv_inertia;
b2.velocity += imp*b2.inv_mass;
b2.angularVel += cx2*lambda*b2.inv_inertia;
}
[/code]

Share this post


Link to post
Share on other sites

This topic is 2336 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.

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