diff --git a/src/experimental/usd/plugins/mjcf/mujoco_to_usd.cc b/src/experimental/usd/plugins/mjcf/mujoco_to_usd.cc index 9ff49905..37af6929 100644 --- a/src/experimental/usd/plugins/mjcf/mujoco_to_usd.cc +++ b/src/experimental/usd/plugins/mjcf/mujoco_to_usd.cc @@ -831,9 +831,8 @@ class ModelWriter { mjsGeom *geom_default = mjs_getDefault(geom->element)->geom; if (geom->friction[0] != geom_default->friction[0]) { - WriteUniformAttribute(material_path, pxr::SdfValueTypeNames->Float, - pxr::UsdPhysicsTokens->physicsStaticFriction, - (float)geom->friction[0]); + // Since MuJoCo has no concept of static friction, only write dynamic + // friction to remain truthful to how MuJoCo perceives the data. WriteUniformAttribute(material_path, pxr::SdfValueTypeNames->Float, pxr::UsdPhysicsTokens->physicsDynamicFriction, (float)geom->friction[0]); diff --git a/src/experimental/usd/usd_to_mjspec.cc b/src/experimental/usd/usd_to_mjspec.cc index c2144c71..752d8033 100644 --- a/src/experimental/usd/usd_to_mjspec.cc +++ b/src/experimental/usd/usd_to_mjspec.cc @@ -66,6 +66,7 @@ #include #include #include +#include #include namespace { @@ -1136,19 +1137,8 @@ void ParseMjcPhysicsJointAPI(mjsJoint* mj_joint, void ParseUsdPhysicsMaterialAPI( mjsGeom* geom, const pxr::UsdPhysicsMaterialAPI& material_api) { - auto static_friction_attr = material_api.GetStaticFrictionAttr(); auto dynamic_friction_attr = material_api.GetDynamicFrictionAttr(); - if (static_friction_attr.HasAuthoredValue()) { - if (dynamic_friction_attr.HasAuthoredValue()) { - mju_warning( - "Material %s has both static and dynamic friction authored, taking " - "the static value.", - material_api.GetPath().GetString().c_str()); - } - float static_friction; - static_friction_attr.Get(&static_friction); - geom->friction[0] = static_friction; - } else if (dynamic_friction_attr.HasAuthoredValue()) { + if (dynamic_friction_attr.HasAuthoredValue()) { float dynamic_friction; dynamic_friction_attr.Get(&dynamic_friction); geom->friction[0] = dynamic_friction; @@ -1205,10 +1195,6 @@ void ParseUsdPhysicsCollider(mjSpec* spec, geom->contype = 1; geom->conaffinity = 1; - if (prim.HasAPI()) { - ParseUsdPhysicsMassAPIForGeom(geom, pxr::UsdPhysicsMassAPI(prim)); - } - if (prim.HasAPI()) { ParseMjcPhysicsCollisionAPI(geom, pxr::MjcPhysicsCollisionAPI(prim)); } @@ -1225,6 +1211,13 @@ void ParseUsdPhysicsCollider(mjSpec* spec, } } + // Parse the Mass API after the physics material APIs since the density attribute + // from the Mass API is supposed to override the Material API density attribute. + // See https://openusd.org/dev/api/usd_physics_page_front.html + if (prim.HasAPI()) { + ParseUsdPhysicsMassAPIForGeom(geom, pxr::UsdPhysicsMassAPI(prim)); + } + // Convert displayColor and displayOpacity to rgba. // We want to support primvar inheritance, hence FindPrimvarWithInheritance. pxr::UsdGeomPrimvarsAPI primvarsAPI(prim); diff --git a/test/experimental/usd/plugins/mjcf/mjcf_file_format_test.cc b/test/experimental/usd/plugins/mjcf/mjcf_file_format_test.cc index e2423ef1..1863f444 100644 --- a/test/experimental/usd/plugins/mjcf/mjcf_file_format_test.cc +++ b/test/experimental/usd/plugins/mjcf/mjcf_file_format_test.cc @@ -155,10 +155,6 @@ TEST_F(MjcfSdfFileFormatPluginTest, TestPhysicsMaterials) { stage, "/physics_materials_test/test_body/geom_with_friction.material:binding", "/physics_materials_test/PhysicsMaterials/geom_with_friction"); - ExpectAttributeEqual(stage, - "/physics_materials_test/PhysicsMaterials/" - "geom_with_friction.physics:staticFriction", - 4.0f); ExpectAttributeEqual(stage, "/physics_materials_test/PhysicsMaterials/" "geom_with_friction.physics:dynamicFriction",