iMSTK
Interactive Medical Simulation Toolkit
imstkRigidBodyCH.h
1 /*
2 ** This file is part of the Interactive Medical Simulation Toolkit (iMSTK)
3 ** iMSTK is distributed under the Apache License, Version 2.0.
4 ** See accompanying NOTICE for details.
5 */
6 
7 #pragma once
8 
9 #include "imstkCollisionHandling.h"
10 #include "imstkMacros.h"
11 
12 #include <vector>
13 
14 namespace imstk
15 {
16 class CollisionData;
17 class RigidObject2;
18 
28 {
29 public:
30  RigidBodyCH() = default;
31  virtual ~RigidBodyCH() override = default;
32 
33  IMSTK_TYPE_NAME(RigidBodyCH)
34 
35 public:
36  void setInputRigidObjectA(std::shared_ptr<RigidObject2> rbdObjA);
37 
41  void setInputRigidObjectB(std::shared_ptr<RigidObject2> rbdObjB);
42 
46  void setInputCollidingObjectB(std::shared_ptr<CollidingObject> colObjB);
47 
48  std::shared_ptr<RigidObject2> getRigidObjA();
49  std::shared_ptr<RigidObject2> getRigidObjB();
50 
51 public:
57  void setBaumgarteStabilization(double beta) { m_beta = beta; }
58  const double getBeta() const { return m_beta; }
59 
60  void setFriction(double frictionalCoefficient)
61  {
62  m_frictionalCoefficient = frictionalCoefficient;
63  m_useFriction = (m_frictionalCoefficient != 0.0);
64  }
65 
66  const double getFriction() const { return m_frictionalCoefficient; }
67 
68  void setUseFriction(bool useFriction) { m_useFriction = useFriction; }
69  const double getUseFriction() const { return m_useFriction; }
70 
71 protected:
75  virtual void handle(
76  const std::vector<CollisionElement>& elementsA,
77  const std::vector<CollisionElement>& elementsB) override;
78 
83  void handleRbdRbdTwoWay(
84  std::shared_ptr<RigidObject2> rbdObjA,
85  std::shared_ptr<RigidObject2> rbdObjB,
86  const std::vector<CollisionElement>& elementsA,
87  const std::vector<CollisionElement>& elementsB);
88 
94  std::shared_ptr<RigidObject2> rbdObj,
95  std::shared_ptr<CollidingObject> colObj,
96  const std::vector<CollisionElement>& elementsA,
97  const std::vector<CollisionElement>& elementsB);
98 
102  virtual void addConstraint(
103  std::shared_ptr<RigidObject2> rbdObj,
104  const Vec3d& contactPt, const Vec3d& contactNormal,
105  const double contactDepth);
106 
110  virtual void addConstraint(
111  std::shared_ptr<RigidObject2> rbdObjA,
112  std::shared_ptr<RigidObject2> rbdObjB,
113  const Vec3d& contactPt, const Vec3d& contactNormal,
114  const double contactDepth);
115 
116 protected:
117  double m_beta = 0.0;
118  double m_frictionalCoefficient = 2.0;
119  bool m_useFriction = false;
120 };
121 } // namespace imstk
void setInputCollidingObjectB(std::shared_ptr< CollidingObject > colObjB)
Second input colliding object is optional.
void setInputRigidObjectB(std::shared_ptr< RigidObject2 > rbdObjB)
Second input rigid object is optional.
Compound Geometry.
void setBaumgarteStabilization(double beta)
Baumgarte stabilization term, scales the constraint scalars The higher it is, the faster constraint v...
void handleRbdStaticOneWay(std::shared_ptr< RigidObject2 > rbdObj, std::shared_ptr< CollidingObject > colObj, const std::vector< CollisionElement > &elementsA, const std::vector< CollisionElement > &elementsB)
Handle rigid vs static one-way edge-edge, vertex-triangle, etc.
virtual void handle(const std::vector< CollisionElement > &elementsA, const std::vector< CollisionElement > &elementsB) override
Add rigid body constraints according to contacts.
Base class for all collision handling classes.
Creates rigid body contact and frictional constraints given collision data then adds them to the rigi...
virtual void addConstraint(std::shared_ptr< RigidObject2 > rbdObj, const Vec3d &contactPt, const Vec3d &contactNormal, const double contactDepth)
Add constraint for the rigid body given contact.
void handleRbdRbdTwoWay(std::shared_ptr< RigidObject2 > rbdObjA, std::shared_ptr< RigidObject2 > rbdObjB, const std::vector< CollisionElement > &elementsA, const std::vector< CollisionElement > &elementsB)
Handle rigid vs rigid two-way edge-edge, vertex-triangle, etc.