Edge versus edge can actually be transformed to be similar to vertex versus face.
In short, vertex versus face with linearly moving vertices is done by:
- Convert to vertex versus plane by determining the plane equation for the face
- Convert to origin versus plane by considering the problem relative to the vertex
- Solve the resulting cubic equation, or use the quadratic approximation, to get the potential collision time values
- Check each potential collision time for actual collision by evaluating the vertex positions at those times and doing a vertex inside/outside face check
The edge versus edge case can be converted to a vertex versus plane problem by collapsing one edge to a point, and extruding the other edge in the same direction to form a quadrilateral.
Compute the plane equation for that quadrilateral, and now you have a vertex versus plane problem just like with vertex-face.
Solve as before (steps 2 and 3) to get the potential collision times, and check each time with a full edge versus edge intersection test. And yes, this last step does have an annoying number of cases to check with some care needed for numeric stability.
Some care also has to be taken when computing the plane equation due to degeneracies, for example if the two edges are parallel at the start or end of the time interval.
I then put the resulting edge-edge collision data in an array similar to what SContact is for vertex-face, and process it in btSoftBody::PSolve_SContacts().
---JvdL---