![]() |
Jolt Physics
A multi core friendly Game Physics Engine
|
#include <EPAPenetrationDepth.h>
Public Types | |
| enum class | EStatus { NotColliding , Colliding , Indeterminate } |
| Return code for GetPenetrationDepthStepGJK. More... | |
Implementation of Expanding Polytope Algorithm as described in:
Proximity Queries and Penetration Depth Computation on 3D Game Objects - Gino van den Bergen
The implementation of this algorithm does not completely follow the article, instead of splitting triangles at each edge as in fig. 7 in the article, we build a convex hull (removing any triangles that are facing the new point, thereby avoiding the problem of getting really oblong triangles as mentioned in the article).
The algorithm roughly works like:
Return code for GetPenetrationDepthStepGJK.
|
inline |
Test if a cast shape inA moving from inStart to lambda * inStart.GetTranslation() + inDirection where lambda e [0, ioLambda> intersects inB
| inStart | Start position and orientation of the convex object |
| inDirection | Direction of the sweep (ioLambda * inDirection determines length) |
| inCollisionTolerance | The minimal distance between A and B before they are considered colliding |
| inPenetrationTolerance | A factor that determines the accuracy of the result. If the change of the squared distance is less than inTolerance * current_penetration_depth^2 the algorithm will terminate. Should be bigger or equal to FLT_EPSILON. |
| inA | The convex object A, must support the GetSupport(Vec3) function. |
| inB | The convex object B, must support the GetSupport(Vec3) function. |
| inConvexRadiusA | The convex radius of A, this will be added on all sides to pad A. |
| inConvexRadiusB | The convex radius of B, this will be added on all sides to pad B. |
| inReturnDeepestPoint | If the shapes are initially intersecting this determines if the EPA algorithm will run to find the deepest point |
| ioLambda | The max fraction along the sweep, on output updated with the actual collision fraction. |
| outPointA | is the contact point on A |
| outPointB | is the contact point on B |
| outContactNormal | is either the contact normal when the objects are touching or the penetration axis when the objects are penetrating at the start of the sweep (pointing from A to B, length will not be 1) |
|
inline |
This function combines the GJK and EPA steps and is provided as a convenience function. Note: less performant since you're providing all support functions in one go Note 2: You need to initialize ioV, see documentation at GetPenetrationDepthStepGJK!
|
inline |
Calculates penetration depth between two objects, second step (the EPA step)
| inAIncludingConvexRadius | Object A with convex radius |
| inBIncludingConvexRadius | Object B with convex radius |
| inTolerance | A factor that determines the accuracy of the result. If the change of the squared distance is less than inTolerance * current_penetration_depth^2 the algorithm will terminate. Should be bigger or equal to FLT_EPSILON. |
| outV | Direction to move B out of collision along the shortest path (magnitude is meaningless) |
| outPointA | Position on A that has the least amount of penetration |
| outPointB | Position on B that has the least amount of penetration Use |outPointB - outPointA| to get the distance of penetration |
|
inline |
Calculates penetration depth between two objects, first step of two (the GJK step)
| inAExcludingConvexRadius | Object A without convex radius. |
| inBExcludingConvexRadius | Object B without convex radius. |
| inConvexRadiusA | Convex radius for A. |
| inConvexRadiusB | Convex radius for B. |
| ioV | Pass in previously returned value or (1, 0, 0). On return this value is changed to direction to move B out of collision along the shortest path (magnitude is meaningless). |
| inTolerance | Minimal distance before A and B are considered colliding. |
| outPointA | Position on A that has the least amount of penetration. |
| outPointB | Position on B that has the least amount of penetration. Use |outPointB - outPointA| to get the distance of penetration. |