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
This commit is contained in:
Josh Holtrop 2009-01-28 23:47:46 +00:00
parent 9041ec6a1c
commit 866f22a637
4 changed files with 46 additions and 0 deletions

View File

@ -13,6 +13,29 @@ Transform Transform::getInverse()
return inv; 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) void Transform::translate(double x, double y, double z)
{ {
Matrix t = Matrix::identity(); Matrix t = Matrix::identity();

View File

@ -12,6 +12,9 @@ class Transform
public: public:
Transform(); Transform();
Transform getInverse(); Transform getInverse();
void lookAt(const Vector & eye,
const Vector & focus,
const Vector & up);
void translate(double x, double y, double z); void translate(double x, double y, double z);
void rotate(double angle, double xv, double yv, double zv); void rotate(double angle, double xv, double yv, double zv);
void scale(double xs, double ys, double zs); void scale(double xs, double ys, double zs);

View File

@ -79,3 +79,21 @@ Vector operator-(const Vector & v1, const Vector & v2)
result[2] = v1[2] - v2[2]; result[2] = v1[2] - v2[2];
return result; 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;
}

View File

@ -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, 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 #endif