From 632025c2a0f092998ca07d85d3aa9b0fe74bd8d5 Mon Sep 17 00:00:00 2001 From: Anton Arbring Date: Fri, 24 Apr 2015 17:55:48 -0400 Subject: [PATCH 1/5] Miinor bugfix, get position of body instead of frame --- src/rendering/model/renderablemodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/model/renderablemodel.cpp b/src/rendering/model/renderablemodel.cpp index 5f5c97c5b7..79dbc20762 100644 --- a/src/rendering/model/renderablemodel.cpp +++ b/src/rendering/model/renderablemodel.cpp @@ -169,7 +169,7 @@ void RenderableModel::render(const RenderData& data) { _alpha = 1.0f; psc tmppos; - SpiceManager::ref().getTargetPosition(_source, "SUN", "GALACTIC", "NONE", time, tmppos, lt); + SpiceManager::ref().getTargetPosition(_target, "SUN", "GALACTIC", "NONE", time, tmppos, lt); glm::vec3 cam_dir = glm::normalize(data.camera.position().vec3() - tmppos.vec3()); _programObject->setUniform("cam_dir", cam_dir); _programObject->setUniform("transparency", _alpha); From a993dfb42fa78ff908aecd5b2386351005860486 Mon Sep 17 00:00:00 2001 From: Anton Arbring Date: Mon, 4 May 2015 19:20:14 -0400 Subject: [PATCH 2/5] Storing frame-to-body relationship Store frames for bodies in SpiceManager, still adding "IAU_" if no frame is added for the body. Adding frames in renderableModel for 67p to get proper inertial frame. --- include/openspace/util/spicemanager.h | 18 +++++++++ src/rendering/model/renderablemodel.cpp | 2 + src/rendering/renderableplaneprojection.cpp | 2 +- src/util/spicemanager.cpp | 43 +++++++++++++++++---- 4 files changed, 56 insertions(+), 9 deletions(-) diff --git a/include/openspace/util/spicemanager.h b/include/openspace/util/spicemanager.h index 852e4cf386..f05f6cb329 100644 --- a/include/openspace/util/spicemanager.h +++ b/include/openspace/util/spicemanager.h @@ -630,6 +630,22 @@ public: */ bool getFieldOfView(int instrument, std::string& fovShape, std::string& frameName, glm::dvec3& boresightVector, std::vector& bounds) const; + + /** + * This function adds a frame to a body + * \param body - the name of the body + * \param frame - the name of the frame + * \return false if the arguments are empty + */ + bool addFrame(const std::string body, const std::string frame); + + /** + * This function returns the frame of a body if defined, otherwise it returns + * IAU_ + body (most frames are known by the International Astronomical Union) + * \param body - the name of the body + * \return the frame of the body + */ + std::string frameFromBody(const std::string body) const; /** * This method checks if one of the previous SPICE methods has failed. If it has, the @@ -673,6 +689,8 @@ private: std::map > > _spkIntervals; std::map > _ckCoverageTimes; std::map > _spkCoverageTimes; + // Vector of pairs: Body, Frame + std::vector< std::pair > _frameByBody; const static bool _showErrors = false; diff --git a/src/rendering/model/renderablemodel.cpp b/src/rendering/model/renderablemodel.cpp index 79dbc20762..76838fd328 100644 --- a/src/rendering/model/renderablemodel.cpp +++ b/src/rendering/model/renderablemodel.cpp @@ -96,6 +96,8 @@ RenderableModel::RenderableModel(const ghoul::Dictionary& dictionary) dictionary.getValue(keyDestination, _destination); dictionary.getValue(keyBody, _target); + openspace::SpiceManager::ref().addFrame(_target, _source); + setBoundingSphere(pss(1.f, 9.f)); addProperty(_performShading); diff --git a/src/rendering/renderableplaneprojection.cpp b/src/rendering/renderableplaneprojection.cpp index 206a37fe8f..67885de7a5 100644 --- a/src/rendering/renderableplaneprojection.cpp +++ b/src/rendering/renderableplaneprojection.cpp @@ -281,7 +281,7 @@ void RenderablePlaneProjection::setTarget(std::string body) { } if (found) { _target.body = body; - _target.frame = "IAU_" + body; + _target.frame = openspace::SpiceManager::ref().frameFromBody(body); } } diff --git a/src/util/spicemanager.cpp b/src/util/spicemanager.cpp index 2c1289e659..3f9b24d5d5 100644 --- a/src/util/spicemanager.cpp +++ b/src/util/spicemanager.cpp @@ -641,13 +641,12 @@ bool SpiceManager::targetWithinFieldOfView(const std::string& instrument, int visible; - std::string bodyfixed = "IAU_"; - bodyfixed += target; + std::string frame = frameFromBody(target); fovtrg_c(instrument.c_str(), target.c_str(), method.c_str(), - bodyfixed.c_str(), + frame.c_str(), aberrationCorrection.c_str(), observer.c_str(), &targetEpoch, @@ -688,9 +687,9 @@ bool SpiceManager::getSurfaceIntercept(const std::string& target, // allow client specify non-inertial frame. std::string bodyfixed = "IAU_"; convert = (referenceFrame.find(bodyfixed) == std::string::npos); - if (convert){ - bodyfixed += target; - }else{ + if (convert) { + bodyfixed = frameFromBody(target); + } else { bodyfixed = referenceFrame; } @@ -813,11 +812,11 @@ bool SpiceManager::getPositionTransformMatrix(const std::string& fromFrame, ephemerisTime, (double(*)[3])glm::value_ptr(positionMatrix)); success = !(failed_c()); - if (!success && !_showErrors) { + if (!success) { reset_c(); estimated = getEstimatedTransformMatrix(ephemerisTime, fromFrame, toFrame, positionMatrix); } - else { + if (_showErrors) { bool hasError = checkForError("Error retrieving position transform matrix from " "frame '" + fromFrame + "' to frame '" + toFrame + "' at time '" + std::to_string(ephemerisTime)); @@ -958,6 +957,34 @@ bool SpiceManager::getFieldOfView(int instrument, return true; } +std::string SpiceManager::frameFromBody(const std::string body) const { + + for (auto pair : _frameByBody) { + if (pair.first == body) { + return pair.second; + } + } + + std::string unionPrefix = "IAU_"; + std::string frame = ""; + + if (body.find(unionPrefix) == std::string::npos) + frame = unionPrefix + body; + else + frame = body; + + return frame; +} + +bool SpiceManager::addFrame(const std::string body, const std::string frame) { + if (body == "" || frame == "") + return false; + else { + _frameByBody.push_back(std::make_pair(body, frame)); + return true; + } +} + bool SpiceManager::checkForError(std::string errorMessage) { int failed = failed_c(); From d495778d4a65a2d3d9520dd0d14564170b832602 Mon Sep 17 00:00:00 2001 From: Anton Arbring Date: Mon, 4 May 2015 19:30:57 -0400 Subject: [PATCH 3/5] Restored some changes lost in merge + "timedots" Added impact on trails from start/stoptime definitions in modfile. Added dots of equal time in trails, no progress on printing the time string. --- include/openspace/rendering/renderabletrail.h | 1 + src/rendering/renderabletrail.cpp | 64 +++++++++++++++---- 2 files changed, 53 insertions(+), 12 deletions(-) diff --git a/include/openspace/rendering/renderabletrail.h b/include/openspace/rendering/renderabletrail.h index b5c0bb93ad..4aecd34b16 100644 --- a/include/openspace/rendering/renderabletrail.h +++ b/include/openspace/rendering/renderabletrail.h @@ -63,6 +63,7 @@ private: properties::Vec3Property _lineColor; properties::FloatProperty _lineFade; properties::FloatProperty _lineWidth; + properties::BoolProperty _showTimestamps; ghoul::opengl::ProgramObject* _programObject; bool _programIsDirty; diff --git a/src/rendering/renderabletrail.cpp b/src/rendering/renderabletrail.cpp index 689d9eb55a..5d2c8f4b1e 100644 --- a/src/rendering/renderabletrail.cpp +++ b/src/rendering/renderabletrail.cpp @@ -52,6 +52,7 @@ namespace { const std::string keyTropicalOrbitPeriod = "TropicalOrbitPeriod"; const std::string keyEarthOrbitRatio = "EarthOrbitRatio"; const std::string keyDayLength = "DayLength"; + const std::string keyStamps = "Timestamps"; } namespace openspace { @@ -68,6 +69,7 @@ RenderableTrail::RenderableTrail(const ghoul::Dictionary& dictionary) , _oldTime(std::numeric_limits::max()) , _successfullDictionaryFetch(true) , _needsSweep(true) + , _showTimestamps("timestamps", "Show Timestamps", false) { _successfullDictionaryFetch &= dictionary.getValue(keyBody, _target); _successfullDictionaryFetch &= dictionary.getValue(keyObserver, _observer); @@ -84,6 +86,10 @@ RenderableTrail::RenderableTrail(const ghoul::Dictionary& dictionary) dictionary.getValue(keyColor, color); _lineColor = color; + if (dictionary.hasKeyAndValue(keyStamps)) + dictionary.getValue(keyStamps, _showTimestamps); + addProperty(_showTimestamps); + _lineColor.setViewOption(properties::Property::ViewOptions::Color); addProperty(_lineColor); @@ -165,12 +171,18 @@ void RenderableTrail::render(const RenderData& data) { glLineWidth(1.f); + if (_showTimestamps){ + glPointSize(5.f); + glBindVertexArray(_vaoID); + glDrawArrays(GL_POINTS, 0, _vertexArray.size()); + glBindVertexArray(0); + } + _programObject->deactivate(); } void RenderableTrail::update(const UpdateData& data) { - _time = data.time; - if (data.isTimeJump) + if (data.isTimeJump) _needsSweep = true; if (_needsSweep) { @@ -185,7 +197,14 @@ void RenderableTrail::update(const UpdateData& data) { _programIsDirty = false; } double lightTime = 0.0; - psc pscPos, pscVel; + psc pscPos; + + bool intervalSet = hasTimeInterval(); + double start = DBL_MIN; + double end = DBL_MAX; + if (intervalSet) { + getInterval(start, end); + } // Points in the vertex array should always have a fixed distance. For this reason we // keep the first entry in the array floating and always pointing to the current date @@ -195,9 +214,13 @@ void RenderableTrail::update(const UpdateData& data) { int nValues = floor(deltaTime / _increment); // Update the floating current time - // Is 'CN+S' correct? It has to be chosen to be the same as in SpiceEphemeris, but - // unsure if it is correct ---abock - SpiceManager::ref().getTargetState(_target, _observer, _frame, "NONE", data.time, pscPos, pscVel, lightTime); + if (start > data.time) + SpiceManager::ref().getTargetPosition(_target, _observer, _frame, "NONE", start, pscPos, lightTime); + else if (end < data.time) + SpiceManager::ref().getTargetPosition(_target, _observer, _frame, "NONE", end, pscPos, lightTime); + else + SpiceManager::ref().getTargetPosition(_target, _observer, _frame, "NONE", data.time, pscPos, lightTime); + pscPos[3] += 3; // KM to M _vertexArray[0] = { pscPos[0], pscPos[1], pscPos[2], pscPos[3] }; @@ -212,8 +235,12 @@ void RenderableTrail::update(const UpdateData& data) { for (int i = nValues; i > 0; --i) { double et = _oldTime + i * _increment; - SpiceManager::ref().getTargetState(_target, _observer, _frame, "CN+S", et, pscPos, pscVel, lightTime); - pscPos[3] += 3; + if (start > et) + et = start; + else if (end < et) + et = end; + SpiceManager::ref().getTargetPosition(_target, _observer, _frame, "NONE", et, pscPos, lightTime); + pscPos[3] += 3; _vertexArray[i] = { pscPos[0], pscPos[1], pscPos[2], pscPos[3] }; } @@ -241,15 +268,28 @@ void RenderableTrail::fullYearSweep(double time) { float planetYear = SecondsPerEarthYear * _ratio; int segments = static_cast(_tropic); + bool intervalSet = hasTimeInterval(); + double start = DBL_MIN; + double end = DBL_MAX; + if (intervalSet) { + getInterval(start, end); + } + _increment = planetYear / _tropic; _oldTime = time; - psc pscPos, pscVel; + psc pscPos; + bool validPosition = true; _vertexArray.resize(segments+2); - for (int i = 0; i < segments+2; i++){ - SpiceManager::ref().getTargetState(_target, _observer, _frame, "CN+S", time, pscPos, pscVel, lightTime); - pscPos[3] += 3; + for (int i = 0; i < segments+2; i++) { + if (start > time) + time = start; + else if (end < time) + time = end; + + SpiceManager::ref().getTargetPosition(_target, _observer, _frame, "NONE", time, pscPos, lightTime); + pscPos[3] += 3; _vertexArray[i] = {pscPos[0], pscPos[1], pscPos[2], pscPos[3]}; time -= _increment; From 17064a92d5e18e50c314496dbb98ac6c50be92d2 Mon Sep 17 00:00:00 2001 From: Anton Arbring Date: Mon, 4 May 2015 19:40:08 -0400 Subject: [PATCH 4/5] Modifying labelparser and imagesequencer2 For extension to handling other instruments than lorri --- include/openspace/util/labelparser.h | 1 + src/rendering/renderablefov.cpp | 3 ++- src/util/imagesequencer2.cpp | 2 +- src/util/labelparser.cpp | 30 +++++++++++++++++++++++----- 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/include/openspace/util/labelparser.h b/include/openspace/util/labelparser.h index 738de59552..cea2dce8aa 100644 --- a/include/openspace/util/labelparser.h +++ b/include/openspace/util/labelparser.h @@ -56,6 +56,7 @@ private: std::string path); std::string decode(std::string line); + std::string encode(std::string line); bool augmentWithSpice(Image& image, std::string spacecraft, diff --git a/src/rendering/renderablefov.cpp b/src/rendering/renderablefov.cpp index cb57a15379..71e425c1c1 100644 --- a/src/rendering/renderablefov.cpp +++ b/src/rendering/renderablefov.cpp @@ -333,7 +333,8 @@ void RenderableFov::fovProjection(bool H[], std::vector bounds){ } if (_nrInserted == 0){ _rebuild = false; - }else{ + } + else { _rebuild = true; //update size etc; _vtotal[1] = _nrInserted; diff --git a/src/util/imagesequencer2.cpp b/src/util/imagesequencer2.cpp index bf5d64ac1a..1ef6cc6baf 100644 --- a/src/util/imagesequencer2.cpp +++ b/src/util/imagesequencer2.cpp @@ -203,7 +203,7 @@ bool ImageSequencer2::getImagePaths(std::vector& captures, if (!instumentActive(instrumentID) && !Time::ref().timeJumped()) return false; // dev. note: this is only due to LORRI being the only instrument implemented so far. - return (instrumentID == "NH_LORRI") ? getImagePaths(captures, projectee) : false; + return getImagePaths(captures, projectee); } bool ImageSequencer2::getImagePaths(std::vector& captures, diff --git a/src/util/labelparser.cpp b/src/util/labelparser.cpp index 9a0f7a39a2..7ea41621d8 100644 --- a/src/util/labelparser.cpp +++ b/src/util/labelparser.cpp @@ -74,10 +74,10 @@ LabelParser::LabelParser(const std::string& fileName, typeDictionary.getValue(keySpecs, specsOfInterestDictionary); _specsOfInterest.resize(specsOfInterestDictionary.size()); - for (int i = 0; i < _specsOfInterest.size(); ++i) { + for (int n = 0; n < _specsOfInterest.size(); ++n) { std::string readMe; - specsOfInterestDictionary.getValue(std::to_string(i + 1), readMe); - _specsOfInterest[i] = readMe; + specsOfInterestDictionary.getValue(std::to_string(n + 1), readMe); + _specsOfInterest[n] = readMe; } ghoul::Dictionary convertDictionary; typeDictionary.getValue(keyConvert, convertDictionary); @@ -103,6 +103,18 @@ std::string LabelParser::decode(std::string line){ return _fileTranslation[toTranslate]->getTranslation()[0]; //lbls always 1:1 -> single value return. } } + return ""; +} + +std::string LabelParser::encode(std::string line) { + for (auto key : _fileTranslation) { + std::size_t value = line.find(key.first); + if (value != std::string::npos) { + //std::cout << line.substr(value) << std::endl; + return line.substr(value); + } + } + return ""; } void LabelParser::create(){ @@ -114,16 +126,18 @@ void LabelParser::create(){ return a.first < b.first; }; std::string previousTarget; + std::string lblName = ""; ghoul::filesystem::Directory sequenceDir(_fileName, true); std::vector sequencePaths = sequenceDir.read(true, false); // check inputs for (auto path : sequencePaths){ + //std::cout << path << std::endl; if (size_t position = path.find_last_of(".") + 1){ if (position != std::string::npos){ ghoul::filesystem::File currentFile(path); std::string extension = currentFile.fileExtension(); - if (extension == "lbl"){ // discovered header file + if (extension == "lbl" || extension == "LBL"){ // discovered header file std::ifstream file(currentFile.path()); if (!file.good()) LERROR("Failed to open label file '" << currentFile.path() << "'"); @@ -154,6 +168,7 @@ void LabelParser::create(){ } if (read == "INSTRUMENT_ID"){ _instrumentID = decode(line); + lblName = encode(line); count++; } if (read == "DETECTOR_TYPE"){ @@ -184,6 +199,11 @@ void LabelParser::create(){ std::string ext = "jpg"; path.replace(path.begin() + position, path.end(), ext); bool fileExists = FileSys.fileExists(path); + if (!fileExists) { + ext = "JPG"; + path.replace(path.begin() + position, path.end(), ext); + fileExists = FileSys.fileExists(path); + } if (fileExists) { Image image; std::vector spiceInstrument; @@ -226,7 +246,7 @@ void LabelParser::create(){ //print all for (auto target : _subsetMap){ - _instrumentTimes.push_back(std::make_pair("LORRI", _subsetMap[target.first]._range)); + _instrumentTimes.push_back(std::make_pair(lblName, _subsetMap[target.first]._range)); std::string min, max; SpiceManager::ref().getDateFromET(target.second._range._min, min); SpiceManager::ref().getDateFromET(target.second._range._max, max); From f8d6f42f441e8a55c8b1dbf7317c7866f20d6a64 Mon Sep 17 00:00:00 2001 From: Anton Arbring Date: Mon, 4 May 2015 19:52:56 -0400 Subject: [PATCH 5/5] Default startup + renderengine fixes Added interesting times for Dawn and Rosetta in default startup script. Fixed coordinate system switch to Vesta, commented for demo but needed for development. --- scripts/default_startup.lua | 4 ++++ src/rendering/renderengine.cpp | 37 ++++++++++++++++++++++++++-------- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/scripts/default_startup.lua b/scripts/default_startup.lua index 6ef57e5c0e..9d7089981b 100644 --- a/scripts/default_startup.lua +++ b/scripts/default_startup.lua @@ -9,6 +9,10 @@ openspace.setInvertRoll(true); --openspace.time.setTime("2007 FEB 28 03:45:00") -- Io Capture! + +--openspace.time.setTime("2011 AUG 6 07:15:00") -- Dawn @ Vestaprojection +--openspace.time.setTime("2014 AUG 28 03:45:00") -- Rosetta Travels 67p in triangular shape + openspace.time.setDeltaTime(10) -- How many seconds pass per second of realtime, changeable in the GUI dofile(openspace.absPath('${SCRIPTS}/bind_keys.lua')) -- Load the default keybindings diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 02b9cb4881..1594700989 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -539,18 +539,18 @@ namespace openspace { int i = 0; PrintText(i++, "Date: %s", Time::ref().currentTimeUTC().c_str()); - /* PrintText(i++, "Avg. Frametime: %.5f", sgct::Engine::instance()->getAvgDt()); PrintText(i++, "Drawtime: %.5f", sgct::Engine::instance()->getDrawTime()); PrintText(i++, "Frametime: %.5f", sgct::Engine::instance()->getDt()); + /* PrintText(i++, "Origin: (% .5f, % .5f, % .5f, % .5f)", origin[0], origin[1], origin[2], origin[3]); PrintText(i++, "Cam pos: (% .5f, % .5f, % .5f, % .5f)", position[0], position[1], position[2], position[3]); PrintText(i++, "View dir: (% .5f, % .5f, % .5f)", viewdirection[0], viewdirection[1], viewdirection[2]); PrintText(i++, "Cam->origin: (% .15f, % .4f)", pssl[0], pssl[1]); PrintText(i++, "Scaling: (% .5f, % .5f)", scaling[0], scaling[1]); */ - - if (openspace::ImageSequencer2::ref().isReady()){ + + if (openspace::ImageSequencer2::ref().isReady()) { double remaining = openspace::ImageSequencer2::ref().getNextCaptureTime() - currentTime; double t = 1.f - remaining / openspace::ImageSequencer2::ref().getIntervalLength(); std::string progress = "|"; @@ -983,7 +983,7 @@ void RenderEngine::changeViewPoint(std::string origin) { if (solarSystemBarycenterNode == nullptr || plutoBarycenterNode == nullptr || newHorizonsNode == nullptr || jupiterBarycenterNode == nullptr //|| dawnNode == nullptr - //|| vestaNode == nullptr + //|| vestaNode == nullptr ) { LERROR("Necessary nodes does not exist"); return; @@ -995,6 +995,10 @@ void RenderEngine::changeViewPoint(std::string origin) { solarSystemBarycenterNode->setParent(plutoBarycenterNode); newHorizonsNode->setParent(plutoBarycenterNode); + + //dawnNode->setParent(plutoBarycenterNode); + //vestaNode->setParent(plutoBarycenterNode); + //newHorizonsTrailNode->setParent(plutoBarycenterNode); ghoul::Dictionary solarDictionary = { @@ -1069,6 +1073,8 @@ void RenderEngine::changeViewPoint(std::string origin) { jupiterBarycenterNode->setParent(solarSystemBarycenterNode); newHorizonsNode->setParent(solarSystemBarycenterNode); //newHorizonsTrailNode->setParent(solarSystemBarycenterNode); + //dawnNode->setParent(solarSystemBarycenterNode); + //vestaNode->setParent(solarSystemBarycenterNode); ghoul::Dictionary plutoDictionary = { @@ -1144,6 +1150,10 @@ void RenderEngine::changeViewPoint(std::string origin) { newHorizonsNode->setParent(jupiterBarycenterNode); //newHorizonsTrailNode->setParent(jupiterBarycenterNode); + //dawnNode->setParent(jupiterBarycenterNode); + //vestaNode->setParent(jupiterBarycenterNode); + + ghoul::Dictionary solarDictionary = { { std::string("Type"), std::string("Spice") }, @@ -1157,7 +1167,7 @@ void RenderEngine::changeViewPoint(std::string origin) { { { std::string("Type"), std::string("Spice") }, { std::string("Body"), std::string("PlUTO BARYCENTER") }, - { std::string("Reference"), std::string("ECLIPJ2000") }, + { std::string("Reference"), std::string("GALACTIC") }, { std::string("Observer"), std::string("JUPITER BARYCENTER") }, { std::string("Kernels"), ghoul::Dictionary() } }; @@ -1211,11 +1221,22 @@ void RenderEngine::changeViewPoint(std::string origin) { return; } //if (origin == "Vesta") { + // + // vestaNode->setParent(scene()->sceneGraphNode("SolarSystem")); + // vestaNode->setEphemeris(new StaticEphemeris); + // + // solarSystemBarycenterNode->setParent(vestaNode); + // newHorizonsNode->setParent(vestaNode); + // + // dawnNode->setParent(vestaNode); + // plutoBarycenterNode->setParent(vestaNode); + // + // // ghoul::Dictionary plutoDictionary = // { // { std::string("Type"), std::string("Spice") }, // { std::string("Body"), std::string("PLUTO BARYCENTER") }, - // { std::string("Reference"), std::string("ECLIPJ2000") }, + // { std::string("Reference"), std::string("GALACTIC") }, // { std::string("Observer"), std::string("VESTA") }, // { std::string("Kernels"), ghoul::Dictionary() } // }; @@ -1223,7 +1244,7 @@ void RenderEngine::changeViewPoint(std::string origin) { // { // { std::string("Type"), std::string("Spice") }, // { std::string("Body"), std::string("SUN") }, - // { std::string("Reference"), std::string("ECLIPJ2000") }, + // { std::string("Reference"), std::string("GALACTIC") }, // { std::string("Observer"), std::string("VESTA") }, // { std::string("Kernels"), ghoul::Dictionary() } // }; @@ -1232,7 +1253,7 @@ void RenderEngine::changeViewPoint(std::string origin) { // { // { std::string("Type"), std::string("Spice") }, // { std::string("Body"), std::string("JUPITER BARYCENTER") }, - // { std::string("Reference"), std::string("ECLIPJ2000") }, + // { std::string("Reference"), std::string("GALACTIC") }, // { std::string("Observer"), std::string("VESTA") }, // { std::string("Kernels"), ghoul::Dictionary() } // };