]> git.mxchange.org Git - simgear.git/commitdiff
Add methods to SGGeod to return OSG Matrix objects for local frames.
authortimoore <timoore>
Tue, 4 Mar 2008 08:53:27 +0000 (08:53 +0000)
committertimoore <timoore>
Tue, 4 Mar 2008 08:53:27 +0000 (08:53 +0000)
Methods have been added for Z down (simulation) and Z up frames.

simgear/math/Makefile.am
simgear/math/SGGeod.cxx [new file with mode: 0644]
simgear/math/SGGeod.hxx

index d9124926b239be50d78760e948f86521e2cc72bf..75bec30e1b50bfba3a4f89adde408d4cd929ed48 100644 (file)
@@ -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 (file)
index 0000000..01e857a
--- /dev/null
@@ -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;
+}
index 50c6b97dac2fd4c82fbb9901de8c3e071aa073ee..4fea57ac4e20fbbd1e2aae9f14eefb05bb68998e 100644 (file)
@@ -20,6 +20,8 @@
 
 #include <simgear/constants.h>
 
+#include <osg/Matrix>
+
 // #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