iMSTK
Interactive Medical Simulation Toolkit
imstkRbdConstraint.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 "imstkMath.h"
10 
11 #include <memory>
12 
13 namespace imstk
14 {
15 class PointSet;
16 
20 struct RigidBody
21 {
22  public:
23  double m_mass = 1.0;
24  Mat3d m_intertiaTensor = Mat3d::Identity();
25  Vec3d m_initPos = Vec3d(0.0, 0.0, 0.0);
26  Quatd m_initOrientation = Quatd(1.0, 0.0, 0.0, 0.0);
27  Vec3d m_initVelocity = Vec3d(0.0, 0.0, 0.0);
28  Vec3d m_initAngularVelocity = Vec3d(0.0, 0.0, 0.0);
29  Vec3d m_initForce = Vec3d(0.0, 0.0, 0.0);
30  Vec3d m_initTorque = Vec3d(0.0, 0.0, 0.0);
31  bool m_isStatic = false;
32 
33  Vec3d m_prevForce = Vec3d(0.0, 0.0, 0.0);
34 
35  Vec3d* m_pos = nullptr;
36  Quatd* m_orientation = nullptr;
37  Vec3d* m_velocity = nullptr;
38  Vec3d* m_angularVelocity = nullptr;
39  Vec3d* m_force = nullptr;
40  Vec3d* m_torque = nullptr;
41 
42  public:
43  const Vec3d& getPosition() const { return *m_pos; }
44  const Quatd& getOrientation() const { return *m_orientation; }
45  const Vec3d& getVelocity() const { return *m_velocity; }
46  const Vec3d& getAngularVelocity() const { return *m_angularVelocity; }
47  const Vec3d& getForce() const { return *m_force; }
48  const Vec3d& getTorque() const { return *m_torque; }
49 
50  const double getMass() const { return m_mass; }
51  void setMass(const double mass) { m_mass = mass; }
52 
53  const Mat3d& getIntertiaTensor() const { return m_intertiaTensor; }
54  void setInertiaTensor(const Mat3d& inertiaTensor) { m_intertiaTensor = inertiaTensor; }
55 
56  const Vec3d& getInitPos() const { return m_initPos; }
57  void setInitPos(const Vec3d& pos) { m_initPos = pos; }
58 
59  const Quatd& getInitOrientation() const { return m_initOrientation; }
60  void setInitOrientation(const Quatd& orientation) { m_initOrientation = orientation; }
61 
62  const Vec3d& getInitVelocity() const { return m_initVelocity; }
63  void setInitVelocity(const Vec3d& velocity) { m_initVelocity = velocity; }
64 
65  const Vec3d& getInitAngularVelocity() const { return m_initAngularVelocity; }
66  void setInitAngularVelocity(const Vec3d& angularVelocity) { m_initAngularVelocity = angularVelocity; }
67 
68  const Vec3d& getInitForce() const { return m_initForce; }
69  void setInitForce(const Vec3d& force) { m_initForce = force; }
70 
71  const Vec3d& getInitTorque() const { return m_initTorque; }
72  void setInitTorque(const Vec3d& torque) { m_initTorque = torque; }
73 
78  void setInertiaFromPointSet(std::shared_ptr<PointSet> pointset, const double scale = 1.0, const bool useBoundingBoxOrigin = true);
79 };
80 
90 {
91 public:
92  enum class Side
93  {
94  A,
95  B,
96  AB
97  };
98 
99  virtual ~RbdConstraint() = default;
100 
101  virtual const std::string getTypeName() const = 0;
102 
106  virtual void compute(double dt) = 0;
107 
108 protected:
109  RbdConstraint(std::shared_ptr<RigidBody> rbd1,
110  std::shared_ptr<RigidBody> rbd2, const Side side) :
111  m_obj1(rbd1), m_obj2(rbd2), m_side(side)
112  {
113  }
114 
115 public:
116  Eigen::Matrix<double, 3, 4> J = Eigen::Matrix<double, 3, 4>::Zero();
117  double vu = 0.0;
118  // Range of the constraint force (for projection step during solve)
119  // by default (0, inf) so bodies may only be pushed apart
120  double range[2] = { 0.0, std::numeric_limits<double>::max() };
121 
122  // Objects involved
123  std::shared_ptr<RigidBody> m_obj1 = nullptr;
124  std::shared_ptr<RigidBody> m_obj2 = nullptr;
125 
126  // Which object to solve for
127  Side m_side = Side::AB;
128 };
129 } // namespace imstk
Abstract class for rigid body constraints. A RbdConstraint should mainly provide a constraint jacobia...
Compound Geometry.
void setInertiaFromPointSet(std::shared_ptr< PointSet > pointset, const double scale=1.0, const bool useBoundingBoxOrigin=true)
Convience function to set the inertia tensor based off provided geometry assuming uniform mass at eac...
Serves as a handle to the body.