Add implicit bending stiffness for standard flex.
Standard flex (flex_interp=0) with thin-plate bending treated bending forces purely explicitly. This caused contact-induced vertex vibrations and non-physical energy injection for flat resting sheets, because the solver treated each vertex as an independent mass during contact and contact normals are orthogonal to stretch constraints. Fix: extend the existing preconditioned CG solver to include the constant bending stiffness K_bend in the implicit operator via matrix-free mat-vec. PiperOrigin-RevId: 914774020 Change-Id: I45e0d6749abb6f873566203bccae956514b2576b
This commit is contained in:
committed by
Copybara-Service
parent
7bfdbad80b
commit
35cdc779e6
@@ -1474,7 +1474,7 @@ void RotateFlexGrid(mjModel* model, mjData* data, const char* flex_name,
|
||||
}
|
||||
|
||||
// Helper: assemble flex stiffness into dense matrix via matrix-vector products.
|
||||
// Builds K column-by-column using mjd_flexInterp_mulKD.
|
||||
// Builds K column-by-column using mjd_flexInterp_mul.
|
||||
// Result is -(h^2 + h*damping) * J'KJ (negative sign matches the old addH
|
||||
// convention where stiffness is subtracted from the system matrix).
|
||||
static void mulKD_dense(mjModel* m, mjData* d, mjtNum* H_dense,
|
||||
@@ -1485,7 +1485,7 @@ static void mulKD_dense(mjModel* m, mjData* d, mjtNum* H_dense,
|
||||
mju_zero(e_i.data(), nv);
|
||||
mju_zero(col.data(), nv);
|
||||
e_i[i] = 1.0;
|
||||
mjd_flexInterp_mulKD(m, d, col.data(), e_i.data(), h);
|
||||
mjd_flexInterp_mul(m, d, col.data(), e_i.data(), h * h, h);
|
||||
// col = +(h^2 + h*damp)*K*e_i, negate to match addH convention (H -= K)
|
||||
for (int j = 0; j < nv; j++) {
|
||||
H_dense[j * nv + i] = -col[j];
|
||||
|
||||
Reference in New Issue
Block a user