Referencing a file converts its unit scale

Why does maya referencing and import behaviors treat scene linear unit settings like cosmetics and auto convert an object into the imported objects scene’s settings?

Changing the units inside a scene doesn’t cause this behavior. Animation has exposed option for ‘if to convert or not’, why not linearUnits? What if something is correct in centimetres, and its being brought into a meter workspace?

I’m not seeing any UI options to manage this behavior, and nothing is jumping out yet (at this late hour) inside the file command script references to suggest controlling this behavior.

We had a run-in with maya units when referencing our rigs. Here’s what we figured out

General notes:

  • The type of the attribute matters a LOT in these cases, and that includes any custom attributes you create
  • Attributes that deal with unit conversion are angle, distance, and unitless (default float attributes)
  • Maya’s native units are centimeters and radians. Basically everything at the API level uses these units (with few exceptions)

How Unit Conversion connections work:

  • If the type of the attributes to be connected matches (angle, distance, or unitless), then no conversion is added
  • If the type doesn’t match, create a unit conversion node. EXCEPT if both ends are api native type for the current scene (unitless is always native type)

So a unitless attribute connected to a distance attribute when the scene is in centimeters will not create a conversion node. But the same connection made when the scene is in meters, or inches will. And a connection between distance and angle when the units are set to centimeters and radians will not create a unit conversion node.


Thoughts on conversion
Attributes of type distance or angle are always stored and passed in native units, but will be displayed in current scene units

You can prove this to yourself if you create a float attribute, and connect it to an angle. You’ll get a unit conversion node of 0.017 (degrees to radians). However, the controlled angle will display the same value as the controlling attribute. This is because the actual value passed is in radians, but there is an implicit conversion from radians to degrees for display in the UI.

In that case, because the float is connected to an angle when the scene is in degrees, maya assumes that you meant that attribute to be interacted with as degrees, and therefore any animation or whatever on that value will always be in degrees, no matter how you change the scene units because that attribute is unitless.
And If you didn’t do it like that, then when you referenced an already animated file into another with different units, then the animation would necessarily change


Our biggest takeaway from that experience was always always always make sure that when you create attributes that are supposed to be angles, you make the attribute an angle type, and when they’re supposed to be distances, you make them distance type. You can’t do that through the “Add Attribute…” menu item, you’ve gotta do it through code. We also had to go back through all our custom c++ nodes, update the attribute types, and recompile them to get the expected behavior.

5 Likes

There is so much insightful information in your post, thank you!

I’m actively down an “accidental” incorrect unit assignment on a lot of unknown files I’m tasked to fix, but I’m aware of an on purpose, modeling and rigging being forced and done in cm, and animation wanting to work in meters batch of files task coming up.

The insight into the unit conversion node alone was gold, thank you thank you!