X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fmath%2FSGGeod.hxx;h=86e38a1f655889801f36be830c2dbc2e0d97456d;hb=6a7c2000027cd22eea603e936ddbad1a5bfc8b04;hp=50c6b97dac2fd4c82fbb9901de8c3e071aa073ee;hpb=899623f71bc687a3bbc8167ce582692694e4d56d;p=simgear.git diff --git a/simgear/math/SGGeod.hxx b/simgear/math/SGGeod.hxx index 50c6b97d..86e38a1f 100644 --- a/simgear/math/SGGeod.hxx +++ b/simgear/math/SGGeod.hxx @@ -20,6 +20,10 @@ #include +#ifndef NO_OPENSCENEGRAPH_INTERFACE +#include +#endif + // #define SG_GEOD_NATIVE_DEGREE /// Class representing a geodetic location @@ -40,6 +44,10 @@ public: static SGGeod fromRadM(double lon, double lat, double elevation); /// Factory from angular values in degrees and elevation in m static SGGeod fromDegM(double lon, double lat, double elevation); + /// Factory from an other SGGeod and a different elevation in m + static SGGeod fromGeodM(const SGGeod& geod, double elevation); + /// Factory from an other SGGeod and a different elevation in ft + static SGGeod fromGeodFt(const SGGeod& geod, double elevation); /// Factory to convert position from a cartesian position assumed to be /// in wgs84 measured in meters /// Note that this conversion is relatively expensive to compute @@ -78,13 +86,27 @@ public: /// Set the geodetic elevation from the argument given in feet void setElevationFt(double elevation); +#ifndef NO_OPENSCENEGRAPH_INTERFACE + // Create a local coordinate frame in the earth-centered frame of + // reference. X points north, Z points down. + // makeSimulationFrameRelative() only includes rotation. + osg::Matrix makeSimulationFrameRelative() const; + osg::Matrix makeSimulationFrame() const; + + // Create a Z-up local coordinate frame in the earth-centered frame + // of reference. This is what scenery models, etc. expect. + // makeZUpFrameRelative() only includes rotation. + osg::Matrix makeZUpFrameRelative() const; + osg::Matrix makeZUpFrame() const; +#endif private: /// This one is private since construction is not unique if you do /// not know the units of the arguments. Use the factory methods for /// that purpose SGGeod(double lon, double lat, double elevation); - /// The actual data, angles in degree, elevation in meters + //// FIXME: wrong comment! + /// The actual data, angles in degrees, elevation in meters /// The rationale for storing the values in degrees is that most code places /// in flightgear/terragear use degrees as a nativ input and output value. /// The places where it makes sense to use radians is when we convert @@ -178,6 +200,20 @@ SGGeod::fromDegM(double lon, double lat, double elevation) #endif } +inline +SGGeod +SGGeod::fromGeodM(const SGGeod& geod, double elevation) +{ + return SGGeod(geod._lon, geod._lat, elevation); +} + +inline +SGGeod +SGGeod::fromGeodFt(const SGGeod& geod, double elevation) +{ + return SGGeod(geod._lon, geod._lat, elevation*SG_FEET_TO_METER); +} + inline SGGeod SGGeod::fromCart(const SGVec3& cart)