In Mujoco USD interop, only consider dynamic friction when writing to and parsing from USD.
PiperOrigin-RevId: 783741987 Change-Id: I23c47a6e95c160c5c7d5c513e268c79e4236e2e4
This commit is contained in:
committed by
Copybara-Service
parent
b99d9e8f12
commit
6144a508b5
@@ -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]);
|
||||
|
||||
@@ -66,6 +66,7 @@
|
||||
#include <pxr/usd/usdPhysics/revoluteJoint.h>
|
||||
#include <pxr/usd/usdPhysics/rigidBodyAPI.h>
|
||||
#include <pxr/usd/usdPhysics/scene.h>
|
||||
#include <pxr/usd/usdShade/material.h>
|
||||
#include <pxr/usd/usdShade/materialBindingAPI.h>
|
||||
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<pxr::UsdPhysicsMassAPI>()) {
|
||||
ParseUsdPhysicsMassAPIForGeom(geom, pxr::UsdPhysicsMassAPI(prim));
|
||||
}
|
||||
|
||||
if (prim.HasAPI<pxr::MjcPhysicsCollisionAPI>()) {
|
||||
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<pxr::UsdPhysicsMassAPI>()) {
|
||||
ParseUsdPhysicsMassAPIForGeom(geom, pxr::UsdPhysicsMassAPI(prim));
|
||||
}
|
||||
|
||||
// Convert displayColor and displayOpacity to rgba.
|
||||
// We want to support primvar inheritance, hence FindPrimvarWithInheritance.
|
||||
pxr::UsdGeomPrimvarsAPI primvarsAPI(prim);
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user