]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/UFO.cxx
- Added ultra-light traffic is now a separate traffic class that can have its
[flightgear.git] / src / FDM / UFO.cxx
index f6b26f58d3b146f43dc86a487c155b93f68a8579..c741505de07102851d4d4ef73279fddb0ca89bd5 100644 (file)
@@ -17,7 +17,7 @@
 //
 // 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //
 
 
@@ -29,7 +29,7 @@
 #include <simgear/math/point3d.hxx>
 #include <simgear/math/polar3d.hxx>
 
-#include <Controls/controls.hxx>
+#include <Aircraft/controls.hxx>
 #include <Main/globals.hxx>
 #include <Main/fg_props.hxx>
 
 const double throttle_damp = 0.2;
 const double aileron_damp = 0.05;
 const double elevator_damp = 0.05;
+const double elevator_trim_damp = 0.05;
 const double rudder_damp = 0.4;
 
 FGUFO::FGUFO( double dt )
   : Throttle(0.0),
     Aileron(0.0),
     Elevator(0.0),
-    Rudder(0.0)
+    Elevator_Trim(0.0),
+    Rudder(0.0),
+    Speed_Max(fgGetNode("/engines/engine/speed-max-mps", true))
 {
 //     set_delta_t( dt );
 }
@@ -58,6 +61,8 @@ FGUFO::~FGUFO() {
 // for each subsequent iteration through the EOM
 void FGUFO::init() {
     common_init();
+    if (Speed_Max->getDoubleValue() < 0.01)
+        Speed_Max->setDoubleValue(2000.0);
 }
 
 
@@ -72,8 +77,8 @@ void FGUFO::update( double dt ) {
 
     // read the throttle
     double th = globals->get_controls()->get_throttle( 0 );
-    if ( globals->get_controls()->get_brake_left() > 0.
-         || globals->get_controls()->get_brake_right() > 0.0 )
+    if ( globals->get_controls()->get_brake_left() > 0.5
+         || globals->get_controls()->get_brake_right() > 0.5 )
     {
         th = -th;
     }
@@ -84,15 +89,18 @@ void FGUFO::update( double dt ) {
                + Aileron * (1 - aileron_damp);
     Elevator = globals->get_controls()->get_elevator() * elevator_damp
                + Elevator * (1 - elevator_damp);
+    Elevator_Trim = globals->get_controls()->get_elevator_trim()
+                    * elevator_trim_damp
+                    + Elevator_Trim * (1 - elevator_trim_damp);
     Rudder = globals->get_controls()->get_rudder() * rudder_damp
                + Rudder * (1 - rudder_damp);
 
     // the velocity of the aircraft
-    double velocity = Throttle * 2000; // meters/sec
+    double velocity = Throttle * Speed_Max->getDoubleValue(); // meters/sec
 
     double old_pitch = get_Theta();
     double pitch_rate = SGD_PI_4; // assume I will be pitching up
-    double target_pitch = -Elevator * SGD_PI_2;
+    double target_pitch = (-Elevator - Elevator_Trim) * SGD_PI_2;
 
     // if I am pitching down
     if (old_pitch > target_pitch)
@@ -187,8 +195,8 @@ void FGUFO::update( double dt ) {
     sgGeodToGeoc( get_Latitude(), get_Altitude(), &sl_radius, &lat_geoc );
 
     // update euler angles
-    _set_Euler_Angles( roll, pitch,
-                       fmod(get_Psi() + turn + yaw, SGD_2PI) );
+    double heading = fmod(get_Psi() + turn + yaw, SGD_2PI);
+    _set_Euler_Angles(roll, pitch, heading);
     _set_Euler_Rates(0,0,0);
 
     _set_Geocentric_Position( lat_geoc, get_Longitude(), 
@@ -198,4 +206,9 @@ void FGUFO::update( double dt ) {
     _update_ground_elev_at_pos();
     _set_Sea_level_radius( sl_radius * SG_METER_TO_FEET);
     _set_Altitude( get_Altitude() + climb );
+    _set_Altitude_AGL( get_Altitude() - get_Runway_altitude() );
+
+    set_V_north(cos(heading) * velocity * SG_METER_TO_FEET);
+    set_V_east(sin(heading) * velocity * SG_METER_TO_FEET);
+    set_V_down(-real_climb_rate);
 }