From eb1f5d49ff7e83f23148b35f989e23ab761181df Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 2 Oct 2020 19:18:55 +0300 Subject: [PATCH] Add a free-flying camera --- libs/geom/include/psemek/geom/camera.hpp | 13 +++++++++++++ libs/geom/source/camera.cpp | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/libs/geom/include/psemek/geom/camera.hpp b/libs/geom/include/psemek/geom/camera.hpp index 6adf6c36..c9ca2d9c 100644 --- a/libs/geom/include/psemek/geom/camera.hpp +++ b/libs/geom/include/psemek/geom/camera.hpp @@ -92,4 +92,17 @@ namespace psemek::geom matrix view() const override; }; + struct free_camera + : perspective_camera + { + // assumes up is +Z + // azimuthal angle is in XY plane + // both angles zero gives X right, Y forward, and Z up + + float azimuthal_angle; + float elevation_angle; + point pos; + + matrix view() const override; + }; } diff --git a/libs/geom/source/camera.cpp b/libs/geom/source/camera.cpp index 2dee85a7..f3311cce 100644 --- a/libs/geom/source/camera.cpp +++ b/libs/geom/source/camera.cpp @@ -120,4 +120,17 @@ namespace psemek::geom return tr.homogeneous_matrix(); } + matrix free_camera::view() const + { + auto tr = + swap(1, 2).transform() + * scale({1.f, -1.f, 1.f}).transform() + * plane_rotation(1, 2, elevation_angle).transform() + * plane_rotation(1, 0, azimuthal_angle).transform() + * translation({ -pos[0], -pos[1], -pos[2] }).transform() + ; + + return tr.homogeneous_matrix(); + } + }