Fix offset bug by changing how the target direction is calculated. Move calculations to utility file

This commit is contained in:
Ylva Selling
2021-04-30 09:24:34 +02:00
parent b7c4d94df0
commit dcbd74ab7a
8 changed files with 77 additions and 164 deletions
+2
View File
@@ -31,6 +31,7 @@ set(HEADER_FILES
include/screenspaceskytarget.h
include/wwtdatahandler.h
tinyxml2/tinyxml2.h
include/utility.h
)
source_group("Header Files" FILES ${HEADER_FILES})
@@ -43,6 +44,7 @@ set(SOURCE_FILES
src/screenspaceskytarget.cpp
src/wwtdatahandler.cpp
tinyxml2/tinyxml2.cpp
src/utility.cpp
)
source_group("Source Files" FILES ${SOURCE_FILES})
@@ -18,8 +18,8 @@ namespace openspace {
bool setConnectedTarget();
// Communication with the webpage and WWT
void executeJavascript(std::string& script) const;
ghoul::Dictionary createMessageForMovingWWTCamera(const glm::dvec2 celestCoords, const float fov, const bool moveInstantly = true) const;
void executeJavascript(std::string script) const;
ghoul::Dictionary createMessageForMovingWWTCamera(const glm::dvec2 celestCoords, const double fov, const bool moveInstantly = true) const;
ghoul::Dictionary createMessageForPausingWWTTime() const;
ghoul::Dictionary createMessageForLoadingWWTImgColl(const std::string& url) const;
ghoul::Dictionary createMessageForSettingForegroundWWT(const std::string& name) const;
@@ -33,24 +33,18 @@ 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();
glm::dvec3 getTargetDirection();
glm::dvec2 getScreenSpacePosition();
void setConnectedBrowser();
void setBorderColor(glm::ivec3 color);
glm::ivec3 getColor();
void setPosition(glm::vec3 pos);
void translate(glm::vec2 translation, glm::vec2 position);
// Only works for galactic coords outside of the solar system
void lookAtGalacticCoord(glm::dvec3 galacticCoord);
void translate(glm::dvec2 translation, glm::dvec2 position);
glm::vec2 getScreenSpaceDimensions();
glm::vec2 getUpperRightCornerScreenSpace();
glm::vec2 getLowerLeftCornerScreenSpace();
bool coordIsInsideCornersScreenSpace(glm::vec2 coord);
glm::dvec2 getScreenSpaceDimensions();
glm::dvec2 getUpperRightCornerScreenSpace();
glm::dvec2 getLowerLeftCornerScreenSpace();
bool coordIsInsideCornersScreenSpace(glm::dvec2 coord);
glm::mat4 scaleMatrix() override;
-41
View File
@@ -45,8 +45,6 @@
#include <fstream>
#define _USE_MATH_DEFINES
#include <math.h>
namespace {
struct [[codegen::Dictionary(ScreenSpaceSkyBrowser)]] Parameters {
@@ -313,7 +311,6 @@ SkyBrowserModule::SkyBrowserModule()
void SkyBrowserModule::internalDeinitialize() {
delete dataHandler;
}
void SkyBrowserModule::internalInitialize(const ghoul::Dictionary& dict) {
@@ -332,27 +329,6 @@ void SkyBrowserModule::internalInitialize(const ghoul::Dictionary& dict) {
dataHandler = new WWTDataHandler();
}
glm::dvec3 SkyBrowserModule::icrsToGalacticCartesian(double ra, double dec, double distance) {
// Convert to Galactic Coordinates from ICRS right ascension and declination
// https://gea.esac.esa.int/archive/documentation/GDR2/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
});
double degToRad = M_PI / 180.0;
glm::dvec3 rICRS = glm::dvec3(
cos(ra * degToRad) * cos(dec * degToRad),
sin(ra * degToRad) * cos(dec * degToRad),
sin(dec * degToRad)
);
glm::dvec3 rGalactic = conversionMatrix * rICRS; // on the unit sphere
return distance * rGalactic;
}
glm::vec2 SkyBrowserModule::getMousePositionInScreenSpaceCoords(glm::vec2& mousePos) {
glm::vec2 size = global::windowDelegate->currentWindowSize();
// Change origin to middle of the window
@@ -381,23 +357,6 @@ WWTDataHandler* SkyBrowserModule::getWWTDataHandler() {
return dataHandler;
}
glm::dvec2 SkyBrowserModule::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<float>());
return glm::dvec2(glm::degrees(ra), glm::degrees(dec));
}
/*
std::vector<documentation::Documentation> SkyBrowserModule::documentations() const {
return {
+4 -2
View File
@@ -33,6 +33,10 @@
#include <openspace/properties/stringproperty.h>
#include <thread>
#include <iostream>
#include <fstream>
namespace openspace {
class ScreenSpaceSkyBrowser;
@@ -49,8 +53,6 @@ public:
virtual ~SkyBrowserModule() = default;
glm::vec2 getMousePositionInScreenSpaceCoords(glm::vec2& mousePos);
void addRenderable(ScreenSpaceRenderable* object);
glm::dvec2 convertGalacticToCelestial(glm::dvec3 coords) const;
glm::dvec3 icrsToGalacticCartesian(double ra, double dec, double distance);
WWTDataHandler* getWWTDataHandler();
scripting::LuaLibrary luaLibrary() const override;
+24 -29
View File
@@ -1,6 +1,7 @@
#include <openspace/util/openspacemodule.h>
#include <openspace/documentation/documentation.h>
#include <modules/skybrowser/skybrowsermodule.h>
#include <modules/skybrowser/include/utility.h>
#include <openspace/engine/globals.h>
#include <openspace/engine/moduleengine.h>
#include <openspace/rendering/renderengine.h>
@@ -16,12 +17,13 @@
#include <modules/skybrowser/include/screenspaceskybrowser.h>
#include <modules/skybrowser/include/screenspaceskytarget.h>
#include <modules/base/rendering/screenspaceimagelocal.h>
#include <modules/base/rendering/renderableplaneimagelocal.h>
#include <openspace/interaction/navigationhandler.h>
#include <openspace/util/camera.h>
#include <thread>
#include <glm/gtx/string_cast.hpp>
#include <openspace/util/coordinateconversion.h>
#include <glm/gtx/vector_angle.hpp>
#include <limits>
namespace {
constexpr const char _loggerCat[] = "SkyBrowserModule";
@@ -39,6 +41,7 @@ namespace openspace::skybrowser::luascriptfunctions {
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
const ImageData& resultImage = module->getWWTDataHandler()->getLoadedImages()[i];
// Load image collection, if it isn't loaded already
// TODO: Update or remove with new WWT API
const std::vector<ImageCollection>& collections = module->getWWTDataHandler()->getAllImageCollectionUrls();
auto it = std::find_if(collections.begin(), collections.end(), [&](const ImageCollection& coll) {
return coll.name == resultImage.collection;
@@ -46,20 +49,18 @@ namespace openspace::skybrowser::luascriptfunctions {
if (!it->loaded) {
browser->sendMessageToWWT(browser->createMessageForLoadingWWTImgColl(it->url));
}
LINFO("Loading image " + resultImage.name);
browser->sendMessageToWWT(browser->createMessageForSettingForegroundWWT(resultImage.name));
LINFO("Loading image " + resultImage.name);
// Only move camera if the image has coordinates
browser->sendMessageToWWT(browser->createMessageForSettingForegroundOpacityWWT(100));
// Only move target if the image has coordinates
if (resultImage.hasCoords) {
glm::dvec3 imageCoordsGalactic = module->icrsToGalacticCartesian(resultImage.celestCoords.x, resultImage.celestCoords.y, 1.0);
browser->getSkyTarget()->lookAtGalacticCoord(imageCoordsGalactic);
glm::dvec2 imageCoordsScreenSpace = skybrowser::J2000ToScreenSpace(resultImage.celestCoords.x, resultImage.celestCoords.y);
browser->getSkyTarget()->property("CartesianPosition")->set(glm::vec3 {imageCoordsScreenSpace, skybrowser::SCREENSPACE_Z });
// In WWT, the definition of ZoomLevel is: VFOV = ZoomLevel / 6
browser->setVerticalFieldOfView(resultImage.zoomLevel / 6);
browser->setVerticalFieldOfView(resultImage.zoomLevel / 6);
}
browser->sendMessageToWWT(browser->createMessageForSettingForegroundOpacityWWT(100));
return 0;
}
@@ -67,24 +68,17 @@ namespace openspace::skybrowser::luascriptfunctions {
// Load image
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::moveCircleToHoverImage");
const int i = ghoul::lua::value<int>(L, 1);
ScreenSpaceImageLocal* hoverCircle = dynamic_cast<ScreenSpaceImageLocal*>(global::renderEngine->screenSpaceRenderable("HoverCircle"));
hoverCircle->property("Enabled")->set(true);
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
const ImageData& resultImage = module->getWWTDataHandler()->getLoadedImages()[i];
// Only move and show circle if the image has coordinates
if (resultImage.hasCoords) {
glm::dvec3 imageCoordsGalactic = module->icrsToGalacticCartesian(resultImage.celestCoords.x, resultImage.celestCoords.y, 1.0);
// This is a duplicate of target function "lookAtGalacticCoord". Probably should rewrite this so there are no duplicates...
glm::dmat4 cameraInvRotMat = global::navigationHandler->camera()->viewRotationMatrix();
glm::dvec3 viewDirectionLocal = cameraInvRotMat * glm::dvec4(imageCoordsGalactic, 1.f);
glm::dvec2 angleCoordsLocal = glm::dvec2(atan(viewDirectionLocal.x / viewDirectionLocal.z), atan(viewDirectionLocal.y / viewDirectionLocal.z));
double projPlaneDistance = -2.1f;
glm::dvec2 imageCoordsScreenSpace = glm::dvec2(projPlaneDistance * tan(angleCoordsLocal.x), projPlaneDistance * tan(angleCoordsLocal.y));
// Translate target
hoverCircle->translate(glm::vec2(imageCoordsScreenSpace) - hoverCircle->getScreenSpacePosition(), hoverCircle->getScreenSpacePosition());
// Make circle visible
ScreenSpaceImageLocal* hoverCircle = dynamic_cast<ScreenSpaceImageLocal*>(global::renderEngine->screenSpaceRenderable("HoverCircle"));
hoverCircle->property("Enabled")->set(true);
// Calculate coords for the circle and translate
glm::vec2 imageCoordsScreenSpace = skybrowser::J2000ToScreenSpace(resultImage.celestCoords.x, resultImage.celestCoords.y);
hoverCircle->property("CartesianPosition")->set(glm::vec3 {imageCoordsScreenSpace, skybrowser::SCREENSPACE_Z });
}
return 0;
@@ -122,6 +116,7 @@ namespace openspace::skybrowser::luascriptfunctions {
LINFO("Loaded " + noOfLoadedImgs + " WorldWide Telescope images.");
ScreenSpaceSkyBrowser* browser = dynamic_cast<ScreenSpaceSkyBrowser*>(global::renderEngine->screenSpaceRenderable("SkyBrowser1"));
// Load all image collection urls
//const std::vector<std::string>& imageUrls = module->getWWTDataHandler()->getAllImageCollectionUrls();
//for (const std::string url : imageUrls) {
// browser->sendMessageToWWT(browser->createMessageForLoadingWWTImgColl(url));
@@ -188,7 +183,8 @@ namespace openspace::skybrowser::luascriptfunctions {
float FOV = browser->fieldOfView();
glm::vec2 coords = target->getCelestialCoords();
glm::dvec3 coords = target->getTargetDirection();
glm::dvec2 celestCoords = skybrowser::galacticCartesianToJ2000(coords);
lua_newtable(L);
// Index for many browsers
@@ -198,9 +194,9 @@ namespace openspace::skybrowser::luascriptfunctions {
// Push ("Key", value)
ghoul::lua::push(L, "FOV", FOV);
lua_settable(L, -3);
ghoul::lua::push(L, "RA", coords.x);
ghoul::lua::push(L, "RA", celestCoords.x);
lua_settable(L, -3);
ghoul::lua::push(L, "Dec", coords.y);
ghoul::lua::push(L, "Dec", celestCoords.y);
lua_settable(L, -3);
// Set table for the current ImageData
@@ -210,7 +206,6 @@ namespace openspace::skybrowser::luascriptfunctions {
}
int adjustCamera(lua_State* L) {
ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::adjustCamera");
return 0;
}
@@ -1,5 +1,6 @@
#include <modules/skybrowser/include/screenspaceskybrowser.h>
#include <modules/skybrowser/include/screenspaceskytarget.h>
#include <modules/skybrowser/include/utility.h>
#include <modules/skybrowser/skybrowsermodule.h>
#include <modules/webbrowser/include/webkeyboardhandler.h>
#include <modules/webbrowser/include/browserinstance.h>
@@ -64,7 +65,7 @@ namespace openspace {
ScreenSpaceSkyBrowser::ScreenSpaceSkyBrowser(const ghoul::Dictionary& dictionary)
: ScreenSpaceBrowser(dictionary)
, _browserDimensions(BrowserDimensionInfo, _dimensions, glm::ivec2(0.f), glm::ivec2(300.f))
, _browserDimensions(BrowserDimensionInfo, _dimensions, glm::ivec2(0), glm::ivec2(300))
, _vfieldOfView(ZoomInfo, 50.f, 0.1f, 70.f)
, _skyTargetID(TargetIDInfo)
, _camIsSyncedWWT(true)
@@ -110,9 +111,8 @@ namespace openspace {
}
identifier = makeUniqueIdentifier(identifier);
setIdentifier(identifier);
// The projection plane seems to be located at z = -2.1 so at that place the ScreenSpaceRenderables behaves like
// they are in screen space
_cartesianPosition.setValue(glm::vec3(_cartesianPosition.value().x, _cartesianPosition.value().y, -2.1f));
_cartesianPosition.setValue(glm::dvec3(_cartesianPosition.value().x, _cartesianPosition.value().y, skybrowser::SCREENSPACE_Z));
// Always make sure that the target and browser are visible together
_enabled.onChange([&]() {
@@ -168,7 +168,7 @@ namespace openspace {
_vfieldOfView = std::clamp(_vfieldOfView + zoom, 0.001f, 70.0f);
}
void ScreenSpaceSkyBrowser::executeJavascript(std::string& script) const {
void ScreenSpaceSkyBrowser::executeJavascript(std::string script) const {
//LINFOC(_loggerCat, "Executing javascript " + script);
if (_browserInstance && _browserInstance->getBrowser() && _browserInstance->getBrowser()->GetMainFrame()) {
CefRefPtr<CefFrame> frame = _browserInstance->getBrowser()->GetMainFrame();
@@ -193,14 +193,14 @@ namespace openspace {
}
ghoul::Dictionary ScreenSpaceSkyBrowser::createMessageForMovingWWTCamera(const glm::dvec2 celestCoords, const float fov, const bool moveInstantly) const {
ghoul::Dictionary ScreenSpaceSkyBrowser::createMessageForMovingWWTCamera(const glm::dvec2 celestCoords, const double fov, const bool moveInstantly) const {
using namespace std::string_literals;
ghoul::Dictionary msg;
msg.setValue("event", "center_on_coordinates"s);
msg.setValue("ra", static_cast<double>(celestCoords[0]));
msg.setValue("dec", static_cast<double>(celestCoords[1]));
msg.setValue("fov", static_cast<double>(fov));
msg.setValue("ra", celestCoords.x);
msg.setValue("dec", celestCoords.y);
msg.setValue("fov", fov);
msg.setValue("instant", moveInstantly);
return msg;
@@ -236,8 +236,6 @@ namespace openspace {
return msg;
}
ghoul::Dictionary ScreenSpaceSkyBrowser::createMessageForPausingWWTTime() const {
using namespace std::string_literals;
@@ -263,14 +261,20 @@ namespace openspace {
// Start a thread to enable user interaction while sending the calls to WWT
_threadWWTMessages = std::thread([&] {
while (_camIsSyncedWWT) {
if (_skyTarget) {
// Calculate the galactic coordinate of the target direction
// with infinite radius
glm::dvec3 camPos = global::navigationHandler->camera()->positionVec3();
constexpr double infinity = std::numeric_limits<float>::max();
glm::dvec3 galCoord = camPos + (infinity * _skyTarget->getTargetDirection());
glm::dvec2 celestCoordsTarget = skybrowser::galacticCartesianToJ2000(galCoord);
ghoul::Dictionary message = createMessageForMovingWWTCamera(celestCoordsTarget, _vfieldOfView);
glm::vec2 celestCoordsTarget = _skyTarget ? _skyTarget->getCelestialCoords() : glm::vec2(0.f);
ghoul::Dictionary message = createMessageForMovingWWTCamera(celestCoordsTarget, _vfieldOfView);
sendMessageToWWT(message);
}
// Sleep so we don't bombard WWT with too many messages
std::this_thread::sleep_for(std::chrono::milliseconds(50));
sendMessageToWWT(message);
}
});
+18 -61
View File
@@ -1,5 +1,6 @@
#include <modules/skybrowser/include/screenspaceskytarget.h>
#include <modules/skybrowser/include/screenspaceskybrowser.h>
#include <modules/skybrowser/include/utility.h>
#include <modules/skybrowser/skybrowsermodule.h>
#include <openspace/engine/globals.h>
#include <openspace/interaction/navigationhandler.h>
@@ -102,8 +103,8 @@ namespace openspace {
identifier = makeUniqueIdentifier(identifier);
setIdentifier(identifier);
// Projection plane seems to be at -2.1. The browser is at -2.1 and the browser should have precedence over target
_cartesianPosition.setValue(glm::vec3(_cartesianPosition.value().x, _cartesianPosition.value().y, -2.11f));
_cartesianPosition.setValue(glm::dvec3(_cartesianPosition.value().x, _cartesianPosition.value().y, skybrowser::SCREENSPACE_Z));
//_useRadiusAzimuthElevation.setValue(true);
// Always make sure that the target and browser are visible together
_enabled.onChange([&]() {
@@ -240,36 +241,27 @@ namespace openspace {
unbindTexture();
}
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::translate(glm::dvec2 translation, glm::dvec2 position) {
_cartesianPosition = glm::translate(glm::dmat4(1.f), glm::dvec3(translation, 0.0f)) * glm::dvec4(position, _cartesianPosition.value().z, 1.0f);
}
void ScreenSpaceSkyTarget::setPosition(glm::vec3 pos) {
_cartesianPosition = pos;
}
glm::vec2 ScreenSpaceSkyTarget::getAnglePosition() {
glm::vec3 pos = _cartesianPosition.value();
return glm::vec2(atan(pos.x / pos.z), atan(pos.y / pos.z));
}
glm::vec2 ScreenSpaceSkyTarget::getScreenSpacePosition() {
glm::dvec2 ScreenSpaceSkyTarget::getScreenSpacePosition() {
return glm::vec2(_cartesianPosition.value().x, _cartesianPosition.value().y);
}
glm::vec2 ScreenSpaceSkyTarget::getScreenSpaceDimensions() {
return glm::vec2(2.f * _scale * static_cast<float>(_objectSize.x) / static_cast<float>(_objectSize.y), 2.f * _scale);
glm::dvec2 ScreenSpaceSkyTarget::getScreenSpaceDimensions() {
return glm::dvec2(2.f * _scale * static_cast<float>(_objectSize.x) / static_cast<float>(_objectSize.y), 2.f * _scale);
}
glm::vec2 ScreenSpaceSkyTarget::getUpperRightCornerScreenSpace() {
glm::dvec2 ScreenSpaceSkyTarget::getUpperRightCornerScreenSpace() {
return getScreenSpacePosition() + (getScreenSpaceDimensions() / 2.0f);
return getScreenSpacePosition() + (getScreenSpaceDimensions() / 2.0);
}
glm::vec2 ScreenSpaceSkyTarget::getLowerLeftCornerScreenSpace() {
return getScreenSpacePosition() - (getScreenSpaceDimensions() / 2.0f);
glm::dvec2 ScreenSpaceSkyTarget::getLowerLeftCornerScreenSpace() {
return getScreenSpacePosition() - (getScreenSpaceDimensions() / 2.0);
}
bool ScreenSpaceSkyTarget::coordIsInsideCornersScreenSpace(glm::vec2 coord) {
bool ScreenSpaceSkyTarget::coordIsInsideCornersScreenSpace(glm::dvec2 coord) {
bool lessThanUpperRight = coord.x < getUpperRightCornerScreenSpace().x && coord.y < getUpperRightCornerScreenSpace().y;
bool moreThanLowerLeft = coord.x > getLowerLeftCornerScreenSpace().x && coord.y > getLowerLeftCornerScreenSpace().y;
return lessThanUpperRight && moreThanLowerLeft;
@@ -277,53 +269,18 @@ namespace openspace {
void ScreenSpaceSkyTarget::setDimensions(glm::vec2 currentBrowserDimensions) {
_targetDimensions = currentBrowserDimensions;
}
glm::vec2 ScreenSpaceSkyTarget::getCelestialCoords() {
glm::dvec3 ScreenSpaceSkyTarget::getTargetDirection() {
// 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::dvec3 camPos = global::navigationHandler->camera()->positionVec3();
glm::dvec3 targetPosWorldSpace = glm::inverse(global::navigationHandler->camera()->combinedViewMatrix()) * glm::dvec4(_cartesianPosition.value(), 1.0);
glm::dvec3 targetDirection = glm::normalize(targetPosWorldSpace - camPos);
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);
return targetDirection;
}
void ScreenSpaceSkyTarget::lookAtGalacticCoord(glm::dvec3 galacticCoord) {
glm::dmat4 cameraInvRotMat = global::navigationHandler->camera()->viewRotationMatrix();
glm::dvec3 viewDirectionLocal = cameraInvRotMat * glm::dvec4(galacticCoord, 1.f);
glm::dvec2 angleCoordsLocal = glm::dvec2(atan(viewDirectionLocal.x / viewDirectionLocal.z), atan(viewDirectionLocal.y / viewDirectionLocal.z));
double projPlaneDistance = -2.1f;
glm::dvec2 imageCoordsScreenSpace = glm::dvec2(projPlaneDistance * tan(angleCoordsLocal.x), projPlaneDistance * tan(angleCoordsLocal.y));
// Translate target
translate(glm::vec2(imageCoordsScreenSpace) - getScreenSpacePosition(), getScreenSpacePosition());
}
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<float>());
return glm::dvec2(glm::degrees(ra), glm::degrees(dec));
}
void ScreenSpaceSkyTarget::updateFOV(float VFOV) {
float horizFOV = global::windowDelegate->getHorizFieldOfView();