#include #include #include #include #include #include #include #include #include #include using glm::vec2; using glm::vec3; using glm::mat4; const float PI = 3.14159f; enum Direction { FORWARD, RIGHT, BACKWARD, LEFT }; class Camera { public: vec3 position; vec3 cameraFront; vec3 cameraUp; vec3 direction; vec3 angles; Camera() { position = vec3(0, 0, 10); cameraFront = vec3(0, 0, -1); cameraUp = vec3(0, 1, 0); angles = vec3(0, -PI / 2, 0); updateDirection(); } mat4 viewMatrix() { return glm::lookAt(position, position + direction, vec3(0, 1, 0)); } void setAngles(vec3 angles) { angles = angles; updateDirection(); } void updateAngles(float deltaX, float deltaY) { angles.x += deltaX; angles.y += deltaY; if (angles.x > (PI / 2) - 0.1f) angles.x = (PI / 2) - 0.1f; if (angles.x < -(PI / 2) - 0.1f) angles.x = -((PI / 2) - 0.1f); updateDirection(); } void updateDirection() { direction.x = cos(angles.y) * cos(angles.x); direction.y = sin(angles.x); direction.z = sin(angles.y) * cos(angles.x); direction = glm::normalize(direction); } void setPosition(vec3 p) { position = p; } void movePosition(vec3 delta) { position += delta; } void movePosition(Direction d, float speed) { switch (d) { case static_cast(FORWARD): movePosition(speed * direction); break; case static_cast(BACKWARD): movePosition(-speed * direction); break; case static_cast(RIGHT): movePosition(speed * glm::normalize(glm::cross(direction, cameraUp))); break; case static_cast(LEFT): movePosition(-speed * glm::normalize(glm::cross(direction, cameraUp))); break; } } };