From 28f50df1d559011850af8515284c7a75bea8877c Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 13 Dec 2004 23:48:43 +0000 Subject: [PATCH] Support for a new "contra" attribute on propellers, which properly models them as contra-rotating pairs. --- src/FDM/YASim/FGFDM.cpp | 3 +++ src/FDM/YASim/PropEngine.cpp | 13 +++++++++---- src/FDM/YASim/PropEngine.hpp | 2 ++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/FDM/YASim/FGFDM.cpp b/src/FDM/YASim/FGFDM.cpp index 332ebd638..e1fbc47b6 100644 --- a/src/FDM/YASim/FGFDM.cpp +++ b/src/FDM/YASim/FGFDM.cpp @@ -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(); } diff --git a/src/FDM/YASim/PropEngine.cpp b/src/FDM/YASim/PropEngine.cpp index 74c29f317..c9c590a9b 100644 --- a/src/FDM/YASim/PropEngine.cpp +++ b/src/FDM/YASim/PropEngine.cpp @@ -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 diff --git a/src/FDM/YASim/PropEngine.hpp b/src/FDM/YASim/PropEngine.hpp index 2e9e7c3c6..7b4325470 100644 --- a/src/FDM/YASim/PropEngine.hpp +++ b/src/FDM/YASim/PropEngine.hpp @@ -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 -- 2.39.5