From 08a0047ba80c088c84bcbb0eff9ff5170c5eacf5 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 30 Jan 2009 00:18:20 +0000 Subject: [PATCH] added proj() and reflect() to util/Vector, changed util/Transform to use Vector::proj() in lookAt() git-svn-id: svn://anubis/fart/trunk@66 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- util/Transform.cc | 3 +-- util/Vector.cc | 14 ++++++++++++++ util/Vector.h | 2 ++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/util/Transform.cc b/util/Transform.cc index 514a4c7..c7853bc 100644 --- a/util/Transform.cc +++ b/util/Transform.cc @@ -19,8 +19,7 @@ void Transform::lookAt(const Vector & eye, { Vector forward = focus - eye; forward.normalize(); - Vector up_projected_onto_forward = forward * (up % forward) / up.mag2(); - Vector perpendicular_up = (up - up_projected_onto_forward).normalize(); + Vector perpendicular_up = (up - up.proj(forward)).normalize(); Vector right = forward * perpendicular_up; Matrix mult; mult[0][0] = right[0]; diff --git a/util/Vector.cc b/util/Vector.cc index b2498a1..c19591d 100644 --- a/util/Vector.cc +++ b/util/Vector.cc @@ -40,6 +40,20 @@ double Vector::mag2() const + m_array[2] * m_array[2]; } +Vector Vector::proj(const Vector & target) const +{ + Vector target_normalized = target; + target_normalized.normalize(); + return target_normalized * ((*this) % target_normalized); +} + +Vector Vector::reflect(const Vector & target) const +{ + Vector projected = proj(target); + Vector me_to_proj = projected - (*this); + return projected + me_to_proj * 2.0; +} + std::ostream & operator<<(std::ostream & out, const Vector & v) { out << "[" << v[0] << ", " << v[1] << ", " << v[2] << "]"; diff --git a/util/Vector.h b/util/Vector.h index 1a5f0cc..d290f35 100644 --- a/util/Vector.h +++ b/util/Vector.h @@ -14,6 +14,8 @@ class Vector Vector & normalize(); double mag() const; double mag2() const; + Vector proj(const Vector & target) const; + Vector reflect(const Vector & target) const; private: double m_array[3];