Project: Math Library


Goal

  • Build a minimal math library for the CPU path tracer
  • Understand the math by implementing it, not just using GLM

Components to Implement

  • Vec3
    • +, -, *, / operators (component-wise and scalar)
    • dot(a, b) — dot product
    • cross(a, b) — cross product
    • length(v) — Euclidean length
    • normalize(v) — unit vector
    • reflect(v, n) — reflection
    • refract(v, n, eta) — refraction (Snell’s law)
    • lerp(a, b, t) — linear interpolation
  • Ray
    • origin, direction fields
    • at(t) — point along ray
  • Transform (4×4 matrix)
    • translate, rotate, scale constructors
    • Matrix multiply
    • transform_point(p) — apply to point (w=1)
    • transform_direction(d) — apply to direction (w=0)
    • inverse() — for normal transform

Test Cases

  • dot(vec3(1,0,0), vec3(0,1,0)) == 0 (perpendicular)
  • dot(vec3(1,0,0), vec3(1,0,0)) == 1 (parallel unit vectors)
  • length(normalize(v)) == 1 for any non-zero v
  • cross(vec3(1,0,0), vec3(0,1,0)) == vec3(0,0,1) (right-hand rule)
  • reflect(vec3(1,-1,0), vec3(0,1,0)) == vec3(1,1,0) (mirror in XZ plane)

Notes

  • Use float not double — GPU uses float, keep consistent
  • SIMD optimization later — get correctness first
  • Consider using GLM for the actual path tracer once concepts are understood