• FEATURED
• FEATURED
• FEATURED
• FEATURED
• FEATURED

View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

Sign up now

# Dealing with multiple collision contact points

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

4 replies to this topic

### #1pondwater  Members

Posted 17 February 2012 - 01:33 PM

I use a swept sphere vs a std::vector<Triangle> for my narrowphase CD, I store the contact data in the following struct:

struct CollisionPackage {
bool collision;
float t;
float distance_from_collision;
float sqr_distance_from_collision;
Vector collision_point;
Vector collision_normal;
}


Now when dealing with multiple collision points, Im wondering what would be more efficient performance wise:

A) Create a std::vector<CollisionPackage>; one for every detected collision point. Once every triangle has been checked, sort through these and return the closest point (may be mutliple if more than one occurance of closest distance).

B) Once a single collision point is detected, check through the current std:::vector<CollisionPackage>, if its sqr_distance_from_collision or t value is lower than all current values, clear the std::vector and add this point. If it is equal sqr_distance_from_collision or t, add it to the vector. If less than, ignore it.

In terms of operations it would seem that B) would be more efficient as it contains less .push_back() calls. Is there any case where i would want to hold onto non-closest collisions?

### #2Net Gnome  Members

Posted 17 February 2012 - 02:12 PM

in my 2d collision detection and response routine, the sum of the minimum translation vectors (MTV) of all the collision detection points will move an object out of all collisions. I just store a list of all colliding objects (not duplicating in case two collision points collide with the same object). I then calc the MTV between the colliding object each target object separately and move them apart for each collision. The sum is always the position for no collision.

### #3pondwater  Members

Posted 17 February 2012 - 02:53 PM

my game is in 3D. Preventing the sphere from intersecting is simple as I can use any of the closest contact points if they all share the same t values. But using your method, if hypotheically I averaged all the normals of my closets collsion points, would that give me an appropriate sliding plane?

I was originally going to do the following:

case A) 1 contact point, plane origin = contact point, plane normal = collision normal
case B) 2 contact points, plane origin = either point, plane normal = (sphere origin at contact) - ((pointA + pointB)/2)
case C) 3+ contact points, plane origin = any point, plane normal = cross(b - a, c - a)

### #4Net Gnome  Members

Posted 17 February 2012 - 06:48 PM

If you determine the normal for which would require the least amount of translation to separate the objects, that normal summed with any other minimum translation normals from other objects should theoretically be summable to remove the object from all collisions. in 2D, the normal aligns with an axis, in 3d it should align with a plane. So those 3 cases should help determine the appropriate normal of the intersecting plane to translate on to move your minimal distance

### #5raigan  Members

Posted 24 February 2012 - 07:00 PM

in my 2d collision detection and response routine, the sum of the minimum translation vectors (MTV) of all the collision detection points will move an object out of all collisions.

Are you sure this is correct? I can think of many configurations where you can't get the global correct value by summing the local solutions (e.g if a circle is colliding with two planes whose normals face each other, summing the MTV will give incorrect results)

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.