Struct Contact

Struct Documentation

struct Contact

Contact information returned by collision.

Public Functions

inline Contact()

Default constructor.

inline Contact(const CollisionGeometry *o1_, const CollisionGeometry *o2_, int b1_, int b2_)
inline Contact(const CollisionGeometry *o1_, const CollisionGeometry *o2_, int b1_, int b2_, const Vec3s &pos_, const Vec3s &normal_, CoalScalar depth_)
inline Contact(const CollisionGeometry *o1_, const CollisionGeometry *o2_, int b1_, int b2_, const Vec3s &p1, const Vec3s &p2, const Vec3s &normal_, CoalScalar depth_)
inline bool operator<(const Contact &other) const
inline bool operator==(const Contact &other) const
inline bool operator!=(const Contact &other) const
inline CoalScalar getDistanceToCollision(const CollisionRequest &request) const

Public Members

const CollisionGeometry *o1

collision object 1

const CollisionGeometry *o2

collision object 2

int b1

contact primitive in object 1 if object 1 is mesh or point cloud, it is the triangle or point id if object 1 is geometry shape, it is NONE (-1), if object 1 is octree, it is the id of the cell

int b2

contact primitive in object 2 if object 2 is mesh or point cloud, it is the triangle or point id if object 2 is geometry shape, it is NONE (-1), if object 2 is octree, it is the id of the cell

Vec3s normal

contact normal, pointing from o1 to o2. The normal defined as the normalized separation vector: normal = (p2 - p1) / dist(o1, o2), where p1 = nearest_points[0] belongs to o1 and p2 = nearest_points[1] belongs to o2 and dist(o1, o2) is the signed distance between o1 and o2. The normal always points from o1 to o2.

Note

The separation vector is the smallest vector such that if o1 is translated by it, o1 and o2 are in touching contact (they share at least one contact point but have a zero intersection volume). If the shapes overlap, dist(o1, o2) = -((p2-p1).norm()). Otherwise, dist(o1, o2) = (p2-p1).norm().

std::array<Vec3s, 2> nearest_points

nearest points associated to this contact.

Note

Also referred as “witness points” in other collision libraries. The points p1 = nearest_points[0] and p2 = nearest_points[1] verify the property that dist(o1, o2) * (p1 - p2) is the separation vector between o1 and o2, with dist(o1, o2) being the signed distance separating o1 from o2. See DistanceResult::normal for the definition of the separation vector. If o1 and o2 have multiple contacts, the nearest_points are associated with the contact which has the greatest penetration depth. TODO (louis): rename nearest_points to witness_points.

Vec3s pos

contact position, in world space

CoalScalar penetration_depth

penetration depth

Public Static Attributes

static const int NONE = -1

invalid contact primitive information