@@ -45,7 +45,7 @@ void DistanceFieldCollisionDetection::collisionDetection(SimulationModel &model)
45
45
}
46
46
47
47
// omp_set_num_threads(1);
48
- std::vector<std::vector<ContactData> > contacts_mt;
48
+ std::vector<std::vector<ContactData> > contacts_mt;
49
49
#ifdef _DEBUG
50
50
const unsigned int maxThreads = 1 ;
51
51
#else
@@ -56,7 +56,7 @@ void DistanceFieldCollisionDetection::collisionDetection(SimulationModel &model)
56
56
#pragma omp parallel default(shared)
57
57
{
58
58
// Update BVHs
59
- #pragma omp for schedule(static)
59
+ #pragma omp for schedule(static)
60
60
for (int i = 0 ; i < (int )m_collisionObjects.size (); i++)
61
61
{
62
62
CollisionDetection::CollisionObject *co = m_collisionObjects[i];
@@ -90,7 +90,7 @@ void DistanceFieldCollisionDetection::collisionDetection(SimulationModel &model)
90
90
if ((co1->m_bodyType == CollisionDetection::CollisionObject::RigidBodyCollisionObjectType) &&
91
91
((DistanceFieldCollisionObject*) co1)->m_testMesh )
92
92
{
93
- RigidBody *rb1 = rigidBodies[co1->m_bodyIndex ];
93
+ RigidBody *rb1 = rigidBodies[co1->m_bodyIndex ];
94
94
const Real restitutionCoeff = rb1->getRestitutionCoeff () * rb2->getRestitutionCoeff ();
95
95
const Real frictionCoeff = rb1->getFrictionCoeff () + rb2->getFrictionCoeff ();
96
96
collisionDetectionRigidBodies (rb1, (DistanceFieldCollisionObject*)co1, rb2, (DistanceFieldCollisionObject*)co2,
@@ -131,18 +131,18 @@ void DistanceFieldCollisionDetection::collisionDetection(SimulationModel &model)
131
131
for (unsigned int j = 0 ; j < contacts_mt[i].size (); j++)
132
132
{
133
133
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 ,
136
136
contacts_mt[i][j].m_dist , contacts_mt[i][j].m_restitution , contacts_mt[i][j].m_friction );
137
137
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 ,
140
140
contacts_mt[i][j].m_dist , contacts_mt[i][j].m_restitution , contacts_mt[i][j].m_friction );
141
141
}
142
142
}
143
143
}
144
144
145
- void DistanceFieldCollisionDetection::collisionDetectionRigidBodies (RigidBody *rb1, DistanceFieldCollisionObject *co1, RigidBody *rb2, DistanceFieldCollisionObject *co2,
145
+ void DistanceFieldCollisionDetection::collisionDetectionRigidBodies (RigidBody *rb1, DistanceFieldCollisionObject *co1, RigidBody *rb2, DistanceFieldCollisionObject *co2,
146
146
const Real restitutionCoeff, const Real frictionCoeff
147
147
, std::vector<std::vector<ContactData> > &contacts_mt
148
148
)
@@ -155,12 +155,12 @@ void DistanceFieldCollisionDetection::collisionDetectionRigidBodies(RigidBody *r
155
155
const Vector3r &com2 = rb2->getPosition ();
156
156
157
157
// 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
159
159
// evaluated in local coordinates
160
160
//
161
161
// transformation world to local:
162
162
// p_local = R_initial^T ( R_MAT R^T (p_world - x) - x_initial + x_MAT)
163
- //
163
+ //
164
164
// transformation local to:
165
165
// p_world = R R_MAT^T (R_initial p_local + x_initial - x_MAT) + x
166
166
//
@@ -215,7 +215,7 @@ void DistanceFieldCollisionDetection::collisionDetectionRigidBodies(RigidBody *r
215
215
int tid = 0 ;
216
216
#else
217
217
int tid = omp_get_thread_num ();
218
- #endif
218
+ #endif
219
219
contacts_mt[tid].push_back ({ 0 , co1->m_bodyIndex , co2->m_bodyIndex , x_w, cp_w, n_w, dist, restitutionCoeff, frictionCoeff });
220
220
}
221
221
}
@@ -225,20 +225,20 @@ void DistanceFieldCollisionDetection::collisionDetectionRigidBodies(RigidBody *r
225
225
226
226
227
227
void 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,
229
229
const Real restitutionCoeff, const Real frictionCoeff
230
230
, std::vector<std::vector<ContactData> > &contacts_mt
231
231
)
232
232
{
233
233
const Vector3r &com2 = rb2->getPosition ();
234
234
235
235
// 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
237
237
// evaluated in local coordinates
238
238
//
239
239
// transformation world to local:
240
240
// p_local = R_initial^T ( R_MAT R^T (p_world - x) - x_initial + x_MAT)
241
- //
241
+ //
242
242
// transformation local to:
243
243
// p_world = R R_MAT^T (R_initial p_local + x_initial - x_MAT) + x
244
244
//
@@ -294,7 +294,7 @@ void DistanceFieldCollisionDetection::collisionDetectionRBSolid(const ParticleDa
294
294
int tid = 0 ;
295
295
#else
296
296
int tid = omp_get_thread_num ();
297
- #endif
297
+ #endif
298
298
contacts_mt[tid].push_back ({ 1 , index, co2->m_bodyIndex , x_w, cp_w, n_w, dist, restitutionCoeff, frictionCoeff });
299
299
}
300
300
}
@@ -305,9 +305,9 @@ void DistanceFieldCollisionDetection::collisionDetectionRBSolid(const ParticleDa
305
305
306
306
bool DistanceFieldCollisionDetection::isDistanceFieldCollisionObject (CollisionObject *co) const
307
307
{
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) ||
311
311
(co->getTypeId () == DistanceFieldCollisionDetection::DistanceFieldCollisionCylinder::TYPE_ID) ||
312
312
(co->getTypeId () == DistanceFieldCollisionDetection::DistanceFieldCollisionHollowSphere::TYPE_ID) ||
313
313
(co->getTypeId () == DistanceFieldCollisionDetection::DistanceFieldCollisionHollowBox::TYPE_ID) ||
@@ -319,7 +319,7 @@ void DistanceFieldCollisionDetection::addCollisionBox(const unsigned int bodyInd
319
319
DistanceFieldCollisionDetection::DistanceFieldCollisionBox *cf = new DistanceFieldCollisionDetection::DistanceFieldCollisionBox ();
320
320
cf->m_bodyIndex = bodyIndex;
321
321
cf->m_bodyType = bodyType;
322
- // distance function requires 0.5*box
322
+ // distance function requires 0.5*box
323
323
cf->m_box = 0.5 *box;
324
324
cf->m_bvh .init (vertices, numVertices);
325
325
cf->m_bvh .construct ();
@@ -393,7 +393,7 @@ void DistanceFieldCollisionDetection::addCollisionHollowBox(const unsigned int b
393
393
DistanceFieldCollisionDetection::DistanceFieldCollisionHollowBox *cf = new DistanceFieldCollisionDetection::DistanceFieldCollisionHollowBox ();
394
394
cf->m_bodyIndex = bodyIndex;
395
395
cf->m_bodyType = bodyType;
396
- // distance function requires 0.5*box
396
+ // distance function requires 0.5*box
397
397
cf->m_box = 0.5 *box;
398
398
cf->m_thickness = thickness;
399
399
cf->m_bvh .init (vertices, numVertices);
@@ -416,18 +416,18 @@ void DistanceFieldCollisionDetection::addCollisionObjectWithoutGeometry(const un
416
416
m_collisionObjects.push_back (co);
417
417
}
418
418
419
- Real DistanceFieldCollisionDetection::DistanceFieldCollisionBox::distance (const Eigen::Vector3d &x, const Real tolerance)
419
+ Real DistanceFieldCollisionDetection::DistanceFieldCollisionBox::distance (const Vector3r &x, const Real tolerance)
420
420
{
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;
426
426
}
427
427
428
- Real DistanceFieldCollisionDetection::DistanceFieldCollisionSphere::distance (const Eigen::Vector3d &x, const Real tolerance)
428
+ Real DistanceFieldCollisionDetection::DistanceFieldCollisionSphere::distance (const Vector3r &x, const Real tolerance)
429
429
{
430
- const Eigen::Vector3d d = x.template cast <Real>();
430
+ const Vector3r d = x.template cast <Real>();
431
431
const Real dl = d.norm ();
432
432
return m_invertSDF*(dl - static_cast <Real>(m_radius)) - tolerance;
433
433
}
@@ -450,25 +450,25 @@ bool DistanceFieldCollisionDetection::DistanceFieldCollisionSphere::collisionTes
450
450
return false ;
451
451
}
452
452
453
- Real DistanceFieldCollisionDetection::DistanceFieldCollisionTorus::distance (const Eigen::Vector3d &x, const Real tolerance)
453
+ Real DistanceFieldCollisionDetection::DistanceFieldCollisionTorus::distance (const Vector3r &x, const Real tolerance)
454
454
{
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 ());
457
457
return m_invertSDF*(q.norm () - radii_d.y ()) - tolerance;
458
458
}
459
459
460
- Real DistanceFieldCollisionDetection::DistanceFieldCollisionCylinder::distance (const Eigen::Vector3d &x, const Real tolerance)
460
+ Real DistanceFieldCollisionDetection::DistanceFieldCollisionCylinder::distance (const Vector3r &x, const Real tolerance)
461
461
{
462
462
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;
466
466
}
467
467
468
468
469
- Real DistanceFieldCollisionDetection::DistanceFieldCollisionHollowSphere::distance (const Eigen::Vector3d &x, const Real tolerance)
469
+ Real DistanceFieldCollisionDetection::DistanceFieldCollisionHollowSphere::distance (const Vector3r &x, const Real tolerance)
470
470
{
471
- const Eigen::Vector3d d = x.template cast <Real>();
471
+ const Vector3r d = x.template cast <Real>();
472
472
const Real dl = d.norm ();
473
473
return m_invertSDF*(fabs (dl - m_radius) - m_thickness) - tolerance;
474
474
}
@@ -493,21 +493,21 @@ bool DistanceFieldCollisionDetection::DistanceFieldCollisionHollowSphere::collis
493
493
return false ;
494
494
}
495
495
496
- Real DistanceFieldCollisionDetection::DistanceFieldCollisionHollowBox::distance (const Eigen::Vector3d &x, const Real tolerance)
496
+ Real DistanceFieldCollisionDetection::DistanceFieldCollisionHollowBox::distance (const Vector3r &x, const Real tolerance)
497
497
{
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;
503
503
}
504
504
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)
506
506
{
507
507
// approximate gradient
508
508
Real eps = 1 .e -6 ;
509
509
n.setZero ();
510
- Eigen::Vector3d xTmp = x;
510
+ Vector3r xTmp = x;
511
511
for (unsigned int j = 0 ; j < 3 ; j++)
512
512
{
513
513
xTmp[j] += eps;
@@ -538,7 +538,7 @@ bool DistanceFieldCollisionDetection::DistanceFieldCollisionObject::collisionTes
538
538
if (dist < maxDist)
539
539
{
540
540
// approximate gradient
541
- const Eigen::Vector3d x_d = x.template cast <Real>();
541
+ const Vector3r x_d = x.template cast <Real>();
542
542
543
543
approximateNormal (x_d, t_d, n);
544
544
0 commit comments