From fadf20435d10d44e8bbdc4212401da46ade05b49 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Fri, 9 Apr 2021 15:04:19 +0200 Subject: [PATCH] Move conversion function to target and add some utility functions to target and browser --- .../include/screenspaceskybrowser.h | 2 +- .../skybrowser/include/screenspaceskytarget.h | 4 ++ .../skybrowser/src/screenspaceskybrowser.cpp | 43 ++++--------------- .../skybrowser/src/screenspaceskytarget.cpp | 38 ++++++++++++++++ 4 files changed, 52 insertions(+), 35 deletions(-) diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index 505aa9423b..b5a0f7f5a6 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -27,8 +27,8 @@ namespace openspace { bool sendMessageToWWT(const ghoul::Dictionary& msg); void sendMouseEvent(CefStructBase event, int x, int y) const; void WWTfollowCamera(); - glm::dvec2 convertGalacticToCelestial(glm::dvec3 coords) const; float fieldOfView() const; + void setFieldOfView(float fov); void scrollZoom(float scroll); ScreenSpaceSkyTarget* getSkyTarget(); diff --git a/modules/skybrowser/include/screenspaceskytarget.h b/modules/skybrowser/include/screenspaceskytarget.h index 663f046692..d2a2545be2 100644 --- a/modules/skybrowser/include/screenspaceskytarget.h +++ b/modules/skybrowser/include/screenspaceskytarget.h @@ -33,11 +33,15 @@ namespace openspace { void setDimensions(glm::vec2 currentBrowserDimensions); void updateFOV(float browserFOV); + glm::dvec2 convertGalacticToCelestial(glm::dvec3 rGal) const; + glm::vec2 getCelestialCoords(); glm::vec2 getScreenSpacePosition(); glm::vec2 getAnglePosition(); void setConnectedBrowser(); void setBorderColor(glm::ivec3 color); glm::ivec3 getColor(); + + void setPosition(glm::vec3 pos); void translate(glm::vec2 translation, glm::vec2 position); diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index fd86b03433..06b1010544 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include #include #include @@ -20,9 +19,9 @@ #include #include #include // Milliseconds - +#include #include // to adjust camera angle -#include + namespace { constexpr const char* _loggerCat = "ScreenSpaceSkyBrowser"; @@ -158,6 +157,10 @@ namespace openspace { return _fieldOfView; } + void ScreenSpaceSkyBrowser::setFieldOfView(float fov) { + _fieldOfView = fov; + } + void ScreenSpaceSkyBrowser::scrollZoom(float scroll) { float zoomFactor = log(_fieldOfView + 1.1f); @@ -260,19 +263,8 @@ namespace openspace { _threadWWTMessages = std::thread([&] { while (_camIsSyncedWWT) { - // Get camera view direction and orthogonal coordinate system of camera view direction - glm::vec3 viewDirection = global::navigationHandler->camera()->viewDirectionWorldSpace(); - glm::vec3 upDirection = global::navigationHandler->camera()->lookUpVectorWorldSpace(); - glm::vec3 sideDirection = glm::cross(upDirection, viewDirection); - - glm::vec2 angleOffset = _skyTarget ? _skyTarget->getAnglePosition() : glm::vec2(0); - // Change view if target is moved - glm::vec3 targetDirection = glm::rotate(viewDirection, angleOffset.x, upDirection); - targetDirection = glm::rotate(targetDirection, angleOffset.y, sideDirection); - - // Convert to celestial coordinates - glm::dvec2 celestCoords = convertGalacticToCelestial(targetDirection); - ghoul::Dictionary message = createMessageForMovingWWTCamera(celestCoords, _fieldOfView); + glm::vec2 celestCoordsTarget = _skyTarget ? _skyTarget->getCelestialCoords() : glm::vec2(0.f); + ghoul::Dictionary message = createMessageForMovingWWTCamera(celestCoordsTarget, _fieldOfView); // Sleep so we don't bombard WWT with too many messages std::this_thread::sleep_for(std::chrono::milliseconds(50)); @@ -282,24 +274,7 @@ namespace openspace { }); } - - glm::dvec2 ScreenSpaceSkyBrowser::convertGalacticToCelestial(glm::dvec3 rGal) const { - // Used the math from this website: https://gea.esac.esa.int/archive/documentation/GD --> - // R2/Data_processing/chap_cu3ast/sec_cu3ast_intro/ssec_cu3ast_intro_tansforms.html#SSS1 - const glm::dmat3 conversionMatrix = glm::dmat3({ - -0.0548755604162154, 0.4941094278755837, -0.8676661490190047, // col 0 - -0.8734370902348850, -0.4448296299600112, -0.1980763734312015, // col 1 - -0.4838350155487132, 0.7469822444972189, 0.4559837761750669 // col 2 - }); - - glm::dvec3 rICRS = glm::transpose(conversionMatrix) * rGal; - float ra = atan2(rICRS[1], rICRS[0]); - float dec = atan2(rICRS[2], glm::sqrt((rICRS[0] * rICRS[0]) + (rICRS[1] * rICRS[1]))); - - ra = ra > 0 ? ra : ra + (2 * glm::pi()); - - return glm::dvec2(glm::degrees(ra), glm::degrees(dec)); - } + /* void ScreenSpaceSkyBrowser::translate(glm::vec2 translation) { glm::vec3 position = _cartesianPosition; diff --git a/modules/skybrowser/src/screenspaceskytarget.cpp b/modules/skybrowser/src/screenspaceskytarget.cpp index e649c3cdef..09900d21d8 100644 --- a/modules/skybrowser/src/screenspaceskytarget.cpp +++ b/modules/skybrowser/src/screenspaceskytarget.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -21,6 +22,7 @@ #include #include #include +#include #include namespace { @@ -241,6 +243,9 @@ namespace openspace { void ScreenSpaceSkyTarget::translate(glm::vec2 translation, glm::vec2 position) { _cartesianPosition = glm::translate(glm::mat4(1.f), glm::vec3(translation, 0.0f)) * glm::vec4(position, _cartesianPosition.value().z, 1.0f); } + void ScreenSpaceSkyTarget::setPosition(glm::vec3 pos) { + _cartesianPosition = pos; + } glm::vec2 ScreenSpaceSkyTarget::getAnglePosition() { glm::vec3 pos = _cartesianPosition.value(); @@ -275,6 +280,39 @@ namespace openspace { } + glm::vec2 ScreenSpaceSkyTarget::getCelestialCoords() { + // Get camera view direction and orthogonal coordinate system of camera view direction + glm::vec3 viewDirection = global::navigationHandler->camera()->viewDirectionWorldSpace(); + glm::vec3 upDirection = global::navigationHandler->camera()->lookUpVectorWorldSpace(); + glm::vec3 sideDirection = glm::cross(upDirection, viewDirection); + + glm::vec2 angleOffset = getAnglePosition(); + // Change view if target is moved + glm::vec3 targetDirection = glm::rotate(viewDirection, angleOffset.x, upDirection); + targetDirection = glm::rotate(targetDirection, angleOffset.y, sideDirection); + + // Convert to celestial coordinates + return convertGalacticToCelestial(targetDirection); + } + + glm::dvec2 ScreenSpaceSkyTarget::convertGalacticToCelestial(glm::dvec3 rGal) const { + // Used the math from this website: https://gea.esac.esa.int/archive/documentation/GD --> + // R2/Data_processing/chap_cu3ast/sec_cu3ast_intro/ssec_cu3ast_intro_tansforms.html#SSS1 + const glm::dmat3 conversionMatrix = glm::dmat3({ + -0.0548755604162154, 0.4941094278755837, -0.8676661490190047, // col 0 + -0.8734370902348850, -0.4448296299600112, -0.1980763734312015, // col 1 + -0.4838350155487132, 0.7469822444972189, 0.4559837761750669 // col 2 + }); + + glm::dvec3 rICRS = glm::transpose(conversionMatrix) * rGal; + float ra = atan2(rICRS[1], rICRS[0]); + float dec = atan2(rICRS[2], glm::sqrt((rICRS[0] * rICRS[0]) + (rICRS[1] * rICRS[1]))); + + ra = ra > 0 ? ra : ra + (2 * glm::pi()); + + return glm::dvec2(glm::degrees(ra), glm::degrees(dec)); + } + void ScreenSpaceSkyTarget::updateFOV(float browserFOV) { float horizFOV = global::windowDelegate->getHorizFieldOfView(); _scale = std::max((browserFOV/horizFOV),(_showCrosshairThreshold.value()/horizFOV));