Add mjContact.solreffriction, mjModel.pair_solreffriction and related implementation, allowing contact reference acceleration to be different for normal and frictional contact directions. This is required for e.g. elastic frictional collisions.

PiperOrigin-RevId: 538513357
Change-Id: Id9eb910fe791cf898c712030cb2c0fc481389c91
This commit is contained in:
Yuval Tassa
2023-06-07 09:39:28 -07:00
committed by Copybara-Service
parent 83e70954d7
commit d82f5ce5a4
19 changed files with 187 additions and 59 deletions
+2
View File
@@ -1871,6 +1871,7 @@ void mjCModel::CopyObjects(mjModel* m) {
m->pair_geom2[i] = pairs[i]->geom2;
m->pair_signature[i] = pairs[i]->signature;
copyvec(m->pair_solref+mjNREF*i, pairs[i]->solref, mjNREF);
copyvec(m->pair_solreffriction+mjNREF*i, pairs[i]->solreffriction, mjNREF);
copyvec(m->pair_solimp+mjNIMP*i, pairs[i]->solimp, mjNIMP);
m->pair_margin[i] = (mjtNum)pairs[i]->margin;
m->pair_gap[i] = (mjtNum)pairs[i]->gap;
@@ -3037,6 +3038,7 @@ bool mjCModel::CopyBack(const mjModel* m) {
// pairs
for (int i=0; i<npair; i++) {
copyvec(pairs[i]->solref, m->pair_solref+mjNREF*i, mjNREF);
copyvec(pairs[i]->solreffriction, m->pair_solreffriction+mjNREF*i, mjNREF);
copyvec(pairs[i]->solimp, m->pair_solimp+mjNIMP*i, mjNIMP);
pairs[i]->margin = (double)m->pair_margin[i];
pairs[i]->gap = (double)m->pair_gap[i];