$24
Introduction
The purpose of this lab is to build the foundation for the ray tracer you will
need to write for the assignment by guiding you through the process of designing
and implementing a bare-bones ray tracer that can render a single sphere and
save it to file. We will first discuss what capabilities are already available
within Atlas, and then we will discuss the general structure of the ray tracer.
Once we have all of this ready, we will implement the ray tracer itself.
Available Functionality
Atlas bundles a math library called GLM which will handle the implementation
details of anything related to matrix and vector algebra. Atlas itself provides
aliases for most common types (all found under the `atlas::math` namespace) such
as:
* Vectors: `Vector`, `Vector2`, `Vector4`,
* Points: `Point`, `Point2`, `Point4`, and
* Normals: `Normal`, `Normal2`, `Normal4`.
Note that in all cases, the first type is an element of 3D space.
Through GLM, we also have access to all the common math operators. We can add,
subtract, and multiply any of the above types using the standard operators as if
they were fundamental types like integers or floats. In order to use
vector-specific functions such as the dot and cross product, we use:
* Dot product: `glm::dot`
* Cross product: `glm::cross`
* Normalize: `glm::normalize`
* Length: `glm::length`
You can find out the complete list of functions that GLM provides by reading the
corresponding documentation
[here](https://github.com/g-truc/glm/blob/master/manual.md).