From b08f360cf92e76fabf5b762bf79032f60f751e30 Mon Sep 17 00:00:00 2001 From: Aki Date: Sun, 5 Jun 2022 12:02:17 +0200 Subject: Added cameraman to handle camera --- Cameraman.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Cameraman.cpp (limited to 'Cameraman.cpp') 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 +#include + +#include +#include + +#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); +} -- cgit v1.1