diff options
author | Aki <please@ignore.pl> | 2022-06-05 12:02:17 +0200 |
---|---|---|
committer | Aki <please@ignore.pl> | 2022-06-05 12:20:49 +0200 |
commit | b08f360cf92e76fabf5b762bf79032f60f751e30 (patch) | |
tree | 1bea4571ad78876fdec744462712ea9859edb055 /Cameraman.cpp | |
parent | 5cb5322feddfe75fe09bffef5b648062a1eb5958 (diff) | |
download | derelict-b08f360cf92e76fabf5b762bf79032f60f751e30.zip derelict-b08f360cf92e76fabf5b762bf79032f60f751e30.tar.gz derelict-b08f360cf92e76fabf5b762bf79032f60f751e30.tar.bz2 |
Added cameraman to handle camera
Diffstat (limited to 'Cameraman.cpp')
-rw-r--r-- | Cameraman.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/Cameraman.cpp b/Cameraman.cpp new file mode 100644 index 0000000..f65cb44 --- /dev/null +++ b/Cameraman.cpp @@ -0,0 +1,44 @@ +#include "Cameraman.h" + +#include <algorithm> +#include <cmath> + +#include <raylib.h> +#include <raymath.h> + +#include "VectorMath.h" + + +Cameraman::Cameraman() +{ + camera.position = Vector3{10.0f, 10.0f, 10.0f}; + camera.target = Vector3{0.0f, 0.0f, 0.0f}; + camera.up = Vector3{0.0f, 1.0f, 0.0f}; + camera.fovy = 45; + camera.projection = CAMERA_PERSPECTIVE; + SetCameraMode(camera, CAMERA_CUSTOM); + m_angle.x = std::atan2(10.0f, 10.0f); + m_angle.y = std::atan2(10.0f, std::sqrt(std::pow(10.0f, 2) + std::pow(10.0f, 2))); +} + + +void +Cameraman::update(const float) +{ + const auto drag = GetMouseDelta(); + if (IsMouseButtonDown(0)) { + m_angle.x += drag.x * -0.01f; + m_angle.y = std::clamp(m_angle.y + drag.y * 0.01f, -1.483f, 1.483f); + } + const float zoom = GetMouseWheelMove(); + if (zoom != 0.0f) { + const auto offset = Vector3Subtract(camera.target, camera.position); + const float current = Vector3Length(offset); + const float expected = std::clamp(current + zoom * 0.5f, 1.0f, 30.0f); + camera.position = Vector3Add(camera.target, Vector3Scale(offset, expected / current)); + } + const float distance = dist(camera.position, camera.target); + camera.position.x = camera.target.x + distance * -std::sin(m_angle.x) * std::cos(m_angle.y); + camera.position.y = camera.target.y + distance * std::sin(m_angle.y); + camera.position.z = camera.target.z + distance * -std::cos(m_angle.x) * std::cos(m_angle.y); +} |