   Simple 2D Collision question
  I''m trying to figure out how to model a simple collision. Here''s the picture of the situation I''m trying to model http://www.coe.uncc.edu/~dmarkham/Collision.gifRight now I just have the two balls exchanging velocity vectors, which works only for head-on collisions and not the above scenario where the balls collide at an angle. I have no problem detecting when theres a collision, I just can''t figure out how to model the effects of the collision. Can someone please push me in the right direction? 
  Follow the principle of conservation of momentum:(m1 x v1) + (m2 x v2) = (m1+m2)vfinalm1 = mass of first ballv1 = velocity of first ballm2 = mass of second ballv2 = velocity of second ballvfinal is the velocity of both balls after collision.This will help you ensure the right velocity.The right direction can be calculated as follows:Project a vector from the center of the first sphere to the center of the second sphere. This vector acts as the normal vector for the collision of the second ball (youll need to flip it to get the normal for the first collision) - essential if you want to get the correct direction.Now, the original velocity vector needs to be rotated around the normal for the collision. The reflection vector is: V' = -V + 2(N.V)NKeep in mind that the dot product produces a scalar which is then multiplied by the normal for that collision.Hope this helps - if youd like a picture representation of this phenomena: http://www-scf.usc.edu/~gamedev/MOMENTUM.JPGEmail me (p_samty@yahoo.com) if the link doesnt work and ill fix it.   [edited by - psamty10 on February 8, 2004 11:44:36 PM] [edited by - psamty10 on February 8, 2004 11:45:17 PM];  here is a code dump to illustrate psamty10''s solution.  //------------------------------------------------------// Check collision between boat and boat [j]<br></font><br><font color=gray><font color=gray>//——————————————————<br></font></font><br><br><font color=blue>int</font> GameBumperBoatRideClass::CheckBoatCollision(<font color=blue>int</font> i, <font color=blue>int</font> j)<br>{<br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=gray>// Creates two vectors containing the velocity of the boats.<br></font><br><font color=gray>// Velocity is both the direction and speed of the boats.<br></font><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br>Vector2 VelocityBoatOne = Boat[<font color=purple>i</font>].Velocity;<br>Vector2 VelocityBoatTwo = Boat[<font color=purple>j</font>].Velocity;<br><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=gray>// Creates two vectors containing the x and y <br></font><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br>Vector2 PositionBoatOne = Boat[<font color=purple>i</font>].Position;<br>Vector2 PositionBoatTwo = Boat[<font color=purple>j</font>].Position;<br><br><font color=blue>float</font> RadiusOfBoatOne = Boat[<font color=purple>i</font>].radius;<br><font color=blue>float</font> RadiusOfBoatTwo = Boat[<font color=purple>j</font>].radius;<br><br><font color=blue>float</font> TotalRadius = RadiusOfBoatOne + RadiusOfBoatTwo;<br><br>Vector2 DistanceBetweenBoats(PositionBoatTwo - PositionBoatOne);<br>Vector2 VelocityDifference(VelocityBoatTwo - VelocityBoatOne);<br><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=gray>// calculates the relative distance, squared<br></font><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=blue>float</font> DdotD = DistanceBetweenBoats.Dot(DistanceBetweenBoats); <br><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=gray>// boat didn''t collide<br></font><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=blue>if</font> (DdotD &gt; TotalRadius * TotalRadius) <br><font color=blue>return</font> <font color=blue>false</font>;<br><br><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=gray>// If the code gets to this point, the boats<br></font><br><font color=gray>// have collided. :)<br></font><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=blue>double</font> dlength = sqrt(DdotD);<br><br><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=gray>// Calculate the normal of this collision<br></font><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br>Vector2 Normal = DistanceBetweenBoats / dlength; <br><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=gray>// Calculate the depth of this collision<br></font><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=blue>float</font> depth = TotalRadius - dlength; <br><br><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=gray>// separate the boats a bit because they are overlapping<br></font><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=blue>float</font> sep_damping = 0.25f;<br><br>PositionBoatOne -= Normal * depth * sep_damping;<br>PositionBoatTwo += Normal * depth * sep_damping;<br><br><br>Boat[<font color=purple>i</font>].Position = PositionBoatOne;<br>Boat[<font color=purple>j</font>].Position = PositionBoatTwo;<br><br><font color=gray><font color=gray><font color=gray><font color=gray>//——————————<br></font></font></font></font><br><font color=gray>// collision impulse<br></font><br><font color=gray><font color=gray><font color=gray><font color=gray>//——————————<br></font></font></font></font><br><font color=blue>float</font> elasticity = 0.50f; <font color=gray>// very squishy collision<br></font><br><font color=blue>float</font> friction   = 0.15f; <font color=gray>// very little friction<br></font><br><br><font color=gray><font color=gray><font color=gray><font color=gray>//——————————<br></font></font></font></font><br><font color=gray>// collision impact stuff<br></font><br><font color=gray><font color=gray><font color=gray><font color=gray>//——————————<br></font></font></font></font><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=gray>// if boats not moving towards each other, no <br></font><br><font color=gray>// collision/impulse<br></font><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br>Vector2 V = VelocityDifference;<br><br><font color=blue>float</font> vn = V.Dot(Normal);<br><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=gray>// boats are separating, no impulse.<br></font><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=blue>if</font> (vn &gt; 0.0f)<br><font color=blue>return</font> <font color=blue>true</font>;<br><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=gray>// the velocity component from the collision plane<br></font><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br>Vector2 Vn = Normal * vn;<br>Vector2 Vt = V - Vn;<br><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=gray>// apply response<br></font><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=gray>// the collision result apply elasticity and friction<br></font><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br>Vn *= -(1.0f + elasticity);<br>Vt *= -friction;<br><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=gray>// the resulting velocity<br></font><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br>V = Vn + Vt;<br><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><font color=gray>// the lighter objects will move more than the heavier one<br></font><br><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>//———————————————————–<br></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><br><br><font color=blue>int</font> Mass2 = Boat[<font color=purple>j</font>].Mass;<br><font color=blue>int</font> Mass1 = Boat[<font color=purple>i</font>].Mass;<br><br><br><br>VelocityBoatOne -= V * Mass2 / (Mass1 + Mass2);<br>VelocityBoatTwo += V * Mass1 / (Mass1 + Mass2);<br><br>Boat[<font color=purple>i</font>].Velocity = VelocityBoatOne;<br>Boat[<font color=purple>j</font>].Velocity = VelocityBoatTwo;<br><br><font color=blue>return</font> 1;<br>}<br></pre><!–ENDSCRIPT–>    