]> git.mxchange.org Git - flightgear.git/commitdiff
Support for a new "contra" attribute on propellers, which properly
authorandy <andy>
Mon, 13 Dec 2004 23:48:43 +0000 (23:48 +0000)
committerandy <andy>
Mon, 13 Dec 2004 23:48:43 +0000 (23:48 +0000)
models them as contra-rotating pairs.

src/FDM/YASim/FGFDM.cpp
src/FDM/YASim/PropEngine.cpp
src/FDM/YASim/PropEngine.hpp

index 332ebd6383f16995f4e17950a3c32e36d073f1d1..e1fbc47b689752d7149b00a22694896b071e60b5 100644 (file)
@@ -717,6 +717,9 @@ void FGFDM::parsePropeller(XMLAttributes* a)
        thruster->setVariableProp(min, max);
     }
 
+    if(attrb(a, "contra"))
+        thruster->setContraPair(true);
+
     if(a->hasAttribute("manual-pitch")) {
        prop->setManualPitch();
     }
index 74c29f317bda064cfc4eba408e8117abea680d02..c9c590a9b4abb4485d2a55c94d5af7d190a8b915 100644 (file)
@@ -17,6 +17,7 @@ PropEngine::PropEngine(Propeller* prop, Engine* eng, float moment)
     _eng = eng;
     _moment = moment;
     _fuel = true;
+    _contra = false;
 }
 
 PropEngine::~PropEngine()
@@ -192,16 +193,20 @@ void PropEngine::integrate(float dt)
         _omega = 0 - _omega;    // don't allow negative RPM
                                 // FIXME: introduce proper windmilling
 
-    // Store the total angular momentum into _gyro
-    Math::mul3(_omega*momt, _dir, _gyro);
+    // Store the total angular momentum into _gyro, unless the
+    // propeller is a counter-rotating pair (which has zero net
+    // angular momentum, even though it *does* have an MoI for
+    // acceleration purposes).
+    Math::mul3(_contra ? 0 : _omega*momt, _dir, _gyro);
 
     // Accumulate the engine torque, it acts on the body as a whole.
     // (Note: engine torque, not propeller torque.  They can be
     // different, but the difference goes to accelerating the
     // rotation.  It is the engine torque that is felt at the shaft
-    // and works on the body.)
+    // and works on the body.) (Note 2: contra-rotating propellers do
+    // not exert net torque on the aircraft).
     float tau = _moment < 0 ? engTorque : -engTorque;
-    Math::mul3(tau, _dir, _torque);
+    Math::mul3(_contra ? 0 : tau, _dir, _torque);
 
     // Iterate the propeller governor, if we have one.  Since engine
     // torque is basically constant with RPM, we want to make the
index 2e9e7c3c654acdb282d95cb2f2a1cccc462cb015..7b43254707a5a6dcbfdd4d442a270964bab37a68 100644 (file)
@@ -21,6 +21,7 @@ public:
     void setVariableProp(float min, float max);
     void setPropFeather(int state);
     void setGearRatio(float ratio) { _gearRatio = ratio; }
+    void setContraPair(bool contra) { _contra = contra; }
 
     virtual PropEngine* getPropEngine() { return this; }
     virtual Engine* getEngine() { return _eng; }
@@ -48,6 +49,7 @@ private:
     Engine* _eng;
 
     bool _variable;
+    bool _contra; // contra-rotating propeller pair
     int _magnetos;  // 0=off, 1=right, 2=left, 3=both
     float _gearRatio;
     float _advance; // control input, 0-1