Normalizing / Unit Vectors
A normalized vector sometimes refered to as a unit vector is a vector which has a Magnitude of 1. This means the vector will always point somewhere on a unit circle / sphere (a circle / sphere with a radius of 1). A unit vector is represented by a letter with a caret symbol (^), sometimes called a hat on top of it, like so: \(\hat{A}\).
To normalize a vector, divide each component of the vector by the Length of the vector. A vector with a magnitude of 0 can not be normalized, as it would result in a division by 0.
$$ \hat{A} = \frac{\vec{A}}{\|\vec{A}\|} = (\frac{A_{0}}{\|\vec{A}\|}, \frac{A_{1}}{\|\vec{A}\|} ... \frac{A_{n}}{\|\vec{A}\|} ) $$
The above example shows vector \(\vec{A}\) in blue and the normalized vector \(\hat{A}\) in orange. The length of \(\vec{A}\), \(\|A\|\) is also printed in blue at the top left. Notice that no matter what the length of \(\vec{A}\) is, the end of \(\hat{A}\) always lands on a point of a unit circle. This happens because the length of a unit vector is always 1, the same as the radius of a unit circle.
A slight optimization
With an \(n\) dimensional vectors, \(n\) divisions are needed to normalize a vector. Games often optimize this away with reciprical division. Instead of dividing each element by the length of the vector, multiply each elemnt by \(\frac{1}{length}\). This way, only one division is needed: \( \hat{A} = \frac{\vec{A}}{\|\vec{A}\|} = \vec{A} \frac{1}{\|\vec{A}\|} \)
Games will often implement two versions of a normalize function, Normalize(vec* v)
and Normalized(vec v)
. The first function normalizes the input vector, the second function returns a normalized copy without modifying the actual input vector.
vec Normalized(vec a) { float len = Magnitude(a); assert(len != 0.0); float inv_len = 1.0 / len return Mul(a, inv_len); }