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