From 800b484493c726bc362bbe9a61bd0f5c89ddf278 Mon Sep 17 00:00:00 2001 From: curt Date: Sun, 6 Dec 1998 14:52:54 +0000 Subject: [PATCH] Fixed a problem with the initial starting altitude. "v->abs_view_pos" wasn't being calculated correctly at the beginning causing the first terrain intersection to fail, returning a ground altitude of zero, causing the plane to free fall for one frame, until the ground altitude was corrected, but now being under the ground we got a big bounce and the plane always ended up upside down. --- Main/GLUTmain.cxx | 16 ++++++++++++---- Main/fg_init.cxx | 35 +++++++++++++++++++++++++++++------ Main/options.cxx | 17 +++++++++++++++-- 3 files changed, 56 insertions(+), 12 deletions(-) diff --git a/Main/GLUTmain.cxx b/Main/GLUTmain.cxx index 017bb9bf2..9ad1a0c48 100644 --- a/Main/GLUTmain.cxx +++ b/Main/GLUTmain.cxx @@ -474,10 +474,10 @@ static void fgMainLoop( void ) { // Fix elevation. I'm just sticking this here for now, it should // probably move eventually - printf("Before - ground = %.2f runway = %.2f alt = %.2f\n", + /* printf("Before - ground = %.2f runway = %.2f alt = %.2f\n", scenery.cur_elev, f->get_Runway_altitude() * FEET_TO_METER, - f->get_Altitude() * FEET_TO_METER); + f->get_Altitude() * FEET_TO_METER); */ if ( scenery.cur_elev > -9990 ) { if ( f->get_Altitude() * FEET_TO_METER < @@ -498,10 +498,10 @@ static void fgMainLoop( void ) { f->set_Runway_altitude( scenery.cur_elev * METER_TO_FEET ); } - printf("Adjustment - ground = %.2f runway = %.2f alt = %.2f\n", + /* printf("Adjustment - ground = %.2f runway = %.2f alt = %.2f\n", scenery.cur_elev, f->get_Runway_altitude() * FEET_TO_METER, - f->get_Altitude() * FEET_TO_METER); + f->get_Altitude() * FEET_TO_METER); */ // update "time" fgTimeUpdate(f, t); @@ -1012,6 +1012,14 @@ int main( int argc, char **argv ) { // $Log$ +// Revision 1.74 1998/12/06 14:52:54 curt +// Fixed a problem with the initial starting altitude. "v->abs_view_pos" wasn't +// being calculated correctly at the beginning causing the first terrain +// intersection to fail, returning a ground altitude of zero, causing the plane +// to free fall for one frame, until the ground altitude was corrected, but now +// being under the ground we got a big bounce and the plane always ended up +// upside down. +// // Revision 1.73 1998/12/06 13:51:22 curt // Turned "struct fgWEATHER" into "class FGWeather". // diff --git a/Main/fg_init.cxx b/Main/fg_init.cxx index a767e7a23..093b7585b 100644 --- a/Main/fg_init.cxx +++ b/Main/fg_init.cxx @@ -158,7 +158,7 @@ int fgInitSubsystems( void ) fgLIGHT *l; fgTIME *t; fgVIEW *v; - Point3D geod_pos, abs_view_pos; + Point3D geod_pos, tmp_abs_view_pos; l = &cur_light_params; t = &cur_time_params; @@ -195,21 +195,23 @@ int fgInitSubsystems( void ) } // Calculate ground elevation at starting point (we didn't have - // abs_view_pos calculated when fgTileMgrUpdate() was called above + // tmp_abs_view_pos calculated when fgTileMgrUpdate() was called above // calculalate a cartesian point somewhere along the line between // the center of the earth and our view position. Doesn't have to // be the exact elevation (this is good because we don't know it // yet :-) geod_pos = Point3D( f->get_Longitude(), f->get_Latitude(), 0.0); - abs_view_pos = fgGeodToCart(geod_pos); + tmp_abs_view_pos = fgGeodToCart(geod_pos); FG_LOG( FG_GENERAL, FG_DEBUG, "Altitude before update " << scenery.cur_elev ); + FG_LOG( FG_GENERAL, FG_DEBUG, + "Initial abs_view_pos = " << tmp_abs_view_pos ); scenery.cur_elev = fgTileMgrCurElevOLD( f->get_Longitude(), f->get_Latitude(), - abs_view_pos ); + tmp_abs_view_pos ); FG_LOG( FG_GENERAL, FG_DEBUG, "Altitude after update " << scenery.cur_elev ); f->set_Runway_altitude( scenery.cur_elev * METER_TO_FEET ); @@ -224,8 +226,21 @@ int fgInitSubsystems( void ) << (f->get_Latitude() * RAD_TO_DEG) << ", " << (f->get_Longitude() * RAD_TO_DEG) << ", " << (f->get_Altitude() * FEET_TO_METER) << ")" ); - // end of thing that I just stuck in that I should probably move - + + // We need to calculate a few more values here that would normally + // be calculated by the FDM so that the v->UpdateViewMath() + // routine doesn't get hosed. + + double sea_level_radius_meters; + double lat_geoc; + // Set the FG variables first + fgGeodToGeoc( f->get_Latitude(), f->get_Altitude(), + &sea_level_radius_meters, &lat_geoc); + f->set_Geocentric_Position( lat_geoc, f->get_Longitude(), + f->get_Altitude() + + (sea_level_radius_meters * METER_TO_FEET) ); + f->set_Sea_level_radius( sea_level_radius_meters * METER_TO_FEET ); + // The following section sets up the flight model EOM parameters // and should really be read in from one or more files. @@ -370,6 +385,14 @@ int fgInitSubsystems( void ) // $Log$ +// Revision 1.57 1998/12/06 14:52:56 curt +// Fixed a problem with the initial starting altitude. "v->abs_view_pos" wasn't +// being calculated correctly at the beginning causing the first terrain +// intersection to fail, returning a ground altitude of zero, causing the plane +// to free fall for one frame, until the ground altitude was corrected, but now +// being under the ground we got a big bounce and the plane always ended up +// upside down. +// // Revision 1.56 1998/12/06 13:51:23 curt // Turned "struct fgWEATHER" into "class FGWeather". // diff --git a/Main/options.cxx b/Main/options.cxx index b9e7b79fd..98f09e59f 100644 --- a/Main/options.cxx +++ b/Main/options.cxx @@ -414,7 +414,11 @@ int fgOPTIONS::parse_option( const string& arg ) { } else if ( arg.find( "--lat=" ) != string::npos ) { lat = parse_degree( arg.substr(6) ); } else if ( arg.find( "--altitude=" ) != string::npos ) { - altitude = atof( arg.substr(11) ); + if ( units == FG_UNITS_FEET ) { + altitude = atof( arg.substr(11) ) * FEET_TO_METER; + } else { + altitude = atof( arg.substr(11) ); + } } else if ( arg.find( "--heading=" ) != string::npos ) { heading = atof( arg.substr(10) ); } else if ( arg.find( "--roll=" ) != string::npos ) { @@ -579,7 +583,8 @@ void fgOPTIONS::usage ( void ) { printf("\t--airport-id=ABCD: specify starting postion by airport id\n"); printf("\t--lon=degrees: starting longitude in degrees (west = -)\n"); printf("\t--lat=degrees: starting latitude in degrees (south = -)\n"); - printf("\t--altitude=meters: starting altitude in meters\n"); + printf("\t--altitude=feet: starting altitude in feet\n"); + printf("\t\t(unless --units-meters specified\n"); printf("\t--heading=degrees: heading (yaw) angle in degress (Psi)\n"); printf("\t--roll=degrees: roll angle in degrees (Phi)\n"); printf("\t--pitch=degrees: pitch angle in degrees (Theta)\n"); @@ -624,6 +629,14 @@ fgOPTIONS::~fgOPTIONS( void ) { // $Log$ +// Revision 1.35 1998/12/06 14:52:57 curt +// Fixed a problem with the initial starting altitude. "v->abs_view_pos" wasn't +// being calculated correctly at the beginning causing the first terrain +// intersection to fail, returning a ground altitude of zero, causing the plane +// to free fall for one frame, until the ground altitude was corrected, but now +// being under the ground we got a big bounce and the plane always ended up +// upside down. +// // Revision 1.34 1998/12/05 15:54:22 curt // Renamed class fgFLIGHT to class FGState as per request by JSB. // -- 2.39.5