1
0
Fork 0

Vivian Meazza:

The calculation of submodel mass from weight has been moved from AIBallistic
to Submodel so that it is calculated only once, rather than on every
iteration as a present. The parameter <contents> has been added, primarily
so that droptanks will have the proper mass. It is the path to an
appropriate property containing a weight in lbs.

Care has to be taken with the use of <contents> because after a reset there
appears to be a delay in submodel instantiation (dt not properly reset???)
and the weight property is not always picked up before it is set to zero in
the key bindings. Slightly hard to explain. It works fine if FGFS has not
been reset though. There is a partial solution which involves the rejigging
of the fuel and gui nasal scripts, but there is still the visible delay in
instantiation to be resolved. I've nearly done the nasal fixes, which will
form part of an update to the Hunter only. I'll probably complete those
later today.
This commit is contained in:
ehofman 2004-09-27 14:24:20 +00:00
parent 06bead966b
commit 328053fe23
7 changed files with 38 additions and 20 deletions

View file

@ -116,8 +116,8 @@ void FGAIBallistic::setCd(double c) {
Cd = c; Cd = c;
} }
void FGAIBallistic::setWeight(double w) { void FGAIBallistic::setMass(double m) {
weight = w; mass = m;
} }
void FGAIBallistic::Run(double dt) { void FGAIBallistic::Run(double dt) {
@ -129,14 +129,10 @@ void FGAIBallistic::Run(double dt) {
double speed_east_deg_sec; double speed_east_deg_sec;
double wind_speed_from_north_deg_sec; double wind_speed_from_north_deg_sec;
double wind_speed_from_east_deg_sec; double wind_speed_from_east_deg_sec;
double mass;
// the drag calculations below assume sea-level density,
// rho = 0.023780 slugs/ft3
// calculate mass
mass = weight * lbs_to_slugs;
// drag = Cd * 0.5 * rho * speed * speed * drag_area; // drag = Cd * 0.5 * rho * speed * speed * drag_area;
// rho is adjusted for altitude in void FGAIBase::update,
// using Standard Atmosphere (sealevel temperature 15C)
// acceleration = drag/mass; // acceleration = drag/mass;
// adjust speed by drag // adjust speed by drag
speed -= (Cd * 0.5 * rho * speed * speed * drag_area/mass) * dt; speed -= (Cd * 0.5 * rho * speed * speed * drag_area/mass) * dt;
@ -189,3 +185,4 @@ double FGAIBallistic::_getTime() const {
} }
// end AIBallistic // end AIBallistic

View file

@ -1,4 +1,4 @@
// FGAIBallistic - AIBase derived class creates an AI ballistic object // FGAIBallistic.hxx - AIBase derived class creates an AI ballistic object
// //
// Written by David Culp, started November 2003. // Written by David Culp, started November 2003.
// - davidculp2@comcast.net // - davidculp2@comcast.net
@ -47,7 +47,7 @@ public:
void setWind_from_north( double fps ); void setWind_from_north( double fps );
void setWind( bool val ); void setWind( bool val );
void setCd( double c ); void setCd( double c );
void setWeight( double w ); void setMass( double m );
double _getTime() const; double _getTime() const;
@ -66,9 +66,10 @@ private:
double wind_from_north; // fps double wind_from_north; // fps
bool wind; // if true, local wind will be applied to object bool wind; // if true, local wind will be applied to object
double Cd; // drag coefficient double Cd; // drag coefficient
double weight; // lbs double mass; // slugs
void Run(double dt); void Run(double dt);
}; };
#endif // _FG_AIBALLISTIC_HXX #endif // _FG_AIBALLISTIC_HXX

View file

@ -64,7 +64,7 @@ typedef struct {
double wind_from_north; // in feet per second double wind_from_north; // in feet per second
double cd; // coefficient of drag double cd; // coefficient of drag
bool wind; // if true, model reacts to parent wind bool wind; // if true, model reacts to parent wind
double weight; // in lbs double mass; // in slugs
} FGAIModelEntity; } FGAIModelEntity;

View file

