From f2f8ccc1c24ab372ffe5e932780eeb1c49a4d277 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 21 Feb 2020 05:10:13 +0100 Subject: Add third person camera (orbit camera) --- src/ThirdPersonCamera.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/ThirdPersonCamera.cpp (limited to 'src/ThirdPersonCamera.cpp') diff --git a/src/ThirdPersonCamera.cpp b/src/ThirdPersonCamera.cpp new file mode 100644 index 0000000..2404daf --- /dev/null +++ b/src/ThirdPersonCamera.cpp @@ -0,0 +1,58 @@ +#include "../include/ThirdPersonCamera.hpp" +#include +#include + +#define HALF_PI 1.5707963267948966f +#define PI 3.141592653589793f +#define TAU 6.283185307179586f + +namespace amalgine { + ThirdPersonCamera::ThirdPersonCamera() : target_pos(glm::vec3()), camera_distance(3.0f), angle_horizontal(0.0f), angle_vertical(0.0f) { + + } + + void ThirdPersonCamera::zoom(float distance) { + camera_distance += distance; + if(camera_distance < 0.1f) + camera_distance = 0.1f; + } + + void ThirdPersonCamera::rotate_horizontal(float radians) { + angle_horizontal = std::fmod(angle_horizontal + radians, TAU); + } + + void ThirdPersonCamera::rotate_vertical(float radians) { + const float max_angle = 1.56079632679f; + + angle_vertical = std::fmod(angle_vertical + radians, TAU); + if(angle_vertical > max_angle) + angle_vertical = max_angle; + else if(angle_vertical < -max_angle) + angle_vertical = -max_angle; + } + + void ThirdPersonCamera::set_target_position(const glm::vec3 &target_pos) { + this->target_pos = target_pos; + } + + glm::mat4 ThirdPersonCamera::get_matrix() const { + glm::vec3 eye = target_pos - get_forward_vector() * camera_distance; + return glm::lookAt(eye, target_pos, glm::vec3(0.0f, 0.0f, 1.0f)); + } + + glm::vec3 ThirdPersonCamera::get_forward_vector() const { + glm::vec3 vec; + vec.x = std::sin(angle_horizontal) * std::cos(angle_vertical); + vec.y = std::cos(angle_horizontal) * std::cos(angle_vertical); + vec.z = std::sin(angle_vertical); + return vec; + } + + glm::vec3 ThirdPersonCamera::get_right_vector() const { + glm::vec3 vec = get_forward_vector(); + float temp = vec.x; + vec.x = vec.y; + vec.y = -temp; + return vec; + } +} \ No newline at end of file -- cgit v1.2.3