#include #include #include "CameraClass.h" using namespace std; void CameraClass::Reset() { eye = vec4(0.0, 3.0, -10.0, 1.0); lookAt = vec4(0.0, 0.0, 0.0, 1.0); up = vec4(0.0, 1.0, 0.0, 1.0); Look_Ahead = 10.0; Step_Size = 0.5; Travel_Angle = 90.0; RepositionCenter(); return; } CameraClass::CameraClass(){ Reset(); } void CameraClass::Display(GLuint matrixLocation){ mat4 world; world = LookAt(eye, lookAt, up); glUniformMatrix4fv(matrixLocation,1, GL_TRUE, world); return; } bool CameraClass::Keypress(unsigned char key) { switch(key) { case 'A': Look_Ahead += Step_Size; if (Look_Ahead > 15) { Look_Ahead = 15; } RepositionCenter(); return true; case 'a': Look_Ahead -= Step_Size; if (Look_Ahead < 3) { Look_Ahead = 3; } RepositionCenter(); return true; case 'c': lookAt.y -= .5; RepositionCenter(); return true; case 'C': lookAt.y += .5; RepositionCenter(); return true; case 'u': eye.y += 1; return true; case 'd': eye.y -= 1; return true; } return false; } void CameraClass::Usage() { cout << endl; cout << "\t\tCamera Options" << endl; cout << "\tA/a\t" << "Change Look Ahead" << endl; cout << "\tC/c\t" << "Change lookAt Y" << endl; cout << "\tu\t" << "Move up" << endl; cout << "\td\t" << "Move Down" << endl; cout << endl; return; } void CameraClass::RepositionCenter() { GLfloat dx, dz; while (Travel_Angle < 0) { Travel_Angle += 360; } while (Travel_Angle > 360) { Travel_Angle -= 360; } dx = Look_Ahead * cos(Travel_Angle*M_PI/180.0); dz = Look_Ahead * sin(Travel_Angle*M_PI/180.0); lookAt.x = eye.x + dx; lookAt.z = eye.z + dz; return; } // dir is the direction of the move 1, forward, -1 backward void CameraClass::Move(int dir) { GLfloat dx, dz; dx = dir*Step_Size * cos(Travel_Angle*M_PI/180.0); dz = dir*Step_Size * sin(Travel_Angle*M_PI/180.0); eye.x += dx; eye.z += dz; lookAt.x += dx; lookAt.z += dz; return; } bool CameraClass::SpecialKeypress(int key) { switch (key) { case GLUT_KEY_UP: Move(1); return true; case GLUT_KEY_DOWN: Move(-1); return true; case GLUT_KEY_LEFT: Travel_Angle -= 5; RepositionCenter(); return true; case GLUT_KEY_RIGHT: Travel_Angle += 5; RepositionCenter(); return true; } return false; } vec3 CameraClass::Eye() { return vec3(eye.x, eye.y, eye.z); }