@@ -45,7 +45,7 @@ void DistanceFieldCollisionDetection::collisionDetection(SimulationModel &model)
4545 }
4646
4747 // omp_set_num_threads(1);
48- std::vector<std::vector<ContactData> > contacts_mt;
48+ std::vector<std::vector<ContactData> > contacts_mt;
4949#ifdef _DEBUG
5050 const unsigned int maxThreads = 1 ;
5151#else
@@ -56,7 +56,7 @@ void DistanceFieldCollisionDetection::collisionDetection(SimulationModel &model)
5656 #pragma omp parallel default(shared)
5757 {
5858 // Update BVHs
59- #pragma omp for schedule(static)
59+ #pragma omp for schedule(static)
6060 for (int i = 0 ; i < (int )m_collisionObjects.size (); i++)
6161 {
6262 CollisionDetection::CollisionObject *co = m_collisionObjects[i];
@@ -90,7 +90,7 @@ void DistanceFieldCollisionDetection::collisionDetection(SimulationModel &model)
9090 if ((co1->m_bodyType == CollisionDetection::CollisionObject::RigidBodyCollisionObjectType) &&
9191 ((DistanceFieldCollisionObject*) co1)->m_testMesh )
9292 {
93- RigidBody *rb1 = rigidBodies[co1->m_bodyIndex ];
93+ RigidBody *rb1 = rigidBodies[co1->m_bodyIndex ];
9494 const Real restitutionCoeff = rb1->getRestitutionCoeff () * rb2->getRestitutionCoeff ();
9595 const Real frictionCoeff = rb1->getFrictionCoeff () + rb2->getFrictionCoeff ();
9696 collisionDetectionRigidBodies (rb1, (DistanceFieldCollisionObject*)co1, rb2, (DistanceFieldCollisionObject*)co2,
@@ -131,18 +131,18 @@ void DistanceFieldCollisionDetection::collisionDetection(SimulationModel &model)
131131 for (unsigned int j = 0 ; j < contacts_mt[i].size (); j++)
132132 {
133133 if (contacts_mt[i][j].m_type == 1 )
134- addParticleRigidBodyContact (contacts_mt[i][j].m_index1 , contacts_mt[i][j].m_index2 ,
135- contacts_mt[i][j].m_cp1 , contacts_mt[i][j].m_cp2 , contacts_mt[i][j].m_normal ,
134+ addParticleRigidBodyContact (contacts_mt[i][j].m_index1 , contacts_mt[i][j].m_index2 ,
135+ contacts_mt[i][j].m_cp1 , contacts_mt[i][j].m_cp2 , contacts_mt[i][j].m_normal ,
136136 contacts_mt[i][j].m_dist , contacts_mt[i][j].m_restitution , contacts_mt[i][j].m_friction );
137137 else
138- addRigidBodyContact (contacts_mt[i][j].m_index1 , contacts_mt[i][j].m_index2 ,
139- contacts_mt[i][j].m_cp1 , contacts_mt[i][j].m_cp2 , contacts_mt[i][j].m_normal ,
138+ addRigidBodyContact (contacts_mt[i][j].m_index1 , contacts_mt[i][j].m_index2 ,
139+ contacts_mt[i][j].m_cp1 , contacts_mt[i][j].m_cp2 , contacts_mt[i][j].m_normal ,
140140 contacts_mt[i][j].m_dist , contacts_mt[i][j].m_restitution , contacts_mt[i][j].m_friction );
141141 }
142142 }
143143}
144144
145- void DistanceFieldCollisionDetection::collisionDetectionRigidBodies (RigidBody *rb1, DistanceFieldCollisionObject *co1, RigidBody *rb2, DistanceFieldCollisionObject *co2,
145+ void DistanceFieldCollisionDetection::collisionDetectionRigidBodies (RigidBody *rb1, DistanceFieldCollisionObject *co1, RigidBody *rb2, DistanceFieldCollisionObject *co2,
146146 const Real restitutionCoeff, const Real frictionCoeff
147147 , std::vector<std::vector<ContactData> > &contacts_mt
148148 )
@@ -155,12 +155,12 @@ void DistanceFieldCollisionDetection::collisionDetectionRigidBodies(RigidBody *r
155155 const Vector3r &com2 = rb2->getPosition ();
156156
157157 // remove the rotation of the main axis transformation that is performed
158- // to get a diagonal inertia tensor since the distance function is
158+ // to get a diagonal inertia tensor since the distance function is
159159 // evaluated in local coordinates
160160 //
161161 // transformation world to local:
162162 // p_local = R_initial^T ( R_MAT R^T (p_world - x) - x_initial + x_MAT)
163- //
163+ //
164164 // transformation local to:
165165 // p_world = R R_MAT^T (R_initial p_local + x_initial - x_MAT) + x
166166 //
@@ -215,7 +215,7 @@ void DistanceFieldCollisionDetection::collisionDetectionRigidBodies(RigidBody *r
215215 int tid = 0 ;
216216#else
217217 int tid = omp_get_thread_num ();
218- #endif
218+ #endif
219219 contacts_mt[tid].push_back ({ 0 , co1->m_bodyIndex , co2->m_bodyIndex , x_w, cp_w, n_w, dist, restitutionCoeff, frictionCoeff });
220220 }
221221 }
@@ -225,20 +225,20 @@ void DistanceFieldCollisionDetection::collisionDetectionRigidBodies(RigidBody *r
225225
226226
227227void DistanceFieldCollisionDetection::collisionDetectionRBSolid (const ParticleData &pd, const unsigned int offset, const unsigned int numVert,
228- DistanceFieldCollisionObject *co1, RigidBody *rb2, DistanceFieldCollisionObject *co2,
228+ DistanceFieldCollisionObject *co1, RigidBody *rb2, DistanceFieldCollisionObject *co2,
229229 const Real restitutionCoeff, const Real frictionCoeff
230230 , std::vector<std::vector<ContactData> > &contacts_mt
231231 )
232232{
233233 const Vector3r &com2 = rb2->getPosition ();
234234
235235 // remove the rotation of the main axis transformation that is performed
236- // to get a diagonal inertia tensor since the distance function is
236+ // to get a diagonal inertia tensor since the distance function is
237237 // evaluated in local coordinates
238238 //
239239 // transformation world to local:
240240 // p_local = R_initial^T ( R_MAT R^T (p_world - x) - x_initial + x_MAT)
241- //
241+ //
242242 // transformation local to:
243243 // p_world = R R_MAT^T (R_initial p_local + x_initial - x_MAT) + x
244244 //
@@ -294,7 +294,7 @@ void DistanceFieldCollisionDetection::collisionDetectionRBSolid(const ParticleDa
294294 int tid = 0 ;
295295#else
296296 int tid = omp_get_thread_num ();
297- #endif
297+ #endif
298298 contacts_mt[tid].push_back ({ 1 , index, co2->m_bodyIndex , x_w, cp_w, n_w, dist, restitutionCoeff, frictionCoeff });
299299 }
300300 }
@@ -305,9 +305,9 @@ void DistanceFieldCollisionDetection::collisionDetectionRBSolid(const ParticleDa
305305
306306bool DistanceFieldCollisionDetection::isDistanceFieldCollisionObject (CollisionObject *co) const
307307{
308- return (co->getTypeId () == DistanceFieldCollisionDetection::DistanceFieldCollisionBox::TYPE_ID) ||
309- (co->getTypeId () == DistanceFieldCollisionDetection::DistanceFieldCollisionSphere::TYPE_ID) ||
310- (co->getTypeId () == DistanceFieldCollisionDetection::DistanceFieldCollisionTorus::TYPE_ID) ||
308+ return (co->getTypeId () == DistanceFieldCollisionDetection::DistanceFieldCollisionBox::TYPE_ID) ||
309+ (co->getTypeId () == DistanceFieldCollisionDetection::DistanceFieldCollisionSphere::TYPE_ID) ||
310+ (co->getTypeId () == DistanceFieldCollisionDetection::DistanceFieldCollisionTorus::TYPE_ID) ||
311311 (co->getTypeId () == DistanceFieldCollisionDetection::DistanceFieldCollisionCylinder::TYPE_ID) ||
312312 (co->getTypeId () == DistanceFieldCollisionDetection::DistanceFieldCollisionHollowSphere::TYPE_ID) ||
313313 (co->getTypeId () == DistanceFieldCollisionDetection::DistanceFieldCollisionHollowBox::TYPE_ID) ||
@@ -319,7 +319,7 @@ void DistanceFieldCollisionDetection::addCollisionBox(const unsigned int bodyInd
319319 DistanceFieldCollisionDetection::DistanceFieldCollisionBox *cf = new DistanceFieldCollisionDetection::DistanceFieldCollisionBox ();
320320 cf->m_bodyIndex = bodyIndex;
321321 cf->m_bodyType = bodyType;
322- // distance function requires 0.5*box
322+ // distance function requires 0.5*box
323323 cf->m_box = 0.5 *box;
324324 cf->m_bvh .init (vertices, numVertices);
325325 cf->m_bvh .construct ();
@@ -393,7 +393,7 @@ void DistanceFieldCollisionDetection::addCollisionHollowBox(const unsigned int b
393393 DistanceFieldCollisionDetection::DistanceFieldCollisionHollowBox *cf = new DistanceFieldCollisionDetection::DistanceFieldCollisionHollowBox ();
394394 cf->m_bodyIndex = bodyIndex;
395395 cf->m_bodyType = bodyType;
396- // distance function requires 0.5*box
396+ // distance function requires 0.5*box
397397 cf->m_box = 0.5 *box;
398398 cf->m_thickness = thickness;
399399 cf->m_bvh .init (vertices, numVertices);
@@ -416,18 +416,18 @@ void DistanceFieldCollisionDetection::addCollisionObjectWithoutGeometry(const un
416416 m_collisionObjects.push_back (co);
417417}
418418
419- Real DistanceFieldCollisionDetection::DistanceFieldCollisionBox::distance (const Eigen::Vector3d &x, const Real tolerance)
419+ Real DistanceFieldCollisionDetection::DistanceFieldCollisionBox::distance (const Vector3r &x, const Real tolerance)
420420{
421- const Eigen::Vector3d box_d = m_box.template cast <Real>();
422- const Eigen::Vector3d x_d = x.template cast <Real>();
423- const Eigen::Vector3d d (fabs (x_d.x ()) - box_d.x (), fabs (x_d.y ()) - box_d.y (), fabs (x_d.z ()) - box_d.z ());
424- const Eigen::Vector3d max_d (std::max (d.x (), 0.0 ), std::max (d.y (), 0.0 ), std::max (d.z (), 0.0 ));
425- return m_invertSDF*(std::min (std::max (d.x (), std::max (d.y (), d.z ())), 0.0 ) + max_d.norm ()) - tolerance;
421+ const Vector3r box_d = m_box.template cast <Real>();
422+ const Vector3r x_d = x.template cast <Real>();
423+ const Vector3r d (fabs (x_d.x ()) - box_d.x (), fabs (x_d.y ()) - box_d.y (), fabs (x_d.z ()) - box_d.z ());
424+ const Vector3r max_d (std::max<Real> (d.x (), 0.0 ), std::max<Real> (d.y (), 0.0 ), std::max<Real> (d.z (), 0.0 ));
425+ return m_invertSDF*(std::min<Real> (std::max<Real> (d.x (), std::max<Real> (d.y (), d.z ())), 0.0 ) + max_d.norm ()) - tolerance;
426426}
427427
428- Real DistanceFieldCollisionDetection::DistanceFieldCollisionSphere::distance (const Eigen::Vector3d &x, const Real tolerance)
428+ Real DistanceFieldCollisionDetection::DistanceFieldCollisionSphere::distance (const Vector3r &x, const Real tolerance)
429429{
430- const Eigen::Vector3d d = x.template cast <Real>();
430+ const Vector3r d = x.template cast <Real>();
431431 const Real dl = d.norm ();
432432 return m_invertSDF*(dl - static_cast <Real>(m_radius)) - tolerance;
433433}
@@ -450,25 +450,25 @@ bool DistanceFieldCollisionDetection::DistanceFieldCollisionSphere::collisionTes
450450 return false ;
451451}
452452
453- Real DistanceFieldCollisionDetection::DistanceFieldCollisionTorus::distance (const Eigen::Vector3d &x, const Real tolerance)
453+ Real DistanceFieldCollisionDetection::DistanceFieldCollisionTorus::distance (const Vector3r &x, const Real tolerance)
454454{
455- const Eigen::Vector2d radii_d = m_radii.template cast <Real>();
456- const Eigen::Vector2d q (Vector2r (x.x (), x.z ()).norm () - radii_d.x (), x.y ());
455+ const Vector2r radii_d = m_radii.template cast <Real>();
456+ const Vector2r q (Vector2r (x.x (), x.z ()).norm () - radii_d.x (), x.y ());
457457 return m_invertSDF*(q.norm () - radii_d.y ()) - tolerance;
458458}
459459
460- Real DistanceFieldCollisionDetection::DistanceFieldCollisionCylinder::distance (const Eigen::Vector3d &x, const Real tolerance)
460+ Real DistanceFieldCollisionDetection::DistanceFieldCollisionCylinder::distance (const Vector3r &x, const Real tolerance)
461461{
462462 const Real l = sqrt (x.x ()*x.x () + x.z ()*x.z ());
463- const Eigen::Vector2d d = Eigen::Vector2d ( fabs ( l), fabs (x.y ())) - m_dim.template cast <Real>();
464- const Eigen::Vector2d max_d (std::max (d.x (), 0.0 ), std::max (d.y (), 0.0 ));
465- return m_invertSDF*(std::min (std::max (d.x (), d.y ()), 0.0 ) + max_d.norm ()) - tolerance;
463+ const Vector2r d = Vector2r ( std::abs ( l), std::abs (x.y ())) - m_dim.template cast <Real>();
464+ const Vector2r max_d (std::max<Real> (d.x (), 0.0 ), std::max<Real> (d.y (), 0.0 ));
465+ return m_invertSDF*(std::min<Real> (std::max<Real> (d.x (), d.y ()), 0.0 ) + max_d.norm ()) - tolerance;
466466}
467467
468468
469- Real DistanceFieldCollisionDetection::DistanceFieldCollisionHollowSphere::distance (const Eigen::Vector3d &x, const Real tolerance)
469+ Real DistanceFieldCollisionDetection::DistanceFieldCollisionHollowSphere::distance (const Vector3r &x, const Real tolerance)
470470{
471- const Eigen::Vector3d d = x.template cast <Real>();
471+ const Vector3r d = x.template cast <Real>();
472472 const Real dl = d.norm ();
473473 return m_invertSDF*(fabs (dl - m_radius) - m_thickness) - tolerance;
474474}
@@ -493,21 +493,21 @@ bool DistanceFieldCollisionDetection::DistanceFieldCollisionHollowSphere::collis
493493 return false ;
494494}
495495
496- Real DistanceFieldCollisionDetection::DistanceFieldCollisionHollowBox::distance (const Eigen::Vector3d &x, const Real tolerance)
496+ Real DistanceFieldCollisionDetection::DistanceFieldCollisionHollowBox::distance (const Vector3r &x, const Real tolerance)
497497{
498- const Eigen::Vector3d box_d = m_box.template cast <Real>();
499- const Eigen::Vector3d x_d = x.template cast <Real>();
500- const Eigen::Vector3d d = x_d.cwiseAbs () - box_d;
501- const Eigen::Vector3d max_d = d.cwiseMax (Eigen::Vector3d (0.0 , 0.0 , 0.0 ));
502- return m_invertSDF * (fabs (std::min (d.maxCoeff (), 0.0 ) + max_d.norm ()) - m_thickness) - tolerance;
498+ const Vector3r box_d = m_box.template cast <Real>();
499+ const Vector3r x_d = x.template cast <Real>();
500+ const Vector3r d = x_d.cwiseAbs () - box_d;
501+ const Vector3r max_d = d.cwiseMax (Vector3r (0.0 , 0.0 , 0.0 ));
502+ return m_invertSDF * (std::abs (std::min<Real> (d.maxCoeff (), 0.0 ) + max_d.norm ()) - m_thickness) - tolerance;
503503}
504504
505- void DistanceFieldCollisionDetection::DistanceFieldCollisionObject::approximateNormal (const Eigen::Vector3d &x, const Real tolerance, Vector3r &n)
505+ void DistanceFieldCollisionDetection::DistanceFieldCollisionObject::approximateNormal (const Vector3r &x, const Real tolerance, Vector3r &n)
506506{
507507 // approximate gradient
508508 Real eps = 1 .e -6 ;
509509 n.setZero ();
510- Eigen::Vector3d xTmp = x;
510+ Vector3r xTmp = x;
511511 for (unsigned int j = 0 ; j < 3 ; j++)
512512 {
513513 xTmp[j] += eps;
@@ -538,7 +538,7 @@ bool DistanceFieldCollisionDetection::DistanceFieldCollisionObject::collisionTes
538538 if (dist < maxDist)
539539 {
540540 // approximate gradient
541- const Eigen::Vector3d x_d = x.template cast <Real>();
541+ const Vector3r x_d = x.template cast <Real>();
542542
543543 approximateNormal (x_d, t_d, n);
544544
0 commit comments