Encapsulates Ray3D, preventing use of struct literal syntax. This allows us to guarantee that
Ray3d direction is normalized, because it can only be instantiated with the constructor.
A 3D ray, with an origin and direction. The direction is guaranteed to be normalized.