I’m starting to understand
Quaternion.SetLookRotation, which takes an optional
up vector to get more information about the final orientation.
However, I noticed
Quaternion.SetFromToRotation does not take any
up vector, and I’m having trouble understanding how it deals with that.
As a simple example, I imagined that I rotate my head
90 degrees to the left (e.g. turning left to look before crossing a street). This would be represented by
SetFromToRotation(vector.forward, vector.left). BUT what if after I turn, I TILT (aka “roll”?) my head
45 degrees at an angle, as if I were a dog expressing curiosity/interest and you had just told me you were taking me on a walk.
How can the quaternion represent this new
up angle if it doesn’t take any
up vector in
Confusion comes from that you seem to understand what
Quaternion.LookRotation(forward,up) is but you also project these expectations onto
Quaternion.FromToRotation(from,to) where these are meant to do very different things.
LookRotation is supposed to mean something like “rotation of an object looking in direction”.
Unity - Scripting API: Quaternion.LookRotation
FromToRotation is supposed to mean something like “rotation from one direction to another where rotation axis is
Unity - Scripting API: Quaternion.FromToRotation
Unity - Scripting API: Quaternion.SetFromToRotation (don’t use these
quat.Set_ methods - are adding confusion for no gain)
Please note that
FromToRotation implies some kind of transformation - a tool to rotate other quaternions with. Presence of
up implies fine control and that is simply not the
FromToRotation’s expected job.
It is true that “rotating from direction A to direction B” is underdetermined, i.e. that there are an infinite number of rotations that rotate from A to B. FromToRotation resolves this by always rotating only around the axis that is perpendicular to the two input directions. This rotation also has the minimal angle in axis-angle representation.
It’s basically the same as this:
Quaternion.AngleAxis(Vector3.Angle(A, B), Vector3.Cross(A, B))