@@ -557,13 +557,13 @@ class ModelWriter {
557557 MjcPhysicsTokens->mjcOptionMagnetic , magnetic);
558558
559559 pxr::VtArray<double > o_solref (spec_->option .o_solref ,
560- spec_->option .o_solref + 2 );
560+ spec_->option .o_solref + mjNREF );
561561 WriteUniformAttribute (physics_scene_path,
562562 pxr::SdfValueTypeNames->DoubleArray ,
563563 MjcPhysicsTokens->mjcOptionO_solref , o_solref);
564564
565565 pxr::VtArray<double > o_solimp (spec_->option .o_solimp ,
566- spec_->option .o_solimp + 5 );
566+ spec_->option .o_solimp + mjNIMP );
567567 WriteUniformAttribute (physics_scene_path,
568568 pxr::SdfValueTypeNames->DoubleArray ,
569569 MjcPhysicsTokens->mjcOptionO_solimp , o_solimp);
@@ -1716,6 +1716,80 @@ class ModelWriter {
17161716 upper_limit);
17171717 }
17181718 }
1719+
1720+ // Finally write the mjcPhysicsJointAPI attributes.
1721+ ApplyApiSchema (data_, joint_path, MjcPhysicsTokens->PhysicsJointsAPI );
1722+
1723+ WriteUniformAttribute (
1724+ joint_path, pxr::SdfValueTypeNames->DoubleArray ,
1725+ MjcPhysicsTokens->mjcSpringdamper ,
1726+ pxr::VtArray<double >(joint->springdamper , joint->springdamper + 2 ));
1727+
1728+ WriteUniformAttribute (joint_path, pxr::SdfValueTypeNames->DoubleArray ,
1729+ MjcPhysicsTokens->mjcSolreflimit ,
1730+ pxr::VtArray<double >(joint->solref_limit ,
1731+ joint->solref_limit + mjNREF));
1732+
1733+ WriteUniformAttribute (joint_path, pxr::SdfValueTypeNames->DoubleArray ,
1734+ MjcPhysicsTokens->mjcSolimplimit ,
1735+ pxr::VtArray<double >(joint->solimp_limit ,
1736+ joint->solimp_limit + mjNIMP));
1737+
1738+ WriteUniformAttribute (
1739+ joint_path, pxr::SdfValueTypeNames->DoubleArray ,
1740+ MjcPhysicsTokens->mjcSolreffriction ,
1741+ pxr::VtArray<double >(joint->solref_friction ,
1742+ joint->solref_friction + mjNREF));
1743+
1744+ WriteUniformAttribute (
1745+ joint_path, pxr::SdfValueTypeNames->DoubleArray ,
1746+ MjcPhysicsTokens->mjcSolimpfriction ,
1747+ pxr::VtArray<double >(joint->solimp_friction ,
1748+ joint->solimp_friction + mjNIMP));
1749+
1750+ WriteUniformAttribute (joint_path, pxr::SdfValueTypeNames->Double ,
1751+ MjcPhysicsTokens->mjcStiffness , joint->stiffness );
1752+
1753+ WriteUniformAttribute (joint_path, pxr::SdfValueTypeNames->Double ,
1754+ MjcPhysicsTokens->mjcActuatorfrcrangeMin ,
1755+ joint->actfrcrange [0 ]);
1756+
1757+ WriteUniformAttribute (joint_path, pxr::SdfValueTypeNames->Double ,
1758+ MjcPhysicsTokens->mjcActuatorfrcrangeMax ,
1759+ joint->actfrcrange [1 ]);
1760+
1761+ pxr::TfToken actuatorfrclimited_token = MjcPhysicsTokens->auto_ ;
1762+ if (joint->actfrclimited == mjLIMITED_TRUE) {
1763+ actuatorfrclimited_token = MjcPhysicsTokens->true_ ;
1764+ } else if (joint->actfrclimited == mjLIMITED_FALSE) {
1765+ actuatorfrclimited_token = MjcPhysicsTokens->false_ ;
1766+ }
1767+ WriteUniformAttribute (joint_path, pxr::SdfValueTypeNames->Token ,
1768+ MjcPhysicsTokens->mjcActuatorfrclimited ,
1769+ actuatorfrclimited_token);
1770+
1771+ WriteUniformAttribute (joint_path, pxr::SdfValueTypeNames->Bool ,
1772+ MjcPhysicsTokens->mjcActuatorgravcomp ,
1773+ static_cast <bool >(joint->actgravcomp ));
1774+
1775+ WriteUniformAttribute (joint_path, pxr::SdfValueTypeNames->Double ,
1776+ MjcPhysicsTokens->mjcMargin , joint->margin );
1777+
1778+ WriteUniformAttribute (joint_path, pxr::SdfValueTypeNames->Double ,
1779+ MjcPhysicsTokens->mjcRef , joint->ref );
1780+
1781+ WriteUniformAttribute (joint_path, pxr::SdfValueTypeNames->Double ,
1782+ MjcPhysicsTokens->mjcSpringref , joint->springref );
1783+
1784+ WriteUniformAttribute (joint_path, pxr::SdfValueTypeNames->Double ,
1785+ MjcPhysicsTokens->mjcArmature , joint->armature );
1786+
1787+ WriteUniformAttribute (joint_path, pxr::SdfValueTypeNames->Double ,
1788+ MjcPhysicsTokens->mjcDamping , joint->damping );
1789+
1790+ WriteUniformAttribute (joint_path, pxr::SdfValueTypeNames->Double ,
1791+ MjcPhysicsTokens->mjcFrictionloss ,
1792+ joint->frictionloss );
17191793 }
17201794 if (joint_id >= 0 ) {
17211795 joint_paths_[joint_id] = joint_path;
@@ -1824,8 +1898,7 @@ class ModelWriter {
18241898 // If the parent is not the world body, but is child of the world body
18251899 // then we need to apply the articulation root API.
18261900 if (parent_id != kWorldIndex ) {
1827- int parent_parent_id =
1828- mjs_getId (mjs_getParent (parent->element )->element );
1901+ int parent_parent_id = mjs_getId (mjs_getParent (parent->element )->element );
18291902 if (parent_parent_id == kWorldIndex ) {
18301903 ApplyApiSchema (data_, parent_path,
18311904 pxr::UsdPhysicsTokens->PhysicsArticulationRootAPI );
0 commit comments