#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); }