1
0
Fork 0

More use of SGGeo[dc].

This commit is contained in:
frohlich 2006-06-15 08:29:43 +00:00
parent 7327e35020
commit c2d8dcc18b
13 changed files with 81 additions and 98 deletions

View file

@ -180,7 +180,7 @@ void FGAIAircraft::Run(double dt) {
doGroundAltitude();
//cerr << " Actual altitude " << altitude << endl;
// Transform();
pos.setelev(altitude * SG_FEET_TO_METER);
pos.setElevationFt(altitude);
}
return;
}
@ -219,8 +219,8 @@ void FGAIAircraft::Run(double dt) {
* speed * 1.686 / ft_per_deg_lon;
// set new position
pos.setlat( pos.lat() + speed_north_deg_sec * dt);
pos.setlon( pos.lon() + speed_east_deg_sec * dt);
pos.setLatitudeDeg( pos.getLatitudeDeg() + speed_north_deg_sec * dt);
pos.setLongitudeDeg( pos.getLongitudeDeg() + speed_east_deg_sec * dt);
//if (!(finite(pos.lat()) && finite(pos.lon())))
// {
// cerr << "Position is not finite" << endl;
@ -361,7 +361,7 @@ void FGAIAircraft::Run(double dt) {
// adjust altitude (meters) based on current vertical speed (fpm)
altitude += vs / 60.0 * dt;
pos.setelev(altitude * SG_FEET_TO_METER);
pos.setElevationFt(altitude);
double altitude_ft = altitude;
// adjust target Altitude, based on ground elevation when on ground
@ -564,7 +564,7 @@ void FGAIAircraft::ProcessFlightPlan( double dt, time_t now ) {
if (curr->crossat > -1000.0) { //use a calculated descent/climb rate
use_perf_vs = false;
tgt_vs = (curr->crossat - prev->altitude)
/ (fp->getDistanceToGo(pos.lat(), pos.lon(), curr)
/ (fp->getDistanceToGo(pos.getLatitudeDeg(), pos.getLongitudeDeg(), curr)
/ 6076.0 / prev->speed*60.0);
tgt_altitude = curr->crossat;
} else {
@ -597,7 +597,7 @@ void FGAIAircraft::ProcessFlightPlan( double dt, time_t now ) {
dt_count = 0;
}
// check to see if we've reached the lead point for our next turn
double dist_to_go = fp->getDistanceToGo(pos.lat(), pos.lon(), curr);
double dist_to_go = fp->getDistanceToGo(pos.getLatitudeDeg(), pos.getLongitudeDeg(), curr);
//cerr << "2" << endl;
double lead_dist = fp->getLeadDistance();
@ -666,7 +666,7 @@ void FGAIAircraft::ProcessFlightPlan( double dt, time_t now ) {
double userLatitude = fgGetDouble("/position/latitude-deg");
double userLongitude = fgGetDouble("/position/longitude-deg");
double course, distance;
SGWayPoint current (pos.lon(), pos.lat(), 0);
SGWayPoint current(pos.getLongitudeDeg(), pos.getLatitudeDeg(), 0);
SGWayPoint user (userLongitude, userLatitude, 0);
user.CourseAndDistance(current, &course, &distance);
if ((distance * SG_METER_TO_NM) > TRAFFICTOAIDIST) {
@ -736,7 +736,7 @@ void FGAIAircraft::ProcessFlightPlan( double dt, time_t now ) {
if (curr->crossat > -1000.0) {
//cerr << "5.1a" << endl;
use_perf_vs = false;
tgt_vs = (curr->crossat - altitude) / (fp->getDistanceToGo(pos.lat(), pos.lon(), curr)
tgt_vs = (curr->crossat - altitude) / (fp->getDistanceToGo(pos.getLatitudeDeg(), pos.getLongitudeDeg(), curr)
/ 6076.0 / speed*60.0);
//cerr << "5.1b" << endl;
tgt_altitude = curr->crossat;
@ -757,7 +757,7 @@ void FGAIAircraft::ProcessFlightPlan( double dt, time_t now ) {
//cout << " Target heading: " << tgt_heading << endl << endl;
} else {
double calc_bearing = fp->getBearing(pos.lat(), pos.lon(), curr);
double calc_bearing = fp->getBearing(pos.getLatitudeDeg(), pos.getLongitudeDeg(), curr);
//cerr << "Bearing = " << calc_bearing << endl;
if (speed < 0) {
calc_bearing +=180;
@ -774,7 +774,7 @@ void FGAIAircraft::ProcessFlightPlan( double dt, time_t now ) {
} else {
cerr << "calc_bearing is not a finite number : "
<< "Speed " << speed
<< "pos : " << pos.lat() << ", " << pos.lon()
<< "pos : " << pos.getLatitudeDeg() << ", " << pos.getLongitudeDeg()
<< "waypoint " << curr->latitude << ", " << curr->longitude << endl;
cerr << "waypoint name " << curr->name;
exit(1); // FIXME
@ -924,7 +924,7 @@ void FGAIAircraft::getGroundElev(double dt) {
//Point3D currView(vw->getLongitude_deg(),
// vw->getLatitude_deg(), 0.0);
SGWayPoint current (pos.lon(), pos.lat(), 0);
SGWayPoint current(pos.getLongitudeDeg(), pos.getLatitudeDeg(), 0);
SGWayPoint view (vw->getLongitude_deg(), vw->getLatitude_deg(), 0);
view.CourseAndDistance(current, &course, &distance);
if(distance > visibility_meters) {
@ -934,14 +934,14 @@ void FGAIAircraft::getGroundElev(double dt) {
// FIXME: make sure the pos.lat/pos.lon values are in degrees ...
double range = 500.0;
if (!globals->get_tile_mgr()->scenery_available(pos.lat(), pos.lon(), range)) {
if (!globals->get_tile_mgr()->scenery_available(pos.getLatitudeDeg(), pos.getLongitudeDeg(), range)) {
// Try to shedule tiles for that position.
globals->get_tile_mgr()->update( aip.getSGLocation(), range );
}
// FIXME: make sure the pos.lat/pos.lon values are in degrees ...
double alt;
if (globals->get_scenery()->get_elevation_m(pos.lat(), pos.lon(), 20000.0, alt, 0))
if (globals->get_scenery()->get_elevation_m(pos.getLatitudeDeg(), pos.getLongitudeDeg(), 20000.0, alt, 0))
tgt_altitude = alt * SG_METER_TO_FEET;
//cerr << "Target altitude : " << tgt_altitude << endl;

View file

@ -169,7 +169,7 @@ void FGAIBallistic::Run(double dt) {
// calculate vertical and horizontal speed components
vs = sin( pitch * SG_DEGREES_TO_RADIANS ) * speed;
hs = cos( pitch * SG_DEGREES_TO_RADIANS ) * speed;
double hs = cos( pitch * SG_DEGREES_TO_RADIANS ) * speed;
// convert horizontal speed (fps) to degrees per second
speed_north_deg_sec = cos(hdg / SG_RADIANS_TO_DEGREES) * hs / ft_per_deg_lat;
@ -186,15 +186,15 @@ void FGAIBallistic::Run(double dt) {
wind_speed_from_east_deg_sec = wind_from_east / ft_per_deg_lon;
// set new position
pos.setlat( pos.lat() + (speed_north_deg_sec - wind_speed_from_north_deg_sec) * dt );
pos.setlon( pos.lon() + (speed_east_deg_sec - wind_speed_from_east_deg_sec) * dt );
pos.setLatitudeDeg( pos.getLatitudeDeg() + (speed_north_deg_sec - wind_speed_from_north_deg_sec) * dt );
pos.setLongitudeDeg( pos.getLongitudeDeg() + (speed_east_deg_sec - wind_speed_from_east_deg_sec) * dt );
// adjust vertical speed for acceleration of gravity and buoyancy
vs -= (gravity - buoyancy) * dt;
// adjust altitude (feet)
altitude += vs * dt;
pos.setelev(altitude * SG_FEET_TO_METER);
pos.setElevationFt(altitude);
// recalculate pitch (velocity vector) if aerostabilized
// cout << "aero_stabilised " << aero_stabilised << endl ;

View file

@ -60,7 +60,6 @@ private:
double azimuth; // degrees true
double elevation; // degrees
double rotation; // degrees
double hs; // horizontal speed (fps)
bool aero_stabilised; // if true, object will align wit trajectory
double drag_area; // equivalent drag area in ft2
double life_timer; // seconds

View file

@ -106,13 +106,13 @@ void FGAIBase::update(double dt) {
if (_otype == otBallistic)
CalculateMach();
ft_per_deg_lat = 366468.96 - 3717.12 * cos(pos.lat()*SGD_DEGREES_TO_RADIANS);
ft_per_deg_lon = 365228.16 * cos(pos.lat()*SGD_DEGREES_TO_RADIANS);
ft_per_deg_lat = 366468.96 - 3717.12 * cos(pos.getLatitudeRad());
ft_per_deg_lon = 365228.16 * cos(pos.getLatitudeRad());
}
void FGAIBase::Transform() {
if (!invisible) {
aip.setPosition(pos.lon(), pos.lat(), pos.elev() * SG_METER_TO_FEET);
aip.setPosition(pos);
if (no_roll) {
aip.setOrientation(0.0, pitch, hdg);
} else {
@ -260,8 +260,8 @@ double FGAIBase::UpdateRadar(FGAIManager* manager)
double user_latitude = manager->get_user_latitude();
double user_longitude = manager->get_user_longitude();
double lat_range = fabs(pos.lat() - user_latitude) * ft_per_deg_lat;
double lon_range = fabs(pos.lon() - user_longitude) * ft_per_deg_lon;
double lat_range = fabs(pos.getLatitudeDeg() - user_latitude) * ft_per_deg_lat;
double lon_range = fabs(pos.getLongitudeDeg() - user_longitude) * ft_per_deg_lon;
double range_ft2 = lat_range*lat_range + lon_range*lon_range;
//
@ -284,16 +284,16 @@ double FGAIBase::UpdateRadar(FGAIManager* manager)
range = range_ft / 6076.11549;
// calculate bearing to target
if (pos.lat() >= user_latitude) {
if (pos.getLatitudeDeg() >= user_latitude) {
bearing = atan2(lat_range, lon_range) * SG_RADIANS_TO_DEGREES;
if (pos.lon() >= user_longitude) {
if (pos.getLongitudeDeg() >= user_longitude) {
bearing = 90.0 - bearing;
} else {
bearing = 270.0 + bearing;
}
} else {
bearing = atan2(lon_range, lat_range) * SG_RADIANS_TO_DEGREES;
if (pos.lon() >= user_longitude) {
if (pos.getLongitudeDeg() >= user_longitude) {
bearing = 180.0 - bearing;
} else {
bearing = 180.0 + bearing;
@ -341,7 +341,8 @@ SGVec3d
FGAIBase::getCartPosAt(const SGVec3d& _off) const
{
// Transform that one to the horizontal local coordinate system.
SGQuatd hlTrans = SGQuatd::fromLonLatDeg(pos.lon(), pos.lat());
SGQuatd hlTrans = SGQuatd::fromLonLat(pos);
// and postrotate the orientation of the AIModel wrt the horizontal
// local frame
hlTrans *= SGQuatd::fromYawPitchRollDeg(hdg, pitch, roll);
@ -351,7 +352,7 @@ FGAIBase::getCartPosAt(const SGVec3d& _off) const
SGVec3d off = hlTrans.backTransform(_off);
// Add the position offset of the AIModel to gain the earth centered position
SGVec3d cartPos = SGGeod::fromDegFt(pos.lon(), pos.lat(), pos.elev());
SGVec3d cartPos = SGVec3d::fromGeod(pos);
return cartPos + off;
}
@ -360,17 +361,17 @@ FGAIBase::getCartPosAt(const SGVec3d& _off) const
* getters and Setters
*/
void FGAIBase::_setLongitude( double longitude ) {
pos.setlon(longitude);
pos.setLongitudeDeg(longitude);
}
void FGAIBase::_setLatitude ( double latitude ) {
pos.setlat(latitude);
pos.setLatitudeDeg(latitude);
}
double FGAIBase::_getLongitude() const {
return pos.lon();
return pos.getLongitudeDeg();
}
double FGAIBase::_getLatitude () const {
return pos.lat();
return pos.getLatitudeDeg();
}
double FGAIBase::_getRdot() const {
return rdot;

View file

@ -48,7 +48,6 @@ public:
FGAIBase(object_type ot);
virtual ~FGAIBase();
inline const Point3D& GetPos() const { return(pos); }
virtual void readFromScenario(SGPropertyNode* scFileNode);
@ -84,7 +83,7 @@ protected:
FGAIManager* manager;
// these describe the model's actual state
Point3D pos; // WGS84 lat & lon in degrees, elev above sea-level in meters
SGGeod pos; // WGS84 lat & lon in degrees, elev above sea-level in meters
double hdg; // True heading in degrees
double roll; // degrees, left is negative
double pitch; // degrees, nose-down is negative
@ -205,7 +204,7 @@ inline void FGAIBase::setHeading( double heading ) {
inline void FGAIBase::setAltitude( double altitude_ft ) {
altitude = tgt_altitude = altitude_ft;
pos.setelev(altitude * SG_FEET_TO_METER);
pos.setElevationFt(altitude);
}
inline void FGAIBase::setBank( double bank ) {
@ -218,10 +217,10 @@ inline void FGAIBase::setPitch( double newpitch ) {
}
inline void FGAIBase::setLongitude( double longitude ) {
pos.setlon( longitude );
pos.setLongitudeDeg( longitude );
}
inline void FGAIBase::setLatitude ( double latitude ) {
pos.setlat( latitude );
pos.setLatitudeDeg( latitude );
}
inline void FGAIBase::setDie( bool die ) { delete_me = die; }

View file

@ -152,14 +152,14 @@ void FGAICarrier::update(double dt) {
// but by just apply discrete changes at its velocity variables.
// Update the velocity information stored in those nodes.
// Transform that one to the horizontal local coordinate system.
SGQuatd ec2hl = SGQuatd::fromLonLatDeg(pos.lon(), pos.lat());
SGQuatd ec2hl = SGQuatd::fromLonLat(pos);
// The orientation of the carrier wrt the horizontal local frame
SGQuatd hl2body = SGQuatd::fromYawPitchRollDeg(hdg, pitch, roll);
// and postrotate the orientation of the AIModel wrt the horizontal
// local frame
SGQuatd ec2body = ec2hl*hl2body;
// The cartesian position of the carrier in the wgs84 world
SGVec3d cartPos = SGGeod::fromDegFt(pos.lon(), pos.lat(), pos.elev());
SGVec3d cartPos = SGVec3d::fromGeod(pos);
// Store for later use by the groundcache
rot_pivot_wrt_earth = cartPos;
@ -189,7 +189,7 @@ void FGAICarrier::update(double dt) {
// Now here is the finite difference ...
// Transform that one to the horizontal local coordinate system.
SGQuatd ec2hlNew = SGQuatd::fromLonLatDeg(pos.lon(), pos.lat());
SGQuatd ec2hlNew = SGQuatd::fromLonLat(pos);
// compute the new orientation
SGQuatd hl2bodyNew = SGQuatd::fromYawPitchRollDeg(hdg, pitch, roll);
// The rotation difference
@ -287,7 +287,7 @@ bool FGAICarrier::init() {
turn_to_launch_hdg = false;
returning = false;
initialpos = pos;
mOpBoxPos = pos;
base_course = hdg;
base_speed = speed;
@ -322,9 +322,9 @@ void FGAICarrier::bind() {
props->tie("controls/base-speed-kts",
SGRawValuePointer<double>(&base_speed));
props->tie("controls/start-pos-lat-deg",
SGRawValuePointer<double>(&initialpos[1]));
SGRawValueMethods<SGGeod,double>(pos, &SGGeod::getLatitudeDeg));
props->tie("controls/start-pos-long-deg",
SGRawValuePointer<double>(&initialpos[0]));
SGRawValueMethods<SGGeod,double>(pos, &SGGeod::getLongitudeDeg));
props->tie("velocities/speed-kts",
SGRawValuePointer<double>(&speed));
props->tie("environment/surface-wind-speed-true-kts",
@ -402,7 +402,7 @@ bool FGAICarrier::getParkPosition(const string& id, SGGeod& geodPos,
if ((*it).name == id || id.empty()) {
ParkPosition ppos = *it;
SGVec3d cartPos = getCartPosAt(ppos.offset);
geodPos = cartPos;
geodPos = SGGeod::fromCart(cartPos);
hdng = hdg + ppos.heading_deg;
double shdng = sin(ppos.heading_deg * SGD_DEGREES_TO_RADIANS);
double chdng = cos(ppos.heading_deg * SGD_DEGREES_TO_RADIANS);
@ -579,14 +579,14 @@ bool FGAICarrier::mark_cat(ssgEntity* e, const list<string>& cat_objects, bool m
// care for transforms ...
short v[2];
l->getLine(0, v, v+1 );
sgVec3 ends[2];
SGVec3f ends[2];
for (int k=0; k<2; ++k)
sgCopyVec3( ends[k], l->getVertex( v[k] ) );
sgCopyVec3( ends[k].sg(), l->getVertex( v[k] ) );
// When the 1 end is behind the 0 end, swap the coordinates.
if (ends[0][0] < ends[1][0]) {
sgCopyVec3( l->getVertex( v[0] ), ends[1] );
sgCopyVec3( l->getVertex( v[1] ), ends[0] );
sgCopyVec3( l->getVertex( v[0] ), ends[1].sg() );
sgCopyVec3( l->getVertex( v[1] ), ends[0].sg() );
}
found = true;
}
@ -685,18 +685,8 @@ void FGAICarrier::TurnToBase(){
void FGAICarrier::ReturnToBox(){
double course, distance, az2;
//get the carrier position
carrierpos = pos;
//cout << "lat: " << carrierpos[1] << " lon: " << carrierpos[0] << endl;
//calculate the bearing and range of the initial position from the carrier
geo_inverse_wgs_84(carrierpos[2],
carrierpos[1],
carrierpos[0],
initialpos[1],
initialpos[0],
&course, &az2, &distance);
geo_inverse_wgs_84(pos, mOpBoxPos, &course, &az2, &distance);
distance *= SG_METER_TO_NM;
@ -720,33 +710,33 @@ bool FGAICarrier::OutsideBox() { //returns true if the carrier is outside operat
return false;
}
if (initialpos[1] >= 0) { //northern hemisphere
if (pos[1] >= initialpos[1] + max_lat)
if (mOpBoxPos.getLatitudeDeg() >= 0) { //northern hemisphere
if (pos.getLatitudeDeg() >= mOpBoxPos.getLatitudeDeg() + max_lat)
return true;
if (pos[1] <= initialpos[1] - min_lat)
if (pos.getLatitudeDeg() <= mOpBoxPos.getLatitudeDeg() - min_lat)
return true;
} else { //southern hemisphere
if (pos[1] <= initialpos[1] - max_lat)
if (pos.getLatitudeDeg() <= mOpBoxPos.getLatitudeDeg() - max_lat)
return true;
if (pos[1] >= initialpos[1] + min_lat)
if (pos.getLatitudeDeg() >= mOpBoxPos.getLatitudeDeg() + min_lat)
return true;
}
if (initialpos[0] >=0) { //eastern hemisphere
if (pos[0] >= initialpos[0] + max_long)
if (mOpBoxPos.getLongitudeDeg() >=0) { //eastern hemisphere
if (pos.getLongitudeDeg() >= mOpBoxPos.getLongitudeDeg() + max_long)
return true;
if (pos[0] <= initialpos[0] - min_long)
if (pos.getLongitudeDeg() <= mOpBoxPos.getLongitudeDeg() - min_long)
return true;
} else { //western hemisphere
if (pos[0] <= initialpos[0] - max_long)
if (pos.getLongitudeDeg() <= mOpBoxPos.getLongitudeDeg() - max_long)
return true;
if (pos[0] >= initialpos[0] + min_long)
if (pos.getLongitudeDeg() >= mOpBoxPos.getLongitudeDeg() + min_long)
return true;
}

View file

@ -155,8 +155,7 @@ private:
bool wave_off_lights;
// these are for maneuvering the carrier
Point3D carrierpos;
Point3D initialpos;
SGGeod mOpBoxPos;
double wind_speed_from_north_kts ;
double wind_speed_from_east_kts ;

View file

@ -291,15 +291,12 @@ void FGAIMultiplayer::update(double dt)
}
// extract the position
SGGeod geod = ecPos;
pos.setlat(geod.getLatitudeDeg());
pos.setlon(geod.getLongitudeDeg());
pos.setelev(geod.getElevationM());
pos = SGGeod::fromCart(ecPos);
// The quaternion rotating from the earth centered frame to the
// horizontal local frame
SGQuatf qEc2Hl = SGQuatf::fromLonLatRad((float)geod.getLongitudeRad(),
(float)geod.getLatitudeRad());
SGQuatf qEc2Hl = SGQuatf::fromLonLatRad((float)pos.getLongitudeRad(),
(float)pos.getLatitudeRad());
// The orientation wrt the horizontal local frame
SGQuatf hlOr = conj(qEc2Hl)*ecOrient;
float hDeg, pDeg, rDeg;
@ -309,7 +306,7 @@ void FGAIMultiplayer::update(double dt)
pitch = pDeg;
SG_LOG(SG_GENERAL, SG_DEBUG, "Multiplayer position and orientation: "
<< geod << ", " << hlOr);
<< ecPos << ", " << hlOr);
//###########################//
// do calculations for radar //

View file

@ -135,8 +135,8 @@ void FGAIShip::Run(double dt) {
* speed * 1.686 / ft_per_deg_lon;
// set new position
pos.setlat( pos.lat() + speed_north_deg_sec * dt);
pos.setlon( pos.lon() + speed_east_deg_sec * dt);
pos.setLatitudeDeg( pos.getLatitudeDeg() + speed_north_deg_sec * dt);
pos.setLongitudeDeg( pos.getLongitudeDeg() + speed_east_deg_sec * dt);
// adjust heading based on current rudder angle

View file

@ -106,8 +106,8 @@ void FGAIStorm::Run(double dt) {
* speed * 1.686 / ft_per_deg_lon;
// set new position
pos.setlat( pos.lat() + speed_north_deg_sec * dt);
pos.setlon( pos.lon() + speed_east_deg_sec * dt);
pos.setLatitudeDeg( pos.getLatitudeDeg() + speed_north_deg_sec * dt);
pos.setLongitudeDeg( pos.getLongitudeDeg() + speed_east_deg_sec * dt);
// do calculations for weather radar display
UpdateRadar(manager);
@ -159,8 +159,8 @@ void FGAIStorm::Run(double dt) {
double user_altitude = manager->get_user_altitude();
// calculate range to target in feet and nautical miles
double lat_range = fabs(pos.lat() - user_latitude) * ft_per_deg_lat;
double lon_range = fabs(pos.lon() - user_longitude) * ft_per_deg_lon;
double lat_range = fabs(pos.getLatitudeDeg() - user_latitude) * ft_per_deg_lat;
double lon_range = fabs(pos.getLongitudeDeg() - user_longitude) * ft_per_deg_lon;
double range_ft = sqrt(lat_range*lat_range + lon_range*lon_range);
range = range_ft / 6076.11549;

View file

@ -88,8 +88,8 @@ void FGAIThermal::Run(double dt) {
double user_altitude = manager->get_user_altitude();
// calculate range to target in feet and nautical miles
double lat_range = fabs(pos.lat() - user_latitude) * ft_per_deg_lat;
double lon_range = fabs(pos.lon() - user_longitude) * ft_per_deg_lon;
double lat_range = fabs(pos.getLatitudeDeg() - user_latitude) * ft_per_deg_lat;
double lon_range = fabs(pos.getLongitudeDeg() - user_longitude) * ft_per_deg_lon;
double range_ft = sqrt(lat_range*lat_range + lon_range*lon_range);
range = range_ft / 6076.11549;

View file

@ -23,6 +23,7 @@
# include <config.h>
#endif
#include <simgear/math/SGMath.hxx>
#include <simgear/math/sg_geodesy.hxx>
#include <Main/fg_props.hxx>
@ -78,9 +79,7 @@ void FGACMS::update( double dt ) {
double acc_down = _acc_down->getDoubleValue();
_set_Accels_Local( acc_lon, acc_lat, acc_down );
sgVec3 accel_ned;
sgSetVec3(accel_ned, acc_lon, acc_lat, acc_down);
double accel = sgLengthVec3 (accel_ned) * SG_FEET_TO_METER;
double accel = norm(SGVec3d(acc_lon, acc_lat, acc_down)) * SG_FEET_TO_METER;
double velocity = (_speed->getDoubleValue() * SG_KT_TO_MPS) + accel * dt;
double dist = cos (pitch) * velocity * dt;
@ -89,16 +88,15 @@ void FGACMS::update( double dt ) {
_set_V_calibrated_kts( kts );
_set_V_ground_speed( kts );
SGGeod pos = SGGeod::fromDegM(get_Longitude(), get_Latitude(), get_Altitude());
// update (lon/lat) position
double lat2, lon2, az2;
geo_direct_wgs_84 ( get_Altitude(),
get_Latitude() * SGD_RADIANS_TO_DEGREES,
get_Longitude() * SGD_RADIANS_TO_DEGREES,
heading * SGD_RADIANS_TO_DEGREES,
dist, &lat2, &lon2, &az2 );
SGGeod pos2;
double az2;
geo_direct_wgs_84 ( pos, heading * SGD_RADIANS_TO_DEGREES,
dist, pos2, &az2 );
_set_Longitude( lon2 * SGD_DEGREES_TO_RADIANS );
_set_Latitude( lat2 * SGD_DEGREES_TO_RADIANS );
_set_Longitude( pos2.getLongitudeRad() );
_set_Latitude( pos2.getLatitudeRad() );
double sl_radius, lat_geoc;
sgGeodToGeoc( get_Latitude(), get_Altitude(), &sl_radius, &lat_geoc );

View file

@ -156,7 +156,7 @@ bool FGMultiplay::process() {
// first the aprioriate structure for the geodetic one
SGGeod geod = SGGeod::fromRadFt(lon, lat, ifce->get_Altitude());
// Convert to cartesion coordinate
motionInfo.position = geod;
motionInfo.position = SGVec3d::fromGeod(geod);
// The quaternion rotating from the earth centered frame to the
// horizontal local frame