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
This commit is contained in:
Josh Holtrop 2009-01-30 00:18:20 +00:00
parent c5ac957dff
commit 08a0047ba8
3 changed files with 17 additions and 2 deletions

View File

@ -19,8 +19,7 @@ void Transform::lookAt(const Vector & eye,
{ {
Vector forward = focus - eye; Vector forward = focus - eye;
forward.normalize(); forward.normalize();
Vector up_projected_onto_forward = forward * (up % forward) / up.mag2(); Vector perpendicular_up = (up - up.proj(forward)).normalize();
Vector perpendicular_up = (up - up_projected_onto_forward).normalize();
Vector right = forward * perpendicular_up; Vector right = forward * perpendicular_up;
Matrix mult; Matrix mult;
mult[0][0] = right[0]; mult[0][0] = right[0];

View File

@ -40,6 +40,20 @@ double Vector::mag2() const
+ m_array[2] * m_array[2]; + 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) std::ostream & operator<<(std::ostream & out, const Vector & v)
{ {
out << "[" << v[0] << ", " << v[1] << ", " << v[2] << "]"; out << "[" << v[0] << ", " << v[1] << ", " << v[2] << "]";

View File

@ -14,6 +14,8 @@ class Vector
Vector & normalize(); Vector & normalize();
double mag() const; double mag() const;
double mag2() const; double mag2() const;
Vector proj(const Vector & target) const;
Vector reflect(const Vector & target) const;
private: private:
double m_array[3]; double m_array[3];