mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-04-30 07:49:31 -05:00
SPICE-time dependency, retrieval of spice ephemerides and rotational matrix + coordinate references.
Added functionality: - New class renderablesphericalgrid is repurposed code from powerscaledsphere class. Due to z-buffer issues used as reference grid to confirm planetary orbits are correct. This has been a major problem as prior we had no visual reference. Now we have a Galactic-, Celestial- and Ecliptic-coordinate grid. To this also added separate shader: grid_vs.glsl / grid_fs.glsl These grids have a static-rotational matrix derived from partiview (thanks to Brian) since spice req. to-from frame to compute rotational matrix. Time dependency: - Added struct RuntimeData - which for now only contains openspace time and is passed to all renderables - All renderables accept runtimeData, keep private reference and use for computation of rotational matrix - This obviously carries corresponding changes to Scenegraph and ScenegraphNode. Spicemanager: - Added function that more easily provides access to rotational matrix used in spice (used in renderableplanet for computing planetary objects spin around axis) Ephemeris-classes: - Now compute ephemeris from spice based on timeepoch in runtimedata TODO: once z-buffer fixed - set ephemeris correctly as meters (not kilometers) Renderengine: - Advances time with the advanceTime method in RuntimeData struct ISSUES: - Our Y axis NOT same as SPICE or star-catalogue, all renderables rotated now 90deg, needs redefinition, lots of debugging and major headaches before this conclusion. - Depth buffer needs to be fixed in order to properly place planets. - Spice kernels have finite time-range, when time stops - simulation ends - ugly fix: reset time to zero. Possible fix: kernels de431 (part 1-2) cover huge timespan and most likely have functions to extrapolate time, drawback is that they are 1,7 gb each. TODO: - Compute and draw dynamic ephemeries for each renderable. Either do full year sweep then update for each point or create a tail of linesegments for each planet. Dont know yet how to do this, would like spicephemeris to be sub-class of Renderable (have own render() method) - good/bad?
This commit is contained in:
@@ -68,7 +68,12 @@ namespace planetgeometry {
|
||||
const std::string keyType = "Type";
|
||||
} // namespace planetgeometry
|
||||
|
||||
|
||||
namespace renderablesphericalgrid{
|
||||
const std::string gridType = "GridType";
|
||||
const std::string gridColor = "GridColor";
|
||||
const std::string gridMatrix = "GridMatrix";
|
||||
const std::string gridSegments = "GridSegments";
|
||||
}
|
||||
|
||||
namespace ephemeris {
|
||||
const std::string keyType = "Type";
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
#ifndef __RUNTIMEDATA_H__
|
||||
#define __RUNTIMEDATA_H__
|
||||
|
||||
enum increment{
|
||||
YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, MILLISECOND
|
||||
};
|
||||
|
||||
struct RuntimeData{
|
||||
public:
|
||||
RuntimeData() :_openspaceTime(0.0){
|
||||
};
|
||||
void setTime(double time) { _openspaceTime = time; }
|
||||
double getTime() { return _openspaceTime; }
|
||||
|
||||
// cant come up with proper user friendly-method, this will do.
|
||||
void advanceTimeBy(double nr, increment incr){
|
||||
switch (incr){
|
||||
case YEAR: _openspaceTime += (nr * year); break;
|
||||
case MONTH: _openspaceTime += (nr * month); break;
|
||||
case DAY: _openspaceTime += (nr * day); break;
|
||||
case HOUR: _openspaceTime += (nr * hour); break;
|
||||
case MINUTE: _openspaceTime += (nr * minute); break;
|
||||
case MILLISECOND: _openspaceTime += (nr * millisec); break;
|
||||
default : _openspaceTime += (nr);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
double _openspaceTime;
|
||||
|
||||
double year = 3.154*pow(10, 7);
|
||||
double month = 2.628*pow(10, 6);
|
||||
double day = 86400;
|
||||
double hour = 3600;
|
||||
double minute = 60;
|
||||
double millisec = 0.001;
|
||||
};
|
||||
|
||||
#endif // __RUNTIMEDATA_H__
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
#include <string>
|
||||
#include <ghoul/glm.h>
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
|
||||
@@ -44,7 +45,7 @@ public:
|
||||
static SpiceManager& ref();
|
||||
|
||||
/**
|
||||
* Load on or more SPICE kernels into a program. If client provides
|
||||
* Load one or more SPICE kernels into a program. If client provides
|
||||
* the path to a binary kernel or meta-kernel upon which its loaded
|
||||
* to the appropriate SPICE subsystem. if the file is a textkernel
|
||||
* it will be loaded into kernel pool.
|
||||
@@ -110,6 +111,7 @@ public:
|
||||
|
||||
// Converting between UTC and Ephemeris Time (LSK) ------------------------------------- //
|
||||
|
||||
|
||||
/**
|
||||
* Convert a string representing an epoch to a double precision
|
||||
* value representing the number of TDB seconds past the J2000
|
||||
@@ -121,6 +123,8 @@ public:
|
||||
*/
|
||||
double stringToEphemerisTime(const std::string& epochString) const;
|
||||
|
||||
std::string ephemerisTimeToString(const double et) const;
|
||||
|
||||
// Computing Positions of Spacecraft and Natural Bodies(SPK) ---------------------------- //
|
||||
|
||||
/**
|
||||
@@ -144,7 +148,7 @@ public:
|
||||
const std::string& aberrationCorrection,
|
||||
const std::string& observer,
|
||||
glm::dvec3& targetPosition,
|
||||
double lightTime) const;
|
||||
double& lightTime) const;
|
||||
/**
|
||||
* Return the state (position and velocity) of a target body
|
||||
* relative to an observing body, optionally corrected for light
|
||||
@@ -168,7 +172,7 @@ public:
|
||||
const std::string& observer,
|
||||
glm::dvec3& targetPosition,
|
||||
glm::dvec3& targetVelocity,
|
||||
double lightTime) const;
|
||||
double& lightTime) const;
|
||||
|
||||
// Computing Transformations Between Frames (FK) -------------------------------------- //
|
||||
|
||||
@@ -203,6 +207,12 @@ public:
|
||||
const std::string& toFrame,
|
||||
double ephemerisTime,
|
||||
transformMatrix& positionMatrix) const;
|
||||
|
||||
|
||||
void getPositionTransformMatrixGLM(const std::string& fromFrame,
|
||||
const std::string& toFrame,
|
||||
double ephemerisTime,
|
||||
glm::dmat3& positionMatrix) const;
|
||||
|
||||
// Retrieving Instrument Parameters (IK) ------------------------------------------ //
|
||||
|
||||
@@ -351,8 +361,8 @@ private:
|
||||
* or <code>getPositionTransformMatrix</code> the instantiated object
|
||||
* can transform position and velocity to any specified reference frame.
|
||||
*
|
||||
* Client-sied example:
|
||||
* openspace::transformMatrix m(6);
|
||||
* Client-side example:
|
||||
* openspace::transformMatrix stateMatrix(6);
|
||||
* openspace::SpiceManager::ref().getStateTransformMatrix("J2000",
|
||||
* "IAU_PHOEBE",
|
||||
* et,
|
||||
@@ -367,16 +377,17 @@ private:
|
||||
int N;
|
||||
double *data;
|
||||
bool empty;
|
||||
|
||||
friend class SpiceManager;
|
||||
public:
|
||||
double* ptr() {
|
||||
empty = false;
|
||||
return data;
|
||||
}
|
||||
friend class SpiceManager;
|
||||
public:
|
||||
/* default constructor */
|
||||
transformMatrix();
|
||||
/* default destructor */
|
||||
~transformMatrix(){ delete[] data; };
|
||||
// ~transformMatrix(){ delete[] data; };
|
||||
/* allocation of memory */
|
||||
transformMatrix(int n) : N(n){
|
||||
data = new double[N*N];
|
||||
|
||||
@@ -14,6 +14,7 @@ public:
|
||||
static bool isInitialized();
|
||||
|
||||
void setTime(const char* stringTime);
|
||||
void setTime(double intTime);
|
||||
double getTime();
|
||||
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user