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;
|
mjsGeom *geom_default = mjs_getDefault(geom->element)->geom;
|
||||||
if (geom->friction[0] != geom_default->friction[0]) {
|
if (geom->friction[0] != geom_default->friction[0]) {
|
||||||
WriteUniformAttribute(material_path, pxr::SdfValueTypeNames->Float,
|
// Since MuJoCo has no concept of static friction, only write dynamic
|
||||||
pxr::UsdPhysicsTokens->physicsStaticFriction,
|
// friction to remain truthful to how MuJoCo perceives the data.
|
||||||
(float)geom->friction[0]);
|
|
||||||
WriteUniformAttribute(material_path, pxr::SdfValueTypeNames->Float,
|
WriteUniformAttribute(material_path, pxr::SdfValueTypeNames->Float,
|
||||||
pxr::UsdPhysicsTokens->physicsDynamicFriction,
|
pxr::UsdPhysicsTokens->physicsDynamicFriction,
|
||||||
(float)geom->friction[0]);
|
(float)geom->friction[0]);
|
||||||
|
|||||||
@@ -66,6 +66,7 @@
|
|||||||
#include <pxr/usd/usdPhysics/revoluteJoint.h>
|
#include <pxr/usd/usdPhysics/revoluteJoint.h>
|
||||||
#include <pxr/usd/usdPhysics/rigidBodyAPI.h>
|
#include <pxr/usd/usdPhysics/rigidBodyAPI.h>
|
||||||
#include <pxr/usd/usdPhysics/scene.h>
|
#include <pxr/usd/usdPhysics/scene.h>
|
||||||
|
#include <pxr/usd/usdShade/material.h>
|
||||||
#include <pxr/usd/usdShade/materialBindingAPI.h>
|
#include <pxr/usd/usdShade/materialBindingAPI.h>
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
@@ -1136,19 +1137,8 @@ void ParseMjcPhysicsJointAPI(mjsJoint* mj_joint,
|
|||||||
|
|
||||||
void ParseUsdPhysicsMaterialAPI(
|
void ParseUsdPhysicsMaterialAPI(
|
||||||
mjsGeom* geom, const pxr::UsdPhysicsMaterialAPI& material_api) {
|
mjsGeom* geom, const pxr::UsdPhysicsMaterialAPI& material_api) {
|
||||||
auto static_friction_attr = material_api.GetStaticFrictionAttr();
|
|
||||||
auto dynamic_friction_attr = material_api.GetDynamicFrictionAttr();
|
auto dynamic_friction_attr = material_api.GetDynamicFrictionAttr();
|
||||||
if (static_friction_attr.HasAuthoredValue()) {
|
if (dynamic_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()) {
|
|
||||||
float dynamic_friction;
|
float dynamic_friction;
|
||||||
dynamic_friction_attr.Get(&dynamic_friction);
|
dynamic_friction_attr.Get(&dynamic_friction);
|
||||||
geom->friction[0] = dynamic_friction;
|
geom->friction[0] = dynamic_friction;
|
||||||
@@ -1205,10 +1195,6 @@ void ParseUsdPhysicsCollider(mjSpec* spec,
|
|||||||
geom->contype = 1;
|
geom->contype = 1;
|
||||||
geom->conaffinity = 1;
|
geom->conaffinity = 1;
|
||||||
|
|
||||||
if (prim.HasAPI<pxr::UsdPhysicsMassAPI>()) {
|
|
||||||
ParseUsdPhysicsMassAPIForGeom(geom, pxr::UsdPhysicsMassAPI(prim));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (prim.HasAPI<pxr::MjcPhysicsCollisionAPI>()) {
|
if (prim.HasAPI<pxr::MjcPhysicsCollisionAPI>()) {
|
||||||
ParseMjcPhysicsCollisionAPI(geom, pxr::MjcPhysicsCollisionAPI(prim));
|
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.
|
// Convert displayColor and displayOpacity to rgba.
|
||||||
// We want to support primvar inheritance, hence FindPrimvarWithInheritance.
|
// We want to support primvar inheritance, hence FindPrimvarWithInheritance.
|
||||||
pxr::UsdGeomPrimvarsAPI primvarsAPI(prim);
|
pxr::UsdGeomPrimvarsAPI primvarsAPI(prim);
|
||||||
|
|||||||
@@ -155,10 +155,6 @@ TEST_F(MjcfSdfFileFormatPluginTest, TestPhysicsMaterials) {
|
|||||||
stage,
|
stage,
|
||||||
"/physics_materials_test/test_body/geom_with_friction.material:binding",
|
"/physics_materials_test/test_body/geom_with_friction.material:binding",
|
||||||
"/physics_materials_test/PhysicsMaterials/geom_with_friction");
|
"/physics_materials_test/PhysicsMaterials/geom_with_friction");
|
||||||
ExpectAttributeEqual(stage,
|
|
||||||
"/physics_materials_test/PhysicsMaterials/"
|
|
||||||
"geom_with_friction.physics:staticFriction",
|
|
||||||
4.0f);
|
|
||||||
ExpectAttributeEqual(stage,
|
ExpectAttributeEqual(stage,
|
||||||
"/physics_materials_test/PhysicsMaterials/"
|
"/physics_materials_test/PhysicsMaterials/"
|
||||||
"geom_with_friction.physics:dynamicFriction",
|
"geom_with_friction.physics:dynamicFriction",
|
||||||
|
|||||||
Reference in New Issue
Block a user