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:
committed by
Copybara-Service
parent
83e70954d7
commit
d82f5ce5a4
@@ -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];
|
||||
|
||||
@@ -2931,6 +2931,7 @@ mjCPair::mjCPair(mjCModel* _model, mjCDef* _def) {
|
||||
|
||||
condim = 3;
|
||||
mj_defaultSolRefImp(solref, solimp);
|
||||
mju_zero(solreffriction, mjNREF);
|
||||
margin = 0;
|
||||
gap = 0;
|
||||
friction[0] = 1;
|
||||
|
||||
@@ -772,7 +772,8 @@ class mjCPair : public mjCBase {
|
||||
|
||||
// optional parameters: computed from geoms if not set by user
|
||||
int condim; // contact dimensionality
|
||||
mjtNum solref[mjNREF]; // solver reference
|
||||
mjtNum solref[mjNREF]; // solver reference, normal direction
|
||||
mjtNum solreffriction[mjNREF]; // solver reference, frictional directions
|
||||
mjtNum solimp[mjNIMP]; // solver impedance
|
||||
double margin; // margin for contact detection
|
||||
double gap; // include in solver if dist<margin-gap
|
||||
|
||||
Reference in New Issue
Block a user