iMSTK
Interactive Medical Simulation Toolkit
imstkRbdDistanceConstraint.cpp
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 #include "imstkRbdDistanceConstraint.h"
8 
9 namespace imstk
10 {
11 RbdDistanceConstraint::RbdDistanceConstraint(
12  std::shared_ptr<RigidBody> obj1,
13  std::shared_ptr<RigidBody> obj2,
14  const Vec3d& p1, const Vec3d& p2,
15  double dist,
16  const Side side) : RbdConstraint(obj1, obj2, side),
17  m_p1(p1), m_p2(p2), m_dist(dist)
18 {
19 }
20 
21 void
22 RbdDistanceConstraint::compute(double imstkNotUsed(dt))
23 {
24  J = Eigen::Matrix<double, 3, 4>::Zero();
25  if ((m_side == Side::AB || m_side == Side::A) && !m_obj1->m_isStatic)
26  {
27  // Displacement from center of mass
28  const Vec3d r1 = m_p1 - m_obj1->getPosition();
29  const Vec3d diff = m_p2 - m_p1;
30  const Vec3d c = r1.cross(diff);
31  J(0, 0) = -diff[0]; J(0, 1) = -c[0];
32  J(1, 0) = -diff[1]; J(1, 1) = -c[1];
33  J(2, 0) = -diff[2]; J(2, 1) = -c[2];
34  }
35  if ((m_side == Side::AB || m_side == Side::B) && !m_obj2->m_isStatic)
36  {
37  const Vec3d r2 = m_p2 - m_obj2->getPosition();
38  const Vec3d diff = m_p2 - m_p1;
39  const Vec3d c = r2.cross(diff);
40  J(0, 0) = diff[0]; J(0, 1) = c[0];
41  J(1, 0) = diff[1]; J(1, 1) = c[1];
42  J(2, 0) = diff[2]; J(2, 1) = c[2];
43  }
44 }
45 } // namespace imstk
Compound Geometry.
void compute(double dt) override
Compute constraint jacobian.
Eigen::Matrix< double, 3, 4 > J
Jacobian, "vanish" to zero.