Sign in to follow this  

Dealing with multiple collision contact points

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

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

[CODE]
struct CollisionPackage {
bool collision;
float t;
float distance_from_collision;
float sqr_distance_from_collision;
Vector collision_point;
Vector collision_normal;
}
[/CODE]


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?

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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)

Share this post


Link to post
Share on other sites
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 :)

Share this post


Link to post
Share on other sites
[quote name='Net Gnome' timestamp='1329509527' post='4913998'] 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.[/quote]

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)

Share this post


Link to post
Share on other sites

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