From be3c3ef8a961c5b553740005246128beb62ec9c7 Mon Sep 17 00:00:00 2001 From: Sam Haves Date: Fri, 4 Jul 2025 11:24:58 -0700 Subject: [PATCH] Add missing gravity attribute authoring to Mjcf SdfFileFormat plugin. PiperOrigin-RevId: 779239797 Change-Id: I039b1089e5b436498d14df384c1aee830fd4b48a --- .../usd/plugins/mjcf/mujoco_to_usd.cc | 10 ++++++ .../usd/plugins/mjcf/mjcf_file_format_test.cc | 32 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/experimental/usd/plugins/mjcf/mujoco_to_usd.cc b/src/experimental/usd/plugins/mjcf/mujoco_to_usd.cc index aba248dd..db16ed7f 100644 --- a/src/experimental/usd/plugins/mjcf/mujoco_to_usd.cc +++ b/src/experimental/usd/plugins/mjcf/mujoco_to_usd.cc @@ -554,6 +554,16 @@ class ModelWriter { break; } + pxr::GfVec3f gravity(spec_->option.gravity[0], spec_->option.gravity[1], + spec_->option.gravity[2]); + // Normalize will normalize gravity in place and return the magnitude before normalization. + float gravity_magnitude = gravity.Normalize(); + + WriteUniformAttribute(physics_scene_path, pxr::SdfValueTypeNames->Float, + pxr::UsdPhysicsTokens->physicsGravityMagnitude, gravity_magnitude); + WriteUniformAttribute(physics_scene_path, pxr::SdfValueTypeNames->Vector3f, + pxr::UsdPhysicsTokens->physicsGravityDirection, gravity); + pxr::GfVec3d wind(spec_->option.wind[0], spec_->option.wind[1], spec_->option.wind[2]); WriteUniformAttribute(physics_scene_path, pxr::SdfValueTypeNames->Double3, 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 019d7d61..65c4b8dc 100644 --- a/test/experimental/usd/plugins/mjcf/mjcf_file_format_test.cc +++ b/test/experimental/usd/plugins/mjcf/mjcf_file_format_test.cc @@ -976,6 +976,38 @@ TEST_F(MjcfSdfFileFormatPluginTest, TestPhysicsScenePrimSDFIterations) { 60); } +TEST_F(MjcfSdfFileFormatPluginTest, TestPhysicsScenePrimGravity) { + auto stage = pxr::UsdStage::Open(LoadLayer(R"( + + + + )")); + + ExpectAttributeEqual(stage, + kPhysicsScenePrimPath.AppendProperty( + pxr::UsdPhysicsTokens->physicsGravityMagnitude), + 123.0f); + ExpectAttributeEqual(stage, + kPhysicsScenePrimPath.AppendProperty( + pxr::UsdPhysicsTokens->physicsGravityDirection), + pxr::GfVec3f(-1.0f, 0.0f, 0.0f)); + + stage = pxr::UsdStage::Open(LoadLayer(R"( + + + + )")); + + ExpectAttributeEqual(stage, + kPhysicsScenePrimPath.AppendProperty( + pxr::UsdPhysicsTokens->physicsGravityMagnitude), + 7.0f); + ExpectAttributeEqual(stage, + kPhysicsScenePrimPath.AppendProperty( + pxr::UsdPhysicsTokens->physicsGravityDirection), + pxr::GfVec3f(0.2857143f, 0.42857143f, 0.85714287f)); +} + TEST_F(MjcfSdfFileFormatPluginTest, TestPhysicsScenePrimDisableFlags) { auto stage = pxr::UsdStage::Open(LoadLayer(R"(