mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-04-22 02:48:25 -05:00
Fix offset bug by changing how the target direction is calculated. Move calculations to utility file
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user