diff options
author | dec05eba <dec05eba@protonmail.com> | 2020-02-21 05:10:13 +0100 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2021-11-18 15:22:10 +0100 |
commit | f2f8ccc1c24ab372ffe5e932780eeb1c49a4d277 (patch) | |
tree | a47396c0024b14963e016091e6114af98bc287c7 /src/ThirdPersonCamera.cpp | |
parent | c794de8eeac935649aa556f009776567ed201787 (diff) |
Add third person camera (orbit camera)
Diffstat (limited to 'src/ThirdPersonCamera.cpp')
-rw-r--r-- | src/ThirdPersonCamera.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
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 <glm/gtc/type_ptr.hpp> +#include <stdio.h> + +#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 |