Simbody
3.7
|
This subclass of Contact represents a contact between two non-conforming surfaces 1 and 2 that initially meet at a point and where each surface has two principal curvatures (maximum and minimum) in perpendicular directions. More...
Public Member Functions | |
EllipticalPointContact (ContactSurfaceIndex surf1, ContactSurfaceIndex surf2, const Transform &X_S1S2, const Transform &X_S1C, const Vec2 &k, Real depth) | |
Create a EllipticalPointContact object. More... | |
const Vec2 & | getCurvatures () const |
Get the relative curvatures at the contact point, ordered kmax,kmin with kmax >= kmin. More... | |
const Transform & | getContactFrame () const |
Get the frame C in which the contact paraboloid is expressed, as the transform X_S1C. More... | |
Real | getDepth () const |
Get the penetration depth (>0) or separation distance (<0), also known as the "approach". More... | |
Public Member Functions inherited from SimTK::Contact | |
Contact () | |
The default constructor creates an empty handle. More... | |
Contact (const Contact &source) | |
Copy constructor is shallow and reference-counted; this handle will point to the same object as does the source. More... | |
~Contact () | |
Destructor clears the handle, deleting the referenced object if this was the last reference. More... | |
Contact & | operator= (const Contact &source) |
Copy assignment is shallow and reference-counted; this handle will point to the same object as does the source. More... | |
void | clear () |
Clear this handle, deleting the referenced object if this was the last reference. More... | |
bool | isEmpty () const |
See if this handle is empty. More... | |
ContactId | getContactId () const |
Get the persistent ContactId that has been assigned to this Contact object if there is one (otherwise this will be invalid – you can check with isValid(). More... | |
Condition | getCondition () const |
Find out the current condition of this Contact object. More... | |
ContactSurfaceIndex | getSurface1 () const |
Get the first surface involved in the contact, specified by its index within its contact set or ContactTrackerSubsystem. More... | |
ContactSurfaceIndex | getSurface2 () const |
Get the second surface involved in the contact, specified by its index within its contact set or ContactTrackerSubsystem. More... | |
const Transform & | getTransform () const |
Return the transform X_S1S2 giving the pose of surface 2's frame measured and expressed in surface 1's frame, recorded at the time this Contact object was calculated. More... | |
Contact & | setContactId (ContactId id) |
Set the ContactId for this Contact object. More... | |
Contact & | setCondition (Condition condition) |
Set the current Condition. More... | |
Contact & | setSurfaces (ContactSurfaceIndex surf1, ContactSurfaceIndex surf2) |
Set the surfaces tracked by this Contact object. More... | |
Contact & | setTransform (const Transform &X_S1S2) |
Set the surface-to-surface relative transform X_S1S2. More... | |
ContactTypeId | getTypeId () const |
Return a unique small integer corresponding to the concrete type of Contact object being referenced by this handle. More... | |
const ContactImpl & | getImpl () const |
ContactImpl & | updImpl () |
Static Public Member Functions | |
static bool | isInstance (const Contact &contact) |
Determine whether a Contact object is an EllipticalPointContact. More... | |
static const EllipticalPointContact & | getAs (const Contact &contact) |
static EllipticalPointContact & | updAs (Contact &contact) |
static ContactTypeId | classTypeId () |
Get the unique small-integer id for the CircularPointContact class. More... | |
Static Public Member Functions inherited from SimTK::Contact | |
static const char * | nameOfCondition (Condition) |
Returns a human-readable name corresponding to the given Condition; useful for debugging. More... | |
static ContactId | createNewContactId () |
This creates a new ContactId starting from 1 and increasing for a very long time (to a billion or so) before repeating. More... | |
Additional Inherited Members | |
Public Types inherited from SimTK::Contact | |
enum | Condition { Unknown, Untracked, Anticipated, NewContact, Ongoing, Broken } |
The Contact::Condition tracks the status of a Contact through its lifetime. More... | |
Protected Member Functions inherited from SimTK::Contact | |
Contact (ContactImpl *impl) | |
This subclass of Contact represents a contact between two non-conforming surfaces 1 and 2 that initially meet at a point and where each surface has two principal curvatures (maximum and minimum) in perpendicular directions.
The prototypical example is ellipsoid-ellipsoid contact, but this includes a wide range of contacts between smooth surfaces, where the surfaces have two continuous spatial derivatives at the contact point. The contact plane on each surface is parameterized by its principal curvature directions x,y with the surface's contact point at the origin, and the common normal as the z axis. The surface is thus approximated by a paraboloid z=Ax^2+By^2 for which A=kx/2, B=ky/2 where kx,ky are the curvatures in the x,y directions. Here A>=0, A>=B, but B can be negative indicating a hyperbolic paraboloid (saddle). Each surface is parameterized separately: the z axes are along the same line, but the x,y axes are relatively rotated about z by an angle theta, with cos(theta)=dot(x1,x2)=dot(y1,y2).
The surface of relative separation of the two surfaces will also be a paraboloid, sharing the z axis with the contact surfaces but having its own relative principal curvatures and directions. The undeformed contact is ultimately characterized by this relative paraboloid and a penetration depth d (d>0 when surfaces overlap, <0 when separated), in a contact frame where x,y are the relative principal curvature directions, z is the common normal oriented to point away from surface1, and the origin OP is centered such that the surface2 contact point is at O-(d/2)z and surface1 contact point is at O+(d/2)z.
SimTK::EllipticalPointContact::EllipticalPointContact | ( | ContactSurfaceIndex | surf1, |
ContactSurfaceIndex | surf2, | ||
const Transform & | X_S1S2, | ||
const Transform & | X_S1C, | ||
const Vec2 & | k, | ||
Real | depth | ||
) |
Create a EllipticalPointContact object.
surf1 | the index of the first surface involved in the contact |
surf2 | the index of the second surface involved in the contact |
X_S1S2 | the surface-to-surface relative transform |
X_S1C | contact paraboloid coordinate frame C in S1 frame; x is kmax direction, y is kmin direction, z points away from surf1; origin OC is at midpoint between contact points on the two surfaces |
k | maximum and minimum curvatures kmax,kmin of the relative contact paraboloid |
depth | penetration depth d(>0) or separation (<0); surf1 contact pt at OC+(d/2)z, surf2 contact pt at OC-(d/2)z |
const Vec2& SimTK::EllipticalPointContact::getCurvatures | ( | ) | const |
Get the relative curvatures at the contact point, ordered kmax,kmin with kmax >= kmin.
Note that it is possible that kmin < 0.
const Transform& SimTK::EllipticalPointContact::getContactFrame | ( | ) | const |
Get the frame C in which the contact paraboloid is expressed, as the transform X_S1C.
The Cx axis is the direction of maximum relative curvature kmax, Cy is the direction of minimum curvature kmin, and Cz is the contact normal direct away from S1's surface. The origin OC is a point centered between the contact points on the two surfaces; those points are at +/- depth/2 along Cz away from OC.
Real SimTK::EllipticalPointContact::getDepth | ( | ) | const |
Get the penetration depth (>0) or separation distance (<0), also known as the "approach".
This is defined as the minimum distance you would need to translate surface2 along the normal vector to make the surfaces just touch at their contact points without overlap.
|
static |
Determine whether a Contact object is an EllipticalPointContact.
|
inlinestatic |
|
inlinestatic |
|
static |
Get the unique small-integer id for the CircularPointContact class.