From 866f22a6371bbbeccf3723f3add475598f908902 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 28 Jan 2009 23:47:46 +0000 Subject: [PATCH] added operator*(Vector,double) and operator/(Vector,double) to util/Vector; added lookAt() to util/Transform (needs testing) git-svn-id: svn://anubis/fart/trunk@63 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- util/Transform.cc | 23 +++++++++++++++++++++++ util/Transform.h | 3 +++ util/Vector.cc | 18 ++++++++++++++++++ util/Vector.h | 2 ++ 4 files changed, 46 insertions(+) diff --git a/util/Transform.cc b/util/Transform.cc index 20cdd49..514a4c7 100644 --- a/util/Transform.cc +++ b/util/Transform.cc @@ -13,6 +13,29 @@ Transform Transform::getInverse() return inv; } +void Transform::lookAt(const Vector & eye, + const Vector & focus, + const Vector & up) +{ + 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 right = forward * perpendicular_up; + Matrix mult; + mult[0][0] = right[0]; + mult[0][1] = right[1]; + mult[0][2] = right[2]; + mult[1][0] = forward[0]; + mult[1][1] = forward[1]; + mult[1][2] = forward[2]; + mult[2][0] = perpendicular_up[0]; + mult[2][1] = perpendicular_up[1]; + mult[2][2] = perpendicular_up[2]; + m_matrix *= mult; + translate(-eye[0], -eye[1], -eye[2]); +} + void Transform::translate(double x, double y, double z) { Matrix t = Matrix::identity(); diff --git a/util/Transform.h b/util/Transform.h index fb1babc..39cdc23 100644 --- a/util/Transform.h +++ b/util/Transform.h @@ -12,6 +12,9 @@ class Transform public: Transform(); Transform getInverse(); + void lookAt(const Vector & eye, + const Vector & focus, + const Vector & up); void translate(double x, double y, double z); void rotate(double angle, double xv, double yv, double zv); void scale(double xs, double ys, double zs); diff --git a/util/Vector.cc b/util/Vector.cc index 6ed1a23..b2498a1 100644 --- a/util/Vector.cc +++ b/util/Vector.cc @@ -79,3 +79,21 @@ Vector operator-(const Vector & v1, const Vector & v2) result[2] = v1[2] - v2[2]; return result; } + +Vector operator*(const Vector & v1, double scale) +{ + Vector result = v1; + result[0] *= scale; + result[1] *= scale; + result[2] *= scale; + return result; +} + +Vector operator/(const Vector & v1, double scale) +{ + Vector result = v1; + result[0] /= scale; + result[1] /= scale; + result[2] /= scale; + return result; +} diff --git a/util/Vector.h b/util/Vector.h index 3fb7009..1a5f0cc 100644 --- a/util/Vector.h +++ b/util/Vector.h @@ -24,5 +24,7 @@ double operator%(const Vector & v1, const Vector & v2); Vector operator*(const Vector & v1, const Vector & v2); Vector operator+(const Vector & v1, const Vector & v2); Vector operator-(const Vector & v1, const Vector & v2); +Vector operator*(const Vector & v1, double scale); +Vector operator/(const Vector & v1, double scale); #endif