Move flex damping to the engine and remove membrane and solid plugins.
PiperOrigin-RevId: 676434954 Change-Id: I24e8dbaa90afcffd613a9cf106ef8b7262195328
This commit is contained in:
committed by
Copybara-Service
parent
6c7e1095c5
commit
4998e7b392
@@ -549,7 +549,8 @@ void mj_flex(const mjModel* m, mjData* d) {
|
||||
// skip Jacobian if no built-in passive force is needed
|
||||
int skipjacobian = !m->flex_edgeequality[f] &&
|
||||
!m->flex_edgedamping[f] &&
|
||||
!m->flex_edgestiffness[f];
|
||||
!m->flex_edgestiffness[f] &&
|
||||
!m->flex_damping[f];
|
||||
|
||||
// process edges of this flex
|
||||
int vbase = m->flex_vertadr[f];
|
||||
|
||||
@@ -127,9 +127,11 @@ static void mj_springdamper(const mjModel* m, mjData* d) {
|
||||
const int* elem = m->flex_elem + m->flex_elemdataadr[f];
|
||||
const int* edgeelem = m->flex_elemedge + m->flex_elemedgeadr[f];
|
||||
mjtNum* xpos = d->flexvert_xpos + 3*m->flex_vertadr[f];
|
||||
mjtNum* vel = d->flexedge_velocity + m->flex_edgeadr[f];
|
||||
mjtNum* deformed = d->flexedge_length + m->flex_edgeadr[f];
|
||||
mjtNum* ref = m->flexedge_length0 + m->flex_edgeadr[f];
|
||||
mjtNum* reference = m->flexedge_length0 + m->flex_edgeadr[f];
|
||||
int* bodyid = m->flex_vertbodyid + m->flex_vertadr[f];
|
||||
mjtNum kD = m->flex_damping[f] / m->opt.timestep;
|
||||
|
||||
mj_markStack(d);
|
||||
mjtNum* qfrc = mj_stackAllocNum(d, 3*m->flex_vertnum[f]);
|
||||
@@ -143,11 +145,17 @@ static void mj_springdamper(const mjModel* m, mjData* d) {
|
||||
mjtNum gradient[6][2][3];
|
||||
GradSquaredLengths(gradient, xpos, vert, edges[dim-2], nedge);
|
||||
|
||||
// we add generalized Rayleigh damping as decribed in Section 5.2 of
|
||||
// Kharevych et al., "Geometric, Variational Integrators for Computer
|
||||
// Animation" http://multires.caltech.edu/pubs/DiscreteLagrangian.pdf
|
||||
|
||||
// extract elongation of edges belonging to this element
|
||||
mjtNum elongation[6];
|
||||
for (int e = 0; e < nedge; e++) {
|
||||
int idx = edgeelem[t * nedge + e];
|
||||
elongation[e] = deformed[idx]*deformed[idx] - ref[idx]*ref[idx];
|
||||
mjtNum previous = deformed[idx] - vel[idx] * m->opt.timestep;
|
||||
elongation[e] = deformed[idx]*deformed[idx] - reference[idx]*reference[idx] +
|
||||
(deformed[idx]*deformed[idx] - previous*previous) * kD;
|
||||
}
|
||||
|
||||
// unpack triangular representation
|
||||
|
||||
Reference in New Issue
Block a user