diff --git a/model/plugin/elasticity/floppy_flex.xml b/model/plugin/elasticity/floppy_flex.xml
index a8645f2f..b6a262c3 100644
--- a/model/plugin/elasticity/floppy_flex.xml
+++ b/model/plugin/elasticity/floppy_flex.xml
@@ -22,7 +22,7 @@
-
+
@@ -34,11 +34,11 @@
-
+
diff --git a/src/engine/engine_core_smooth.c b/src/engine/engine_core_smooth.c
index af8b10e6..a8194d82 100644
--- a/src/engine/engine_core_smooth.c
+++ b/src/engine/engine_core_smooth.c
@@ -541,6 +541,11 @@ void mj_flex(const mjModel* m, mjData* d) {
continue;
}
+ // skip Jacobian if no built-in passive force is needed
+ int skipjacobian = !m->flex_edgeequality[f] &&
+ !m->flex_edgedamping[f] &&
+ !m->flex_edgestiffness[f];
+
// process edges of this flex
int vbase = m->flex_vertadr[f];
int ebase = m->flex_edgeadr[f];
@@ -557,6 +562,11 @@ void mj_flex(const mjModel* m, mjData* d) {
mju_sub3(vec, pos2, pos1);
d->flexedge_length[ebase+e] = mju_normalize3(vec);
+ // skip Jacobian if not needed
+ if (skipjacobian) {
+ continue;
+ }
+
// sparse edge Jacobian
if (issparse) {
// set rowadr