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 `SetFromToRotation`?

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

`LookRotation` is supposed to mean something like “rotation of an object looking in direction”.

Unity - Scripting API: Quaternion.LookRotation

### FromToRotation

`FromToRotation` is supposed to mean something like “rotation from one direction to another where rotation axis is `Vector3.Cross(from,to)`”.

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))
``````