VR-Engage  2.2
Loading...
Searching...
No Matches
coordConverter.h
Go to the documentation of this file.
1/*******************************************************************************
2** Copyright (c) 2025 MAK Technologies
3** All rights reserved.
4*******************************************************************************/
5
6#pragma once
7
8//! \file coordConverter.h
9//! \brief Provides coordinate conversion functionality between different coordinate systems
10
11#include "vreUtil/export.h"
12
13#include "vreUtil/initializer.h"
14
15#include <matrix/vlVector.h>
16#include <matrix/vlTaitBryan.h>
17#include <matrix/geodeticCoord.h>
18#include <matrix/coordTransform.h>
19#include <matrix/utmReferencePoint.h>
20
21namespace makVre
22{
23
24//! \brief Class for converting between different coordinate systems
25//!
26//! The DtCoordinateConvert class provides methods for converting positions, vectors,
27//! and orientations between different coordinate systems, including geocentric,
28//! topographic, UTM, and flat-earth coordinates. It also supports axis remapping
29//! and flipping to handle different coordinate system conventions.
31{
32public:
33 //! \brief Enumeration of axis types
35 {
36 X, //!< X axis
37 Y, //!< Y axis
38 Z //!< Z axis
39 };
40
41 //! \brief Enumeration of coordinate system types
43 {
44 FLATEARTH, //!< Flat earth coordinates (local tangent plane approximation)
45 TOPOGRAPHIC, //!< Topographic coordinates (local NED coordinate system)
46 UTM, //!< Universal Transverse Mercator coordinates
47 GEOCENTRIC //!< Earth-centered Earth-fixed coordinates
48 };
49
50 //! \brief Structure containing initialization data for coordinate conversion
52 {
53 CoordinateType coordinateType; //!< The coordinate system type
54 DtGeodeticCoord origin; //!< The geodetic origin (lat, lon, alt)
55 DtVector offset; //!< Optional offset to apply to coordinates
56 bool flipX; //!< Flag to flip the X axis
57 bool flipY; //!< Flag to flip the Y axis
58 bool flipZ; //!< Flag to flip the Z axis
59 AxisType rempapX; //!< Axis to use for X in remapping
60 AxisType rempapY; //!< Axis to use for Y in remapping
61 AxisType rempapZ; //!< Axis to use for Z in remapping
62 bool useFalseEasting; //!< Flag to use false easting in UTM coordinates
63
64 //! \brief Default constructor with default values
66 {
68 origin = DtGeodeticCoord(0.0, 0.0, 0.0);
69 offset = DtVector::zero();
70 flipX = flipY = flipZ = false;
71 rempapX = X;
72 rempapY = Y;
73 rempapZ = Z;
74 useFalseEasting = false;
75 }
76 };
77
78
79 //! \brief Default constructor
80 //!
81 //! Creates a coordinate converter with default settings (GEOCENTRIC coordinates)
83
84 //! \brief Virtual destructor
86
87 //! \brief Initialize the converter with explicit settings
88 //!
89 //! \param data The initialization data structure containing converter settings
90 virtual void init(DtCoordConvertInitData data);
91
92 //! \brief Initialize the converter from a configuration table
93 //!
94 //! \param init A Lua configuration table containing converter settings
95 virtual void init(DtInitTable& init);
96
97 //! \brief Convert a position from local to geocentric coordinates
98 //!
99 //! \param pos The position in local coordinates
100 //! \return The position in geocentric coordinates
101 virtual DtVector toGeocPos(const DtVector& pos) const;
102
103 //! \brief Convert a vector from local to geocentric coordinates
104 //!
105 //! \param vec The vector in local coordinates
106 //! \param localPos The local position where the vector is applied
107 //! \return The vector in geocentric coordinates
108 virtual DtVector toGeocVec(const DtVector& vec, const DtVector& localPos) const;
109
110 //! \brief Convert an orientation from local heading/pitch/roll to geocentric orientation
111 //!
112 //! \param heading The heading (yaw) angle in radians
113 //! \param pitch The pitch angle in radians
114 //! \param roll The roll angle in radians
115 //! \param localPos The local position associated with the orientation
116 //! \return The orientation in geocentric coordinates as a Tait-Bryan representation
117 virtual DtTaitBryan toGeocOri(float heading, float pitch, float roll, const DtVector& localPos) const;
118
119 //! \brief Convert an orientation from local to geocentric coordinates
120 //!
121 //! \param localOri The orientation in local coordinates
122 //! \param localPos The local position associated with the orientation
123 //! \return The orientation in geocentric coordinates
124 virtual DtTaitBryan toGeocOri(const DtTaitBryan& localOri, const DtVector& localPos) const;
125
126 //! \brief Convert a position from geocentric to local coordinates
127 //!
128 //! \param pos The position in geocentric coordinates
129 //! \return The position in local coordinates
130 virtual DtVector fromGeocPos(const DtVector& pos) const;
131
132 //! \brief Convert a vector from geocentric to local coordinates
133 //!
134 //! \param geocVec The vector in geocentric coordinates
135 //! \param geocPos The geocentric position where the vector is applied
136 //! \return The vector in local coordinates
137 virtual DtVector fromGeocVec(const DtVector& geocVec, const DtVector& geocPos) const;
138
139 //! \brief Convert an orientation from geocentric to local coordinates
140 //!
141 //! \param geocOri The orientation in geocentric coordinates
142 //! \param geocLoc The geocentric position associated with the orientation
143 //! \return The orientation in local coordinates
144 virtual DtTaitBryan fromGeocOri(const DtTaitBryan& geocOri, const DtVector& geocLoc) const;
145
146 //! \brief Calculate heading from geocentric location and orientation
147 //!
148 //! \param geocLoc The geocentric location
149 //! \param geocOri The geocentric orientation
150 //! \return The heading angle in radians
151 static double calcHeading(DtVector geocLoc, DtTaitBryan geocOri);
152
153 //! \brief Calculate pitch from geocentric location and orientation
154 //!
155 //! \param geocLoc The geocentric location
156 //! \param geocOri The geocentric orientation
157 //! \return The pitch angle in radians
158 static double calcPitch(DtVector geocLoc, DtTaitBryan geocOri);
159
160 //! \brief Calculate roll from geocentric location and orientation
161 //!
162 //! \param geocLoc The geocentric location
163 //! \param geocOri The geocentric orientation
164 //! \return The roll angle in radians
165 static double calcRoll(DtVector geocLoc, DtTaitBryan geocOri);
166
167 //! \brief Calculate heading, pitch, and roll from geocentric location and orientation
168 //!
169 //! \param geocLoc The geocentric location
170 //! \param geocOri The geocentric orientation
171 //! \param[out] heading The calculated heading angle in radians
172 //! \param[out] pitch The calculated pitch angle in radians
173 //! \param[out] roll The calculated roll angle in radians
175 DtVector geocLoc, DtTaitBryan geocOri, double& heading, double& pitch, double& roll);
176
177 //! \brief Calculate Tait-Bryan orientation from heading, pitch, roll and geocentric location
178 //!
179 //! \param heading The heading angle in radians
180 //! \param pitch The pitch angle in radians
181 //! \param roll The roll angle in radians
182 //! \param geocLoc The geocentric location
183 //! \return The Tait-Bryan orientation in geocentric coordinates
184 static DtTaitBryan calcTaitBryan(double heading, double pitch, double roll, DtVector geocLoc);
185
186 //! \brief returns the geodetic coordinate origin
187 //! @return the geodetic coordinate. Can be zero if not using geocentric coordinate
188 const DtGeodeticCoord& origin() const;
189
190protected:
191 //! \brief Handle axis remapping for vector conversion
192 //!
193 //! \param vec The input vector
194 //! \param x The axis to use for X
195 //! \param y The axis to use for Y
196 //! \param z The axis to use for Z
197 //! \return The remapped vector
198 DtVector handleRemapping(const DtVector& vec, AxisType x, AxisType y, AxisType z) const;
199
200 //! \brief Handle axis flipping for vector conversion
201 //!
202 //! \param vec The input vector
203 //! \param x Whether to flip the X axis
204 //! \param y Whether to flip the Y axis
205 //! \param z Whether to flip the Z axis
206 //! \return The flipped vector
207 DtVector handleFlipping(const DtVector& vec, bool x, bool y, bool z) const;
208
209 //! \brief Convert a string to a double
210 //!
211 //! \param str The string to convert
212 //! \return The double value
213 double convertToDouble(const std::string& str) const;
214
215 //! \brief The current coordinate system type
217
218 //! \brief Transformation from topographic to geocentric coordinates
219 DtCoordTransform myTopoTransform;
220
221 //! \brief Transformation from geocentric to topographic coordinates
222 DtCoordTransform myInverseTopoTransform;
223
224 //! \brief UTM reference point for UTM conversions
225 DtUtmReferencePoint myUtmReference;
226
227 //! \brief The axis to use for X in remapping
229
230 //! \brief The axis to use for Y in remapping
232
233 //! \brief The axis to use for Z in remapping
235
236 //! \brief Whether to flip the X axis
238
239 //! \brief Whether to flip the Y axis
241
242 //! \brief Whether to flip the Z axis
244
245 //! \brief Offset to apply to coordinates
246 DtVector myOffset;
247
248 //! \brief Geodetic origin (lat, lon, alt)
249 DtGeodeticCoord myOrigin;
250};
251
252} // namespace makVre
DtCoordTransform myTopoTransform
Transformation from topographic to geocentric coordinates.
Definition coordConverter.h:219
DtCoordTransform myInverseTopoTransform
Transformation from geocentric to topographic coordinates.
Definition coordConverter.h:222
DtVector handleFlipping(const DtVector &vec, bool x, bool y, bool z) const
Handle axis flipping for vector conversion.
static double calcPitch(DtVector geocLoc, DtTaitBryan geocOri)
Calculate pitch from geocentric location and orientation.
AxisType myRemapX
The axis to use for X in remapping.
Definition coordConverter.h:228
virtual DtTaitBryan toGeocOri(const DtTaitBryan &localOri, const DtVector &localPos) const
Convert an orientation from local to geocentric coordinates.
CoordinateType
Enumeration of coordinate system types.
Definition coordConverter.h:43
@ FLATEARTH
Flat earth coordinates (local tangent plane approximation)
Definition coordConverter.h:44
@ UTM
Universal Transverse Mercator coordinates.
Definition coordConverter.h:46
@ GEOCENTRIC
Earth-centered Earth-fixed coordinates.
Definition coordConverter.h:47
@ TOPOGRAPHIC
Topographic coordinates (local NED coordinate system)
Definition coordConverter.h:45
bool myFlipX
Whether to flip the X axis.
Definition coordConverter.h:237
virtual DtVector toGeocVec(const DtVector &vec, const DtVector &localPos) const
Convert a vector from local to geocentric coordinates.
static double calcHeading(DtVector geocLoc, DtTaitBryan geocOri)
Calculate heading from geocentric location and orientation.
AxisType myRemapZ
The axis to use for Z in remapping.
Definition coordConverter.h:234
DtUtmReferencePoint myUtmReference
UTM reference point for UTM conversions.
Definition coordConverter.h:225
virtual void init(DtInitTable &init)
Initialize the converter from a configuration table.
virtual DtVector toGeocPos(const DtVector &pos) const
Convert a position from local to geocentric coordinates.
DtGeodeticCoord myOrigin
Geodetic origin (lat, lon, alt)
Definition coordConverter.h:249
bool myFlipZ
Whether to flip the Z axis.
Definition coordConverter.h:243
virtual DtVector fromGeocPos(const DtVector &pos) const
Convert a position from geocentric to local coordinates.
virtual void init(DtCoordConvertInitData data)
Initialize the converter with explicit settings.
AxisType
Enumeration of axis types.
Definition coordConverter.h:35
@ X
X axis.
Definition coordConverter.h:36
@ Y
Y axis.
Definition coordConverter.h:37
@ Z
Z axis.
Definition coordConverter.h:38
DtVector myOffset
Offset to apply to coordinates.
Definition coordConverter.h:246
static DtTaitBryan calcTaitBryan(double heading, double pitch, double roll, DtVector geocLoc)
Calculate Tait-Bryan orientation from heading, pitch, roll and geocentric location.
AxisType myRemapY
The axis to use for Y in remapping.
Definition coordConverter.h:231
DtVector handleRemapping(const DtVector &vec, AxisType x, AxisType y, AxisType z) const
Handle axis remapping for vector conversion.
virtual DtTaitBryan fromGeocOri(const DtTaitBryan &geocOri, const DtVector &geocLoc) const
Convert an orientation from geocentric to local coordinates.
virtual DtVector fromGeocVec(const DtVector &geocVec, const DtVector &geocPos) const
Convert a vector from geocentric to local coordinates.
const DtGeodeticCoord & origin() const
returns the geodetic coordinate origin
virtual ~DtCoordinateConvert()
Virtual destructor.
virtual DtTaitBryan toGeocOri(float heading, float pitch, float roll, const DtVector &localPos) const
Convert an orientation from local heading/pitch/roll to geocentric orientation.
double convertToDouble(const std::string &str) const
Convert a string to a double.
bool myFlipY
Whether to flip the Y axis.
Definition coordConverter.h:240
static void calcHeadingPitchRoll(DtVector geocLoc, DtTaitBryan geocOri, double &heading, double &pitch, double &roll)
Calculate heading, pitch, and roll from geocentric location and orientation.
DtCoordinateConvert()
Default constructor.
CoordinateType myCoordinateType
The current coordinate system type.
Definition coordConverter.h:216
static double calcRoll(DtVector geocLoc, DtTaitBryan geocOri)
Calculate roll from geocentric location and orientation.
Table-based access to Lua state for configuration data.
Definition initializer.h:38
Defines export macros for the VREngage Utility library.
#define UTIL_DLL
Export/import macro for non-Windows platforms.
Definition export.h:39
Provides configuration initialization for VREngage components.
Include export definitions for this library.
Definition glsVreMessageUtil.h:49
Structure containing initialization data for coordinate conversion.
Definition coordConverter.h:52
AxisType rempapY
Axis to use for Y in remapping.
Definition coordConverter.h:60
bool flipX
Flag to flip the X axis.
Definition coordConverter.h:56
CoordinateType coordinateType
The coordinate system type.
Definition coordConverter.h:53
DtGeodeticCoord origin
The geodetic origin (lat, lon, alt)
Definition coordConverter.h:54
DtCoordConvertInitData()
Default constructor with default values.
Definition coordConverter.h:65
bool useFalseEasting
Flag to use false easting in UTM coordinates.
Definition coordConverter.h:62
bool flipY
Flag to flip the Y axis.
Definition coordConverter.h:57
bool flipZ
Flag to flip the Z axis.
Definition coordConverter.h:58
AxisType rempapZ
Axis to use for Z in remapping.
Definition coordConverter.h:61
DtVector offset
Optional offset to apply to coordinates.
Definition coordConverter.h:55
AxisType rempapX
Axis to use for X in remapping.
Definition coordConverter.h:59