Original Post
Hi people. I'm creating this camera class which i want to combine usability of world system coordinates and local rotations. I've encountered very strange results and can't quite pinpoint the source of the problem. Oh yeah, my vector cross product, magnitude and normalize methods look like this (maybe the error's here?): Any help would be welcome :)
class CCam
{
public:
// constructors, destructors
CCam() {}
CCam(float px, float py, float pz, float ax, float ay, float az, float ux, float uy, float uz)
{
pos.x = px;
pos.y = py;
pos.z = pz;
at.x = ax;
at.y = ay;
at.z = az;
up.x = ux;
up.y = uy;
up.z = uz;
at = at-pos;
at.Normalize();
at = pos+at;
up.Normalize();
up=pos+up;
side = (up - pos)^(at-pos);
side.Normalize();
side = side + pos;
up = (at - pos)^(side - pos);
up.Normalize();
up = up + pos;
}
~CCam() {}
void Pitch(float angle) // dunno if this is correct english name - it is supposed to be rotation of 'at' vector about 'up' vector ;)
{
at = at - pos;
up = up - pos;
at = at.Rotate(angle, up);
at.Normalize();
at = pos + at;
up = up + pos;
side = (up - pos)^(at-pos);
side.Normalize();
side = side + pos;
}
CVector operator^(const CVector &v) const { return CVector(y*v.z - z*v.y, z*v.x - x*v.z, x*v.y - y*v.x);}
float Magnitude() const { return sqrt(x*x + y*y + z*z);}
void Normalize() { if(Magnitude() != 0)*this /= Magnitude();}