Improved SDF objective function.
For two colliding SDFs `A` and `B`, the function is `(A+B)+abs(max(A,B))`. This can also be written as `clearance + abs(intersection)`. This function has the following properties: - On the penetrating surface, it is equal to `A+B`, i.e. the clearance field which is the penetration depth. - The object boundary is a set of local minima in 3D space, since `abs(max(A, B))>0` away from the surface. - Along the penetrating surface, the maximum penetration is a local minimum of the clearance since this field is orthogonal to the midsurface field `A-B`, which acts as a support plane for the contact. [Level sets of the improved function for two colliding circles](https://www.wolframalpha.com/input?i=plot+sqrt%28x%5E2%2By%5E2%29-1+%2B+sqrt%28%28x-1%29%5E2%2B%28y-1%29%5E2%29-1+%2B+max%28max%28sqrt%28x%5E2%2By%5E2%29-1%2C+sqrt%28%28x-1%29%5E2%2B%28y-1%29%5E2%29-1%29%2C+0%29+-+min%28max%28sqrt%28x%5E2%2By%5E2%29-1%2C+sqrt%28%28x-1%29%5E2%2B%28y-1%29%5E2%29-1%29%2C+0%29+). PiperOrigin-RevId: 585106580 Change-Id: I5b18a1ef262ceb0a1ab8abcad8acfd6dc1992e2c
This commit is contained in:
committed by
Copybara-Service
parent
6a83b86553
commit
d070b1893e
@@ -28,7 +28,7 @@ typedef enum mjtSDFType_ { // signed distance function (SDF) type
|
||||
mjSDFTYPE_SINGLE = 0, // single SDF
|
||||
mjSDFTYPE_INTERSECTION, // max(A, B)
|
||||
mjSDFTYPE_MIDSURFACE, // A - B
|
||||
mjSDFTYPE_QUADRATIC, // max(A, 0)^2/2 + max(B, 0)^2/2 + min(A, 0)*min(B, 0)
|
||||
mjSDFTYPE_COLLISION, // A + B + abs(max(A, B))
|
||||
} mjtSDFType;
|
||||
|
||||
struct mjSDF_ {
|
||||
|
||||
Reference in New Issue
Block a user