Dealing with multiple collision contact points

Started by
3 comments, last by raigan 12 years, 2 months ago
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?
Advertisement
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.
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)
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 :)
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)

This topic is closed to new replies.

Advertisement