From 600726976c2513cac582538bf4cb8e4a569e4010 Mon Sep 17 00:00:00 2001 From: timoore Date: Tue, 4 Mar 2008 08:53:27 +0000 Subject: [PATCH] Add methods to SGGeod to return OSG Matrix objects for local frames. Methods have been added for Z down (simulation) and Z up frames. --- simgear/math/Makefile.am | 1 + simgear/math/SGGeod.cxx | 51 ++++++++++++++++++++++++++++++++++++++++ simgear/math/SGGeod.hxx | 14 +++++++++++ 3 files changed, 66 insertions(+) create mode 100644 simgear/math/SGGeod.cxx diff --git a/simgear/math/Makefile.am b/simgear/math/Makefile.am index d9124926..75bec30e 100644 --- a/simgear/math/Makefile.am +++ b/simgear/math/Makefile.am @@ -48,6 +48,7 @@ libsgmath_a_SOURCES = \ leastsqs.cxx \ sg_random.c \ vector.cxx \ + SGGeod.cxx \ SGGeodesy.cxx INCLUDES = -I$(top_srcdir) diff --git a/simgear/math/SGGeod.cxx b/simgear/math/SGGeod.cxx new file mode 100644 index 00000000..01e857a2 --- /dev/null +++ b/simgear/math/SGGeod.cxx @@ -0,0 +1,51 @@ +// Copyright (C) 2008 Tim Moore timoore@redhat.com +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Library General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// + +#include "SGMath.hxx" + +osg::Matrix SGGeod::makeSimulationFrameRelative() +{ + SGQuatd hlOr = SGQuatd::fromLonLat(*this); + return osg::Matrix(hlOr.osg()); +} + +osg::Matrix SGGeod::makeSimulationFrame() +{ + osg::Matrix result(makeSimulationFrameRelative()); + SGVec3d coord; + SGGeodesy::SGGeodToCart(*this, coord); + result.setTrans(coord.osg()); + return result; +} + +osg::Matrix SGGeod::makeZUpFrameRelative() +{ + osg::Matrix result(makeSimulationFrameRelative()); + // 180 degree rotation around Y axis + osg::Quat flip(0.0, 1.0, 0.0, 0.0); + result.preMult(osg::Matrix(flip)); + return result; +} + +osg::Matrix SGGeod::makeZUpFrame() +{ + osg::Matrix result(makeZUpFrameRelative()); + SGVec3d coord; + SGGeodesy::SGGeodToCart(*this, coord); + result.setTrans(coord.osg()); + return result; +} diff --git a/simgear/math/SGGeod.hxx b/simgear/math/SGGeod.hxx index 50c6b97d..4fea57ac 100644 --- a/simgear/math/SGGeod.hxx +++ b/simgear/math/SGGeod.hxx @@ -20,6 +20,8 @@ #include +#include + // #define SG_GEOD_NATIVE_DEGREE /// Class representing a geodetic location @@ -78,6 +80,18 @@ public: /// Set the geodetic elevation from the argument given in feet void setElevationFt(double elevation); + // 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(); + osg::Matrix makeSimulationFrame(); + + // 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(); + osg::Matrix makeZUpFrame(); 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 -- 2.39.5