@ -206,7 +206,7 @@ FGAIManager::createBallistic( FGAIModelEntity *entity ) {
ai_ballistic->setWind(entity->wind); ai_ballistic->setWind(entity->wind);
ai_ballistic->setRoll(entity->roll); ai_ballistic->setRoll(entity->roll);
ai_ballistic->setCd(entity->cd); ai_ballistic->setCd(entity->cd);
ai_ballistic->setWeight(entity->weight); ai_ballistic->setMass(entity->mass);
ai_ballistic->init(); ai_ballistic->init();
ai_ballistic->bind(); ai_ballistic->bind();
return ai_ballistic; return ai_ballistic;

View file

@ -81,7 +81,8 @@ FGAIScenario::FGAIScenario(string &filename)
en->wind_from_north = entry_node->getDoubleValue("wind_from_north", 0); en->wind_from_north = entry_node->getDoubleValue("wind_from_north", 0);
en->wind = entry_node->getBoolValue("wind", false); en->wind = entry_node->getBoolValue("wind", false);
en->cd = entry_node->getDoubleValue ("cd", 0.029); en->cd = entry_node->getDoubleValue ("cd", 0.029);
en->weight = entry_node->getDoubleValue ("weight", 0.030); en->mass = entry_node->getDoubleValue ("mass", 0.007);
en->fp = NULL; en->fp = NULL;
if (en->flightplan != ""){ if (en->flightplan != ""){
@ -118,3 +119,4 @@ int FGAIScenario::nEntries( void )
} }
// end scenario.cxx // end scenario.cxx

View file

@ -25,6 +25,7 @@ SubmodelSystem::SubmodelSystem ()
out[0] = out[1] = out[2] = 0; out[0] = out[1] = out[2] = 0;
in[3] = out[3] = 1; in[3] = out[3] = 1;
string contents_node;
} }
SubmodelSystem::~SubmodelSystem () SubmodelSystem::~SubmodelSystem ()
@ -127,7 +128,7 @@ SubmodelSystem::release (submodel* sm, double dt)
entity.wind_from_north = IC.wind_from_north; entity.wind_from_north = IC.wind_from_north;
entity.wind = sm->wind; entity.wind = sm->wind;
entity.cd = sm->cd; entity.cd = sm->cd;
entity.weight = sm->weight; entity.mass = IC.mass;
ai->createBallistic( &entity ); ai->createBallistic( &entity );
if (sm->count > 0) (sm->count)--; if (sm->count > 0) (sm->count)--;
@ -138,6 +139,7 @@ SubmodelSystem::release (submodel* sm, double dt)
void void
SubmodelSystem::load () SubmodelSystem::load ()
{ {
int i; int i;
SGPropertyNode *path = fgGetNode("/sim/systems/submodels/path"); SGPropertyNode *path = fgGetNode("/sim/systems/submodels/path");
SGPropertyNode root; SGPropertyNode root;
@ -182,13 +184,18 @@ SubmodelSystem::load ()
sm->first_time = false; sm->first_time = false;
sm->cd = entry_node->getDoubleValue("cd", 0.295); sm->cd = entry_node->getDoubleValue("cd", 0.295);
sm->weight = entry_node->getDoubleValue("weight", 0.25); sm->weight = entry_node->getDoubleValue("weight", 0.25);
sm->contents_node = fgGetNode(entry_node->getStringValue("contents", "none"), true);
sm->trigger->setBoolValue(false); sm->trigger->setBoolValue(false);
sm->timer = sm->delay; sm->timer = sm->delay;
sm->contents = sm->contents_node->getDoubleValue();
sm->prop = fgGetNode("/systems/submodels/submodel", i, true); sm->prop = fgGetNode("/systems/submodels/submodel", i, true);
sm->prop->tie("count", SGRawValuePointer<int>(&(sm->count))); sm->prop->tie("count", SGRawValuePointer<int>(&(sm->count)));
// sm->prop->tie("contents", SGRawValuePointer<double>(&(sm->contents)));
// sm->prop->tie("contents path", SGRawValuePointer<const char *>(&(sm->contents_node)));
submodels.push_back( sm ); submodels.push_back( sm );
} }
@ -201,7 +208,16 @@ void
SubmodelSystem::transform( submodel* sm) SubmodelSystem::transform( submodel* sm)
{ {
// get initial conditions // get initial conditions
// get the weight of the contents (lbs) and convert to mass (slugs)
sm->contents = sm->contents_node->getDoubleValue();
IC.mass = (sm->weight + sm->contents) * lbs_to_slugs;;
// cout << IC.mass << endl;
// set contents to 0 in the parent
sm->contents_node->setDoubleValue(0);
IC.lat = _user_lat_node->getDoubleValue(); IC.lat = _user_lat_node->getDoubleValue();
IC.lon = _user_lon_node->getDoubleValue(); IC.lon = _user_lon_node->getDoubleValue();
@ -222,9 +238,8 @@ SubmodelSystem::transform( submodel* sm)
in[0] = sm->x_offset; in[0] = sm->x_offset;
in[1] = sm->y_offset; in[1] = sm->y_offset;
in[2] = sm->z_offset; in[2] = sm->z_offset;
IC.mass = sm->weight * lbs_to_slugs;
// pre-process the trig functions // pre-process the trig functions
cosRx = cos(-IC.roll * SG_DEGREES_TO_RADIANS); cosRx = cos(-IC.roll * SG_DEGREES_TO_RADIANS);
@ -331,3 +346,4 @@ SubmodelSystem::updatelat(double lat)

View file

@ -29,6 +29,7 @@ public:
typedef struct { typedef struct {
SGPropertyNode* trigger; SGPropertyNode* trigger;
SGPropertyNode* prop; SGPropertyNode* prop;
SGPropertyNode* contents_node;
string name; string name;
string model; string model;
@ -50,7 +51,7 @@ public:
bool first_time; bool first_time;
double cd; double cd;
double weight; double weight;
// double mass; double contents;
} submodel; } submodel;
typedef struct { typedef struct {
@ -136,3 +137,4 @@ private:
#endif // __SYSTEMS_SUBMODEL_HXX #endif // __SYSTEMS_SUBMODEL_HXX