@@ -264,7 +264,7 @@ bool MaybeParseGeomPrimitive(const pxr::UsdPrim& prim, T* element,
264
264
return true ;
265
265
}
266
266
267
- mjsMesh* ParseUsdMesh (mjSpec* spec, const pxr::UsdPrim& prim, mjsGeom* geom) {
267
+ mjsMesh* ParseUsdMesh (mjSpec* spec, const pxr::UsdPrim& prim, mjsGeom* geom, pxr::UsdGeomXformCache& xform_cache ) {
268
268
if (!prim.IsA <pxr::UsdGeomMesh>()) {
269
269
return nullptr ;
270
270
}
@@ -305,6 +305,12 @@ mjsMesh* ParseUsdMesh(mjSpec* spec, const pxr::UsdPrim& prim, mjsGeom* geom) {
305
305
306
306
mjsMesh* mesh = mjs_addMesh (spec, nullptr );
307
307
308
+ auto world_xform = xform_cache.GetLocalToWorldTransform (prim);
309
+ auto scale = GetScale (world_xform);
310
+ mesh->scale [0 ] = scale[0 ];
311
+ mesh->scale [1 ] = scale[1 ];
312
+ mesh->scale [2 ] = scale[2 ];
313
+
308
314
std::string mesh_name = usd_mesh.GetPath ().GetAsString ();
309
315
mjs_setName (mesh->element , mesh_name.c_str ());
310
316
mjs_setFloat (mesh->uservert , uservert.data (), uservert.size ());
@@ -1265,7 +1271,7 @@ void ParseUsdGeomGprim(mjSpec* spec, const pxr::UsdPrim& gprim,
1265
1271
ParseDisplayColorAndOpacity (gprim, geom);
1266
1272
SetLocalPoseFromPrim (gprim, body_prim, geom, caches.xform_cache );
1267
1273
if (!MaybeParseGeomPrimitive (gprim, geom, caches.xform_cache )) {
1268
- ParseUsdMesh (spec, gprim, geom);
1274
+ ParseUsdMesh (spec, gprim, geom, caches. xform_cache );
1269
1275
}
1270
1276
}
1271
1277
@@ -1318,7 +1324,7 @@ void ParseUsdPhysicsCollider(mjSpec* spec,
1318
1324
SetLocalPoseFromPrim (prim, body_prim, geom, caches.xform_cache );
1319
1325
1320
1326
if (!MaybeParseGeomPrimitive (prim, geom, caches.xform_cache )) {
1321
- mjsMesh* mesh = ParseUsdMesh (spec, prim, geom);
1327
+ mjsMesh* mesh = ParseUsdMesh (spec, prim, geom, caches. xform_cache );
1322
1328
if (mesh != nullptr && prim.HasAPI <pxr::MjcPhysicsMeshCollisionAPI>()) {
1323
1329
ParseMjcPhysicsMeshCollisionAPI (mesh,
1324
1330
pxr::MjcPhysicsMeshCollisionAPI (prim));
0 commit comments