diff --git a/src/user/user_objects.cc b/src/user/user_objects.cc
index a4bf8b61..35db7cbd 100644
--- a/src/user/user_objects.cc
+++ b/src/user/user_objects.cc
@@ -2344,6 +2344,7 @@ void mjCGeom::Compile(void) {
// compute geom mass and inertia
if (inferinertia) {
+ // mass is defined
if (mjuu_defined(mass)) {
if (mass==0) {
mass_ = 0;
@@ -2353,11 +2354,19 @@ void mjCGeom::Compile(void) {
density = mass / GetVolume();
SetInertia();
}
- } else {
- mass_ = density * GetVolume();
- SetInertia();
}
+ // mass is not defined
+ else {
+ if (density == 0) {
+ mass_ = 0;
+ } else {
+ mass_ = density * GetVolume();
+ SetInertia();
+ }
+ }
+
+
// check for negative values
if (mass_<0 || inertia[0]<0 || inertia[1]<0 || inertia[2]<0 || density<0)
throw mjCError(this, "mass, inertia or density are negative in geom");
diff --git a/test/user/user_objects_test.cc b/test/user/user_objects_test.cc
index 4e1a7ea1..5441ea9f 100644
--- a/test/user/user_objects_test.cc
+++ b/test/user/user_objects_test.cc
@@ -755,6 +755,32 @@ TEST_F(MjCGeomTest, NanSize) {
EXPECT_THAT(error.data(), HasSubstr("line 5"));
}
+TEST_F(MjCGeomTest, BadMeshZeroMassDensityDoesntError) {
+ static constexpr char xml[] = R"(
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )";
+ std::array error;
+ mjModel* model = LoadModelFromString(xml, error.data(), error.size());
+ ASSERT_THAT(model, NotNull()) << error.data();
+ EXPECT_EQ(model->body_mass[1], 0);
+ EXPECT_EQ(model->body_mass[2], 0);
+ mj_deleteModel(model);
+}
+
// ------------- test height fields --------------------------------------------
using MjCHFieldTest = MujocoTest;