00001 #ifndef SimTK_SIMBODY_COLLISION_DETECTION_ALGORITHM_H_
00002 #define SimTK_SIMBODY_COLLISION_DETECTION_ALGORITHM_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "SimTKcommon.h"
00036 #include "simbody/internal/common.h"
00037 #include "simbody/internal/ContactGeometry.h"
00038 #include <map>
00039
00040 namespace SimTK {
00041
00042 class Contact;
00043
00052 class SimTK_SIMBODY_EXPORT CollisionDetectionAlgorithm {
00053 public:
00054 class HalfSpaceSphere;
00055 class SphereSphere;
00056 class HalfSpaceTriangleMesh;
00057 class SphereTriangleMesh;
00058 class TriangleMeshTriangleMesh;
00072 virtual void processObjects(int index1, const ContactGeometry& object1, const Transform& transform1,
00073 int index2, const ContactGeometry& object2, const Transform& transform2, std::vector<Contact>& contacts) const = 0;
00081 static void registerAlgorithm(const std::string& type1, const std::string& type2, CollisionDetectionAlgorithm* algorithm);
00089 static CollisionDetectionAlgorithm* getAlgorithm(int typeIndex1, int typeIndex2);
00090 private:
00091 struct AlgorithmMap : public std::map<std::pair<int, int>, CollisionDetectionAlgorithm*> {
00092 ~AlgorithmMap();
00093 };
00094
00095
00096 static AlgorithmMap algorithmMap;
00097 };
00098
00102 class SimTK_SIMBODY_EXPORT CollisionDetectionAlgorithm::HalfSpaceSphere : public CollisionDetectionAlgorithm {
00103 public:
00104 void processObjects(int index1, const ContactGeometry& object1, const Transform& transform1,
00105 int index2, const ContactGeometry& object2, const Transform& transform2, std::vector<Contact>& contacts) const;
00106 };
00107
00111 class SimTK_SIMBODY_EXPORT CollisionDetectionAlgorithm::SphereSphere : public CollisionDetectionAlgorithm {
00112 public:
00113 void processObjects(int index1, const ContactGeometry& object1, const Transform& transform1,
00114 int index2, const ContactGeometry& object2, const Transform& transform2, std::vector<Contact>& contacts) const;
00115 };
00116
00120 class SimTK_SIMBODY_EXPORT CollisionDetectionAlgorithm::HalfSpaceTriangleMesh : public CollisionDetectionAlgorithm {
00121 public:
00122 void processObjects(int index1, const ContactGeometry& object1, const Transform& transform1,
00123 int index2, const ContactGeometry& object2, const Transform& transform2, std::vector<Contact>& contacts) const;
00124 private:
00125 void processBox(const ContactGeometry::TriangleMesh& mesh, const ContactGeometry::TriangleMesh::OBBTreeNode& node,
00126 const Transform& transform, const Vec3& axisDir, Real xoffset, std::set<int>& insideFaces) const;
00127 void addAllTriangles(const ContactGeometry::TriangleMesh::OBBTreeNode& node, std::set<int>& insideFaces) const;
00128 };
00129
00133 class SimTK_SIMBODY_EXPORT CollisionDetectionAlgorithm::SphereTriangleMesh : public CollisionDetectionAlgorithm {
00134 public:
00135 void processObjects(int index1, const ContactGeometry& object1, const Transform& transform1,
00136 int index2, const ContactGeometry& object2, const Transform& transform2, std::vector<Contact>& contacts) const;
00137 private:
00138 void processBox(const Vec3& center, Real radius2, const ContactGeometry::TriangleMesh& mesh, const ContactGeometry::TriangleMesh::OBBTreeNode& node,
00139 std::set<int>& insideFaces) const;
00140 };
00141
00145 class SimTK_SIMBODY_EXPORT CollisionDetectionAlgorithm::TriangleMeshTriangleMesh : public CollisionDetectionAlgorithm {
00146 public:
00147 void processObjects(int index1, const ContactGeometry& object1, const Transform& transform1,
00148 int index2, const ContactGeometry& object2, const Transform& transform2, std::vector<Contact>& contacts) const;
00149 private:
00150 void processNodes(const ContactGeometry::TriangleMesh& mesh1, const ContactGeometry::TriangleMesh& mesh2,
00151 const ContactGeometry::TriangleMesh::OBBTreeNode& node1, const ContactGeometry::TriangleMesh::OBBTreeNode& node2,
00152 const OrientedBoundingBox& node2Bounds, const Transform& transform, std::set<int>& triangles1, std::set<int>& triangles2) const;
00153 void findInsideTriangles(const ContactGeometry::TriangleMesh& mesh, const ContactGeometry::TriangleMesh& otherMesh,
00154 const Transform& transform, std::set<int>& triangles) const;
00155 void tagFaces(const ContactGeometry::TriangleMesh& mesh, std::vector<int>& faceType, std::set<int>& triangles, int index) const;
00156 static const int OUTSIDE = -1;
00157 static const int UNKNOWN = 0;
00158 static const int BOUNDARY = 1;
00159 static const int INSIDE = 2;
00160 };
00161
00162 }
00163
00164 #endif // SimTK_SIMBODY_COLLISION_DETECTION_ALGORITHM_H_