Add functionality to center target on screen, when it has been lost locked somewhere for example

This commit is contained in:
Ylva Selling
2021-06-03 10:03:27 +02:00
parent 0221ca1c20
commit e3c0e286fe
6 changed files with 54 additions and 14 deletions

View File

@@ -51,7 +51,7 @@ namespace openspace {
void lock();
bool isLocked();
void animateToCoord(double deltaTime);
void startAnimation(glm::dvec2 coordsEnd, float FOVEnd);
void startAnimation(glm::dvec2 coordsEnd, float FOVEnd, bool lockAfterwards = true);
bool animateFOV(float endFOV, float deltaTime);
glm::mat4 scaleMatrix() override;
@@ -82,7 +82,7 @@ namespace openspace {
glm::dvec3 _coordsStartAnimation;
double animationTime = 1.0;
float FOVToAnimateTo;
float currentFOV;
bool _lockAfterwards;
};
}

View File

@@ -38,6 +38,7 @@ namespace openspace {
glm::dvec3 J2000CartesianToScreenSpace(glm::dvec3 coords);
glm::dvec3 galacticToScreenSpace(glm::dvec3 galacticCoord);
double calculateRoll(glm::dvec3 upWorld, glm::dvec3 forwardWorld);
glm::dvec3 cameraDirectionJ2000Cartesian();
}
namespace wwtmessage {
// WWT messages

View File

@@ -225,6 +225,14 @@ namespace openspace {
"string or list of strings",
"Add one or multiple exoplanet systems to the scene, as specified by the "
"input. An input string should be the name of the system host star"
},
{
"centerTargetOnScreen",
&skybrowser::luascriptfunctions::centerTargetOnScreen,
{},
"string or list of strings",
"Add one or multiple exoplanet systems to the scene, as specified by the "
"input. An input string should be the name of the system host star"
},
};

View File

@@ -337,11 +337,7 @@ namespace openspace::skybrowser::luascriptfunctions {
// Add the window data for OpenSpace
ghoul::lua::push(L, "OpenSpace");
lua_newtable(L);
// Get the view direction of the screen in cartesian J2000 coordinates
glm::dvec3 camPos = global::navigationHandler->camera()->positionVec3();
constexpr double infinity = std::numeric_limits<float>::max();
glm::dvec3 galCoord = camPos + (infinity * global::navigationHandler->camera()->viewDirectionWorldSpace());
glm::dvec3 cartesianJ2000 = skybrowser::galacticCartesianToJ2000Cartesian(galCoord);
glm::dvec3 cartesianJ2000 = skybrowser::cameraDirectionJ2000Cartesian();
glm::dvec2 sphericalJ2000 = skybrowser::cartesianToSpherical(cartesianJ2000);
// Convert to vector so ghoul can read it
std::vector<double> viewDirCelestVec = { cartesianJ2000.x, cartesianJ2000.y, cartesianJ2000.z };
@@ -526,6 +522,28 @@ namespace openspace::skybrowser::luascriptfunctions {
return 0;
}
int centerTargetOnScreen(lua_State* L) {
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::centerTargetOnScreen");
const std::string id = ghoul::lua::value<std::string>(L, 1);
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
if (module->browserIdExists(id)) {
ScreenSpaceSkyBrowser* browser = module->getSkyBrowsers()[id];
if (browser && browser->getSkyTarget()) {
// Animate the target to the center of the screen
browser->getSkyTarget()->unlock();
// Get camera direction in celestial spherical coordinates
glm::dvec3 viewDirection = skybrowser::cameraDirectionJ2000Cartesian();
glm::dvec2 centerOfScreen = skybrowser::cartesianToSpherical(
viewDirection);
// Keep the current fov
float fov = browser->fieldOfView();
browser->getSkyTarget()->startAnimation(centerOfScreen, fov, false);
browser->getSkyTarget()->unlock();
}
}
return 0;
}
int setSelectedBrowser(lua_State* L) {
ghoul::lua::checkArgumentsAndThrow(L, 1, "lua::setSelectedBrowser");
const std::string id = ghoul::lua::value<std::string>(L, 1);

View File

@@ -362,10 +362,10 @@ namespace openspace {
_coordsStartAnimation = glm::normalize(newDir);
}
else {
// Set the exact target position and lock target when it first arrives
// to the position
if (!_isLocked) {
_cartesianPosition = skybrowser::J2000CartesianToScreenSpace(_coordsToAnimateTo);
// Set the exact target position
_cartesianPosition = skybrowser::J2000CartesianToScreenSpace(_coordsToAnimateTo);
// Lock target when it first arrives to the position
if (!_isLocked && _lockAfterwards) {
lock();
}
// When target is in position, animate the FOV until it has finished
@@ -378,7 +378,8 @@ namespace openspace {
bool ScreenSpaceSkyTarget::animateFOV(float endFOV, float deltaTime) {
if (!_skyBrowser) {
ScreenSpaceSkyBrowser* browser = dynamic_cast<ScreenSpaceSkyBrowser*>(global::renderEngine->screenSpaceRenderable(_skyBrowserID.value()));
ScreenSpaceSkyBrowser* browser = dynamic_cast<ScreenSpaceSkyBrowser*>(
global::renderEngine->screenSpaceRenderable(_skyBrowserID.value()));
setBrowser(browser);
}
if (_skyBrowser) {
@@ -398,13 +399,16 @@ namespace openspace {
return true;
}
void ScreenSpaceSkyTarget::startAnimation(glm::dvec2 coordsEnd, float FOVEnd) {
void ScreenSpaceSkyTarget::startAnimation(glm::dvec2 coordsEnd, float FOVEnd,
bool lockAfterwards) {
// Save the Cartesian celestial coordinates for animation
// to make sure wrap around works
_coordsToAnimateTo = glm::normalize(skybrowser::sphericalToCartesian(coordsEnd));
_coordsStartAnimation = glm::normalize(skybrowser::sphericalToCartesian(getTargetDirectionCelestial()));
_coordsStartAnimation = glm::normalize(skybrowser::sphericalToCartesian(
getTargetDirectionCelestial()));
FOVToAnimateTo = FOVEnd;
isAnimated = true;
_lockAfterwards = lockAfterwards;
}
properties::FloatProperty& ScreenSpaceSkyTarget::getOpacity() {
return _opacity;

View File

@@ -101,6 +101,15 @@ namespace openspace::skybrowser {
double roll = glm::degrees(atan2(dotCrossUpNorthForward, dotNorthUp));
return roll;
}
glm::dvec3 cameraDirectionJ2000Cartesian() {
// Get the view direction of the screen in cartesian J2000 coordinates
glm::dvec3 camPos = global::navigationHandler->camera()->positionVec3();
constexpr double infinity = std::numeric_limits<float>::max();
glm::dvec3 galCoord = camPos + (infinity * global::navigationHandler->camera()->viewDirectionWorldSpace());
glm::dvec3 cartesianJ2000 = skybrowser::galacticCartesianToJ2000Cartesian(galCoord);
return cartesianJ2000;
}
}
// WWT messages