14 #ifndef OSG_COORDINATESYSTEMNODE
15 #define OSG_COORDINATESYSTEMNODE 1
18 #include <osg/Matrixd>
36 double radiusPolar = WGS_84_RADIUS_POLAR):
54 double& X,
double& Y,
double& Z)
const;
57 double& latitude,
double& longitude,
double&
height)
const;
116 const std::string&
getFormat()
const {
return _format; }
135 CoordinateFrame computeLocalCoordinateFrame(
const Vec3d& position)
const;
156 double& X,
double& Y,
double& Z)
const
159 double sin_latitude = sin(latitude);
160 double cos_latitude = cos(latitude);
162 X = (N+
height)*cos_latitude*cos(longitude);
163 Y = (N+
height)*cos_latitude*sin(longitude);
169 double& latitude,
double& longitude,
double&
height)
const
172 double p = sqrt(X*X + Y*Y);
174 double eDashSquared = (_radiusEquator*_radiusEquator - _radiusPolar*
_radiusPolar)/
175 (_radiusPolar*_radiusPolar);
177 double sin_theta = sin(theta);
178 double cos_theta = cos(theta);
180 latitude = atan( (Z + eDashSquared*_radiusPolar*sin_theta*sin_theta*sin_theta) /
182 longitude = atan2(Y,X);
184 double sin_latitude = sin(latitude);
187 height = p/cos(latitude) - N;
201 double latitude, longitude,
height;
211 osg::Vec3d up ( cos(longitude)*cos(latitude), sin(longitude)*cos(latitude), sin(latitude));
214 osg::Vec3d east (-sin(longitude), cos(longitude), 0);
220 localToWorld(0,0) = east[0];
221 localToWorld(0,1) = east[1];
222 localToWorld(0,2) = east[2];
224 localToWorld(1,0) = north[0];
225 localToWorld(1,1) = north[1];
226 localToWorld(1,2) = north[2];
228 localToWorld(2,0) = up[0];
229 localToWorld(2,1) = up[1];
230 localToWorld(2,2) = up[2];
242 return osg::Vec3d( cos(longitude) * cos(latitude),
243 sin(longitude) * cos(latitude),
void computeCoordinateFrame(double latitude, double longitude, osg::Matrixd &localToWorld) const
void computeCoefficients()
EllipsoidModel(double radiusEquator=WGS_84_RADIUS_EQUATOR, double radiusPolar=WGS_84_RADIUS_POLAR)
double _eccentricitySquared
void setEllipsoidModel(EllipsoidModel *ellipsode)
const std::string & getFormat() const
const std::string & getCoordinateSystem() const
const double WGS_84_RADIUS_POLAR
osg::Vec3d computeLocalUpVector(double X, double Y, double Z) const
void setRadiusPolar(double radius)
#define META_Node(library, name)
virtual ~CoordinateSystemNode()
const EllipsoidModel * getEllipsoidModel() const
ref_ptr< EllipsoidModel > _ellipsoidModel
void setRadiusEquator(double radius)
EllipsoidModel * getEllipsoidModel()
void computeLocalToWorldTransformFromXYZ(double X, double Y, double Z, osg::Matrixd &localToWorld) const
void convertXYZToLatLongHeight(double X, double Y, double Z, double &latitude, double &longitude, double &height) const
EllipsoidModel(const EllipsoidModel &et, const CopyOp ©op=CopyOp::SHALLOW_COPY)
void setFormat(const std::string &format)
const double WGS_84_RADIUS_EQUATOR
GLint GLenum GLsizei GLsizei height
friend bool operator==(const EllipsoidModel &e1, const EllipsoidModel &e2)
META_Object(osg, EllipsoidModel)
void computeLocalToWorldTransformFromLatLongHeight(double latitude, double longitude, double height, osg::Matrixd &localToWorld) const
void makeTranslate(const Vec3f &)
void setCoordinateSystem(const std::string &cs)
double getRadiusPolar() const
double getRadiusEquator() const
void convertLatLongHeightToXYZ(double latitude, double longitude, double height, double &X, double &Y, double &Z) const
GLint GLenum GLsizei GLsizei GLsizei GLint GLenum format