- Home /
Why is transform.up different than transform.localToWorldMatrix.MultiplyVector(Vector3.up) ?
Hello,
I am conscious that arbitrary rotated child transforms get skewed (sheared) on non-uniform scaled parents. I know that it is annoying/surprising for most users, but it is mathematically right
But I noted that, in this specific scenario, the results of the transform's shortcut direction properties (transform.forward, transform.up etc.) are, to my understanding, mathematically wrong.
I expected that local axes would get skewed just like graphic objects, matching the specific transform matrix, under an arbitrary affine transformation. But it is not. As a result, transform.up
yields a different result than transform.localToWorldMatrix.MultiplyVector(Vector3.up)
.
Official docs say that transform.up is "The green axis of the transform in world space." and it is consistent with the gizmos Unity shows in Editor. But such gizmos are always orthogonal and uniform scaled, independent of the local matrix. In other words, increasing y-axis value of a object does not move it in the direction of the gizmo's y-axis.
For example:
In this image there is the default scale handle and a custom scale handle with the following code:
void OnSceneGUI()
{
Handles.matrix = grid.transform.localToWorldMatrix;
Handles.ScaleHandle(Vector3.one, Vector3.zero, Quaternion.identity, .5f);
}
I stumbled on this when I coded a plane that should coincide with the sprite plane and I never could make it right with new Plane(transform.forward, transform.position)
, but I did it with new Plane(transform.localToWorldMatrix.MultiplyVector(Vector3.forward), transform.position)
.
I think it is, besides wrong, misleading. If the gizmos (and of course the direction properties) were transformed accordingly, people would be more aware of what is really going on in the local matrix and maybe we would see less questions like "Why is my child object acting so weird?"