Simbody  3.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ContactTracker.h
Go to the documentation of this file.
1 #ifndef SimTK_SIMMATH_CONTACT_TRACKER_SUBSYSTEM_H_
2 #define SimTK_SIMMATH_CONTACT_TRACKER_SUBSYSTEM_H_
3 
4 /* -------------------------------------------------------------------------- *
5  * Simbody(tm): SimTKmath *
6  * -------------------------------------------------------------------------- *
7  * This is part of the SimTK biosimulation toolkit originating from *
8  * Simbios, the NIH National Center for Physics-Based Simulation of *
9  * Biological Structures at Stanford, funded under the NIH Roadmap for *
10  * Medical Research, grant U54 GM072970. See https://simtk.org/home/simbody. *
11  * *
12  * Portions copyright (c) 2010-12 Stanford University and the Authors. *
13  * Authors: Michael Sherman, Peter Eastman *
14  * Contributors: *
15  * *
16  * Licensed under the Apache License, Version 2.0 (the "License"); you may *
17  * not use this file except in compliance with the License. You may obtain a *
18  * copy of the License at http://www.apache.org/licenses/LICENSE-2.0. *
19  * *
20  * Unless required by applicable law or agreed to in writing, software *
21  * distributed under the License is distributed on an "AS IS" BASIS, *
22  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
23  * See the License for the specific language governing permissions and *
24  * limitations under the License. *
25  * -------------------------------------------------------------------------- */
26 
27 #include "SimTKcommon.h"
30 
31 namespace SimTK {
32 
33 //==============================================================================
34 // CONTACT TRACKER
35 //==============================================================================
63 public:
64 class HalfSpaceSphere;
65 class HalfSpaceEllipsoid;
66 class SphereSphere;
68 class SphereTriangleMesh;
70 class ConvexImplicitPair;
72 
75  ContactGeometryTypeId typeOfSurface2)
76 : m_surfaceTypes(typeOfSurface1, typeOfSurface2)
77 {
78 }
79 
82 const std::pair<ContactGeometryTypeId,ContactGeometryTypeId>&
83 getContactGeometryTypeIds() const {return m_surfaceTypes;}
84 
85 virtual ~ContactTracker() {}
86 
92 virtual bool trackContact
93  (const Contact& priorStatus,
94  const Transform& X_GS1,
95  const ContactGeometry& surface1,
96  const Transform& X_GS2,
97  const ContactGeometry& surface2,
98  Real cutoff,
99  Contact& currentStatus) const = 0;
100 
107 virtual bool predictContact
108  (const Contact& priorStatus,
109  const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
110  const ContactGeometry& surface1,
111  const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
112  const ContactGeometry& surface2,
113  Real cutoff,
114  Real intervalOfInterest,
115  Contact& predictedStatus) const = 0;
116 
122 virtual bool initializeContact
123  (const Transform& X_GS1, const SpatialVec& V_GS1,
124  const ContactGeometry& surface1,
125  const Transform& X_GS2, const SpatialVec& V_GS2,
126  const ContactGeometry& surface2,
127  Real cutoff,
128  Real intervalOfInterest,
129  Contact& contactStatus) const = 0;
130 
157 static bool refineImplicitPair
158  (const ContactGeometry& shapeA, Vec3& pointP_A, // in/out
159  const ContactGeometry& shapeB, Vec3& pointQ_B, // in/out
160  const Transform& X_AB, Real accuracyRequested,
161  Real& accuracyAchieved, int& numIterations);
162 
164 static Vec6 findImplicitPairError
165  (const ContactGeometry& shapeA, const Vec3& pointP,
166  const ContactGeometry& shapeB, const Vec3& pointQ,
167  const Transform& X_AB);
168 
173 static Mat66 calcImplicitPairJacobian
174  (const ContactGeometry& shapeA, const Vec3& pointP,
175  const ContactGeometry& shapeB, const Vec3& pointQ,
176  const Transform& X_AB, const Vec6& err0);
177 
188 static bool estimateConvexImplicitPairContactUsingMPR
189  (const ContactGeometry& shapeA, const ContactGeometry& shapeB,
190  const Transform& X_AB,
191  Vec3& pointP_A, Vec3& pointQ_B, UnitVec3& dirInA,
192  int& numIterations);
193 
194 
195 //--------------------------------------------------------------------------
196  private:
197 // This tracker should be called only for surfaces of these two types,
198 // in this order.
199 std::pair<ContactGeometryTypeId,ContactGeometryTypeId> m_surfaceTypes;
200 };
201 
202 
203 
204 //==============================================================================
205 // HALFSPACE-SPHERE CONTACT TRACKER
206 //==============================================================================
210 : public ContactTracker {
211 public:
213 : ContactTracker(ContactGeometry::HalfSpace::classTypeId(),
214  ContactGeometry::Sphere::classTypeId()) {}
215 
216 virtual ~HalfSpaceSphere() {}
217 
218 virtual bool trackContact
219  (const Contact& priorStatus,
220  const Transform& X_GS1,
221  const ContactGeometry& surface1,
222  const Transform& X_GS2,
223  const ContactGeometry& surface2,
224  Real cutoff,
225  Contact& currentStatus) const;
226 
227 virtual bool predictContact
228  (const Contact& priorStatus,
229  const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
230  const ContactGeometry& surface1,
231  const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
232  const ContactGeometry& surface2,
233  Real cutoff,
234  Real intervalOfInterest,
235  Contact& predictedStatus) const;
236 
237 virtual bool initializeContact
238  (const Transform& X_GS1, const SpatialVec& V_GS1,
239  const ContactGeometry& surface1,
240  const Transform& X_GS2, const SpatialVec& V_GS2,
241  const ContactGeometry& surface2,
242  Real cutoff,
243  Real intervalOfInterest,
244  Contact& contactStatus) const;
245 };
246 
247 
248 
249 //==============================================================================
250 // HALFSPACE-ELLIPSOID CONTACT TRACKER
251 //==============================================================================
255 : public ContactTracker {
256 public:
258 : ContactTracker(ContactGeometry::HalfSpace::classTypeId(),
259  ContactGeometry::Ellipsoid::classTypeId()) {}
260 
262 
263 virtual bool trackContact
264  (const Contact& priorStatus,
265  const Transform& X_GS1,
266  const ContactGeometry& surface1,
267  const Transform& X_GS2,
268  const ContactGeometry& surface2,
269  Real cutoff,
270  Contact& currentStatus) const;
271 
272 virtual bool predictContact
273  (const Contact& priorStatus,
274  const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
275  const ContactGeometry& surface1,
276  const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
277  const ContactGeometry& surface2,
278  Real cutoff,
279  Real intervalOfInterest,
280  Contact& predictedStatus) const;
281 
282 virtual bool initializeContact
283  (const Transform& X_GS1, const SpatialVec& V_GS1,
284  const ContactGeometry& surface1,
285  const Transform& X_GS2, const SpatialVec& V_GS2,
286  const ContactGeometry& surface2,
287  Real cutoff,
288  Real intervalOfInterest,
289  Contact& contactStatus) const;
290 };
291 
292 
293 
294 //==============================================================================
295 // SPHERE-SPHERE CONTACT TRACKER
296 //==============================================================================
300 : public ContactTracker {
301 public:
303 : ContactTracker(ContactGeometry::Sphere::classTypeId(),
304  ContactGeometry::Sphere::classTypeId()) {}
305 
306 virtual ~SphereSphere() {}
307 
308 virtual bool trackContact
309  (const Contact& priorStatus,
310  const Transform& X_GS1,
311  const ContactGeometry& surface1,
312  const Transform& X_GS2,
313  const ContactGeometry& surface2,
314  Real cutoff,
315  Contact& currentStatus) const;
316 
317 virtual bool predictContact
318  (const Contact& priorStatus,
319  const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
320  const ContactGeometry& surface1,
321  const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
322  const ContactGeometry& surface2,
323  Real cutoff,
324  Real intervalOfInterest,
325  Contact& predictedStatus) const;
326 
327 virtual bool initializeContact
328  (const Transform& X_GS1, const SpatialVec& V_GS1,
329  const ContactGeometry& surface1,
330  const Transform& X_GS2, const SpatialVec& V_GS2,
331  const ContactGeometry& surface2,
332  Real cutoff,
333  Real intervalOfInterest,
334  Contact& contactStatus) const;
335 };
336 
337 
338 
339 //==============================================================================
340 // HALFSPACE-TRIANGLE MESH CONTACT TRACKER
341 //==============================================================================
345 : public ContactTracker {
346 public:
348 : ContactTracker(ContactGeometry::HalfSpace::classTypeId(),
349  ContactGeometry::TriangleMesh::classTypeId()) {}
350 
352 
353 virtual bool trackContact
354  (const Contact& priorStatus,
355  const Transform& X_GS1,
356  const ContactGeometry& surface1, // the half space
357  const Transform& X_GS2,
358  const ContactGeometry& surface2, // the mesh
359  Real cutoff,
360  Contact& currentStatus) const;
361 
362 virtual bool predictContact
363  (const Contact& priorStatus,
364  const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
365  const ContactGeometry& surface1,
366  const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
367  const ContactGeometry& surface2,
368  Real cutoff,
369  Real intervalOfInterest,
370  Contact& predictedStatus) const;
371 
372 virtual bool initializeContact
373  (const Transform& X_GS1, const SpatialVec& V_GS1,
374  const ContactGeometry& surface1,
375  const Transform& X_GS2, const SpatialVec& V_GS2,
376  const ContactGeometry& surface2,
377  Real cutoff,
378  Real intervalOfInterest,
379  Contact& contactStatus) const;
380 
381 private:
382 void processBox(const ContactGeometry::TriangleMesh& mesh,
384  const Transform& X_HM, const UnitVec3& hsNormal_M,
385  Real hsFaceHeight_M, std::set<int>& insideFaces) const;
386 void addAllTriangles(const ContactGeometry::TriangleMesh::OBBTreeNode& node,
387  std::set<int>& insideFaces) const;
388 };
389 
390 
391 
392 //==============================================================================
393 // SPHERE - TRIANGLE MESH CONTACT TRACKER
394 //==============================================================================
398 : public ContactTracker {
399 public:
401 : ContactTracker(ContactGeometry::Sphere::classTypeId(),
402  ContactGeometry::TriangleMesh::classTypeId()) {}
403 
405 
406 virtual bool trackContact
407  (const Contact& priorStatus,
408  const Transform& X_GS1,
409  const ContactGeometry& surface1, // the sphere
410  const Transform& X_GS2,
411  const ContactGeometry& surface2, // the mesh
412  Real cutoff,
413  Contact& currentStatus) const;
414 
415 virtual bool predictContact
416  (const Contact& priorStatus,
417  const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
418  const ContactGeometry& surface1,
419  const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
420  const ContactGeometry& surface2,
421  Real cutoff,
422  Real intervalOfInterest,
423  Contact& predictedStatus) const;
424 
425 virtual bool initializeContact
426  (const Transform& X_GS1, const SpatialVec& V_GS1,
427  const ContactGeometry& surface1,
428  const Transform& X_GS2, const SpatialVec& V_GS2,
429  const ContactGeometry& surface2,
430  Real cutoff,
431  Real intervalOfInterest,
432  Contact& contactStatus) const;
433 
434 private:
435 void processBox
436  (const ContactGeometry::TriangleMesh& mesh,
438  const Vec3& center_M, Real radius2,
439  std::set<int>& insideFaces) const ;
440 };
441 
442 
443 
444 //==============================================================================
445 // TRIANGLE MESH - TRIANGLE MESH CONTACT TRACKER
446 //==============================================================================
450 : public ContactTracker {
451 public:
453 : ContactTracker(ContactGeometry::TriangleMesh::classTypeId(),
454  ContactGeometry::TriangleMesh::classTypeId()) {}
455 
457 
458 virtual bool trackContact
459  (const Contact& priorStatus,
460  const Transform& X_GS1,
461  const ContactGeometry& surface1, // mesh1
462  const Transform& X_GS2,
463  const ContactGeometry& surface2, // mesh2
464  Real cutoff,
465  Contact& currentStatus) const;
466 
467 virtual bool predictContact
468  (const Contact& priorStatus,
469  const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
470  const ContactGeometry& surface1,
471  const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
472  const ContactGeometry& surface2,
473  Real cutoff,
474  Real intervalOfInterest,
475  Contact& predictedStatus) const;
476 
477 virtual bool initializeContact
478  (const Transform& X_GS1, const SpatialVec& V_GS1,
479  const ContactGeometry& surface1,
480  const Transform& X_GS2, const SpatialVec& V_GS2,
481  const ContactGeometry& surface2,
482  Real cutoff,
483  Real intervalOfInterest,
484  Contact& contactStatus) const;
485 
486 private:
487 void findIntersectingFaces
488  (const ContactGeometry::TriangleMesh& mesh1,
489  const ContactGeometry::TriangleMesh& mesh2,
492  const OrientedBoundingBox& node2Bounds_M1,
493  const Transform& X_M1M2,
494  std::set<int>& insideFaces1,
495  std::set<int>& insideFaces2) const;
496 void findBuriedFaces
497  (const ContactGeometry::TriangleMesh& mesh,
498  const ContactGeometry::TriangleMesh& otherMesh,
499  const Transform& X_OM,
500  std::set<int>& insideFaces) const;
501 void tagFaces(const ContactGeometry::TriangleMesh& mesh,
502  Array_<int>& faceType,
503  std::set<int>& triangles,
504  int index,
505  int depth) const;
506 };
507 
508 
509 //==============================================================================
510 // CONVEX IMPLICIT SURFACE PAIR CONTACT TRACKER
511 //==============================================================================
516 : public ContactTracker {
517 public:
519 : ContactTracker(type1, type2) {}
520 
522 
523 virtual bool trackContact
524  (const Contact& priorStatus,
525  const Transform& X_GS1,
526  const ContactGeometry& surface1,
527  const Transform& X_GS2,
528  const ContactGeometry& surface2,
529  Real cutoff,
530  Contact& currentStatus) const;
531 
532 virtual bool predictContact
533  (const Contact& priorStatus,
534  const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
535  const ContactGeometry& surface1,
536  const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
537  const ContactGeometry& surface2,
538  Real cutoff,
539  Real intervalOfInterest,
540  Contact& predictedStatus) const;
541 
542 virtual bool initializeContact
543  (const Transform& X_GS1, const SpatialVec& V_GS1,
544  const ContactGeometry& surface1,
545  const Transform& X_GS2, const SpatialVec& V_GS2,
546  const ContactGeometry& surface2,
547  Real cutoff,
548  Real intervalOfInterest,
549  Contact& contactStatus) const;
550 };
551 
552 
553 //==============================================================================
554 // GENERAL IMPLICIT SURFACE PAIR CONTACT TRACKER
555 //==============================================================================
564 : public ContactTracker {
565 public:
567 : ContactTracker(type1, type2) {}
568 
570 
571 virtual bool trackContact
572  (const Contact& priorStatus,
573  const Transform& X_GS1,
574  const ContactGeometry& surface1,
575  const Transform& X_GS2,
576  const ContactGeometry& surface2,
577  Real cutoff,
578  Contact& currentStatus) const;
579 
580 virtual bool predictContact
581  (const Contact& priorStatus,
582  const Transform& X_GS1, const SpatialVec& V_GS1, const SpatialVec& A_GS1,
583  const ContactGeometry& surface1,
584  const Transform& X_GS2, const SpatialVec& V_GS2, const SpatialVec& A_GS2,
585  const ContactGeometry& surface2,
586  Real cutoff,
587  Real intervalOfInterest,
588  Contact& predictedStatus) const;
589 
590 virtual bool initializeContact
591  (const Transform& X_GS1, const SpatialVec& V_GS1,
592  const ContactGeometry& surface1,
593  const Transform& X_GS2, const SpatialVec& V_GS2,
594  const ContactGeometry& surface2,
595  Real cutoff,
596  Real intervalOfInterest,
597  Contact& contactStatus) const;
598 };
599 
600 } // namespace SimTK
601 
602 #endif // SimTK_SIMMATH_CONTACT_TRACKER_SUBSYSTEM_H_
SphereTriangleMesh()
Definition: ContactTracker.h:400
HalfSpaceSphere()
Definition: ContactTracker.h:212
virtual ~HalfSpaceTriangleMesh()
Definition: ContactTracker.h:351
This ContactTracker handles contacts between two smooth, convex objects by using their implicit funct...
Definition: ContactTracker.h:515
GeneralImplicitPair(ContactGeometryTypeId type1, ContactGeometryTypeId type2)
Definition: ContactTracker.h:566
This is a unique integer type for quickly identifying specific types of contact geometry for fast loo...
SphereSphere()
Definition: ContactTracker.h:302
A ContactTracker implements an algorithm for detecting overlaps or potential overlaps between pairs o...
Definition: ContactTracker.h:62
virtual ~TriangleMeshTriangleMesh()
Definition: ContactTracker.h:456
This ContactTracker handles contacts between a ContactGeometry::HalfSpace and a ContactGeometry::Tria...
Definition: ContactTracker.h:344
ContactTracker(ContactGeometryTypeId typeOfSurface1, ContactGeometryTypeId typeOfSurface2)
Base class constructor for use by the concrete classes.
Definition: ContactTracker.h:74
HalfSpaceTriangleMesh()
Definition: ContactTracker.h:347
virtual ~ContactTracker()
Definition: ContactTracker.h:85
This class represents a rectangular box with arbitrary position and orientation.
Definition: OrientedBoundingBox.h:42
This class represents a node in the Oriented Bounding Box Tree for a TriangleMesh.
Definition: ContactGeometry.h:1284
(TODO: not implemented yet) This ContactTracker handles contacts between two arbitrary smooth surface...
Definition: ContactTracker.h:563
virtual ~HalfSpaceEllipsoid()
Definition: ContactTracker.h:261
Includes internal headers providing declarations for the basic SimTK Core classes, including Simmatrix.
ConvexImplicitPair(ContactGeometryTypeId type1, ContactGeometryTypeId type2)
Definition: ContactTracker.h:518
virtual ~SphereTriangleMesh()
Definition: ContactTracker.h:404
This ContactGeometry subclass represents an arbitrary shape described by a mesh of triangular faces...
Definition: ContactGeometry.h:1104
const std::pair< ContactGeometryTypeId, ContactGeometryTypeId > & getContactGeometryTypeIds() const
Return the pair of contact geometry type ids handled by this tracker, in the order that they must be ...
Definition: ContactTracker.h:83
HalfSpaceEllipsoid()
Definition: ContactTracker.h:257
A ContactGeometry object describes the shape of all or part of the boundary of a solid object...
Definition: ContactGeometry.h:110
virtual ~ConvexImplicitPair()
Definition: ContactTracker.h:521
This ContactTracker handles contacts between a ContactGeometry::HalfSpace and a ContactGeometry::Elli...
Definition: ContactTracker.h:254
This ContactTracker handles contacts between a ContactGeometry::Sphere and a ContactGeometry::Triangl...
Definition: ContactTracker.h:397
TriangleMeshTriangleMesh()
Definition: ContactTracker.h:452
This ContactTracker handles contacts between a ContactGeometry::HalfSpace and a ContactGeometry::Sphe...
Definition: ContactTracker.h:209
This is the header file that every Simmath compilation unit should include first. ...
virtual ~SphereSphere()
Definition: ContactTracker.h:306
A Contact contains information about the spatial relationship between two surfaces that are near...
Definition: Contact.h:81
This ContactTracker handles contacts between two ContactGeometry::TriangleMesh surfaces.
Definition: ContactTracker.h:449
virtual ~HalfSpaceSphere()
Definition: ContactTracker.h:216
This ContactTracker handles contacts between two ContactGeometry::Sphere objects. ...
Definition: ContactTracker.h:299
This class represents a small matrix whose size is known at compile time, containing elements of any ...
Definition: Mat.h:51
#define SimTK_SIMMATH_EXPORT
Definition: SimTKmath/include/simmath/internal/common.h:64
virtual ~GeneralImplicitPair()
Definition: ContactTracker.h:569