All hail the metersPerUnit and upAxis metadata
.
However, as the Pixar documentation states:
As with Encoding Stage UpAxis, we restrict the encoding of linear units to be stage-wide; if assembling assets of different metrics, it is the assembler’s responsibility to apply suitable correctives to the referenced data to bring it into the referencing stage’s metric.
Which leaves the question - if we were to programmatically resolve this, e.g. upon loading the content - how does one compute and apply that nicely to the USD stage in such a way that loading into Blender, Maya, Houdini and Unreal becomes as consistent as possible.
Preferably, when building the pipeline, of course we’d write out the data in a consistent size but for as far as I can tell even that’s non-trivial since each of the hosts really wants to stick to their own units. And doing e.g. automatic scale conversion on export seemed “experimental” at best (e.g. mayaUSDExport -metersPerUnit only support Meshes and Transforms conversions?)
So that gets us back at square one. Assuming I’m the stupid one I had hoped this had been solved since the days of Objs, FBX, Alembics and now USD - but it also feels a bit like:
So without arguing how to make the standard. What’s a sensible approach to designing a pipeline where we can avoid the units issues across different applications.
- Some applications are notoriously hardcoded to certain units (e.g. Houdini unit = 1 meter?). So I guess this is not a matter of configuring the scene units in the DCCs.
- If exporting the content from the different DCCs is non-trivial to ‘convert’ at runtime (e.g.
MayaUSDExportonly experimentally supporting that; Blender not listing UI options for that) then I suppose “on export” all we can really do is write metadata? - Does that leave only “on load” / “at runtime” converting of the loaded data? If so, what’s the sensible approach to do that (preferably using USD and its API) to get that to do what we want across different applications?
References
I’ve deliberately said little about Up Axis since I figured just the MPU question may sufficiently trigger solutions, maybe? Also Nvidia Metrics Assembler seems to do this at runtime - but that’d make it Omniverse only?
