Mastering 3D vectors in C++: The vec3 class Explained

In the world of computer graphics, physics simulations, and 3D applications, vectors play a vital role. A 3D vector, often referred to as a vec3, is a fundamental mathematical construct used to represent points in 3D space and perform various operations on them. In this comprehensive guide, we will delve into designing and implementing a powerful vec3 class in C++. We will cover essential topics such as constructors, operator overloading, mathematical operations, and practical usage examples.

Understanding the vec3 Class

The vec3 class represents a three-dimensional vector with three components: x, y, and z. These components can represent a point in space, a direction, a velocity, or any other 3D quantity. Our goal is to create a versatile vec3 class that simplifies working with 3D vectors in C++.

Designing the vec3 Class

Let's begin by designing the structure of our vec3 class:

class vec3 {
public:
    float x, y, z;

    // Constructors
    vec3();
    vec3(float x, float y, float z);

    // Operator Overloading
    vec3 operator+(const vec3& other) const;
    vec3 operator-(const vec3& other) const;
    vec3 operator*(float scalar) const;
    vec3 operator/(float scalar) const;

    // Mathematical Operations
    float length() const;
    float lengthSquared() const;
    vec3 normalized() const;
    float dot(const vec3& other) const;
    vec3 cross(const vec3& other) const;
};

Here's a breakdown of each aspect of the vec3 class:

Constructors

We provide two constructors to initialize vec3 objects:

  1. Default constructor: Initializes an empty vector with all components set to 0.0.
vec3::vec3() : x(0.0f), y(0.0f), z(0.0f) {}
  1. Parameterized constructor: Accepts three values (x, y, and z) to initialize the vector.
vec3::vec3(float x, float y, float z) : x(x), y(y), z(z) {}

Operator Overloading

To make vector operations intuitive, we overload common arithmetic operators:

  • +: Addition of two vectors

  • -: Subtraction of two vectors

  • *: Scalar multiplication

  • /: Scalar division

Here's an example of vector addition:

vec3 vec3::operator+(const vec3& other) const {
    return vec3(x + other.x, y + other.y, z + other.z);
}

Mathematical Operations

The vec3 class provides a set of essential mathematical operations for working with 3D vectors:

  • length(): Calculates the length (magnitude) of the vector.

  • lengthSquared(): Calculates the squared length of the vector (useful for optimization).

  • normalized(): Returns a normalized (unit) vector.

  • dot(): Calculates the dot product of two vectors.

  • cross(): Calculates the cross product of two vectors.

Here's an example of vector normalization:

vec3 vec3::normalized() const {
    float len = length();
    if (len > 0) {
        return vec3(x / len, y / len, z / len);
    } else {
        // Handle zero-length vector gracefully
        return *this;
    }
}

Practical Usage Examples

Now that we've designed our vec3 class, let's explore practical examples of how to use it effectively.

Example 1: Vector Addition and Subtraction

vec3 a(1.0f, 2.0f, 3.0f);
vec3 b(4.0f, 5.0f, 6.0f);

vec3 result_add = a + b;  // Result: (5.0f, 7.0f, 9.0f)
vec3 result_sub = a - b;  // Result: (-3.0f, -3.0f, -3.0f)

Example 2: Scalar Multiplication and Division

vec3 v(1.0f, 2.0f, 3.0f);

vec3 scaled = v * 2.0f;  // Result: (2.0f, 4.0f, 6.0f)
vec3 divided = v / 2.0f;  // Result: (0.5f, 1.0f, 1.5f)

Example 3: Vector Length and Normalization

cppCopy codevec3 v(3.0f, 4.0f, 0.0f);

float len = v.length();       // Result: 5.0f
vec3 normalized = v.normalized();  // Result: (0.6f, 0.8f, 0.0f)

Conclusion

This class equips you with essential tools for manipulating 3D vectors efficiently, making it an invaluable asset for 3D graphics programming, physics simulations, and more. As you continue to work with 3D vectors in C++, remember that understanding and mastering vector operations is key to unlocking the full potential of 3D programming.