iMSTK
Interactive Medical Simulation Toolkit
imstkRbdConstraint.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 "imstkRbdConstraint.h"
8 #include "imstkPointSet.h"
9 #include "imstkVecDataArray.h"
10 
11 namespace imstk
12 {
13 void
14 RigidBody::setInertiaFromPointSet(std::shared_ptr<PointSet> pointset, const double scale, const bool useBoundingBoxOrigin)
15 {
16  Mat3d results;
17  results.setZero();
18 
19  Vec3d centroid = Vec3d(0.0, 0.0, 0.0);
20  if (useBoundingBoxOrigin)
21  {
22  Vec3d min, max;
23  pointset->computeBoundingBox(min, max);
24  centroid = (min + max) * 0.5;
25  }
26  std::shared_ptr<VecDataArray<double, 3>> verticesPtr = pointset->getVertexPositions(Geometry::DataType::PreTransform);
27  const VecDataArray<double, 3>& vertices = *verticesPtr;
28  for (int i = 0; i < vertices.size(); i++)
29  {
30  const Vec3d r = vertices[i] - centroid;
31  results(0, 0) += r[1] * r[1] + r[2] * r[2];
32  results(1, 1) += r[0] * r[0] + r[2] * r[2];
33  results(2, 2) += r[0] * r[0] + r[1] * r[1];
34  results(1, 0) += -r[0] * r[1];
35  results(2, 0) += -r[0] * r[2];
36  results(2, 1) += -r[1] * r[2];
37  }
38  results(0, 2) = results(2, 0);
39  results(0, 1) = results(1, 0);
40  results(1, 2) = results(2, 1);
41  m_intertiaTensor = results * m_mass * scale;
42 }
43 } // namespace imstk
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...