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;
}
void FGAIBallistic::setWeight(double w) {
weight = w;
void FGAIBallistic::setMass(double m) {
mass = m;
}
void FGAIBallistic::Run(double dt) {
@ -129,14 +129,10 @@ void FGAIBallistic::Run(double dt) {
double speed_east_deg_sec;
double wind_speed_from_north_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;
// rho is adjusted for altitude in void FGAIBase::update,
// using Standard Atmosphere (sealevel temperature 15C)
// acceleration = drag/mass;
// adjust speed by drag
speed -= (Cd * 0.5 * rho * speed * speed * drag_area/mass) * dt;
@ -189,3 +185,4 @@ double FGAIBallistic::_getTime() const {
}
// 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.
// - davidculp2@comcast.net
@ -47,7 +47,7 @@ public:
void setWind_from_north( double fps );
void setWind( bool val );
void setCd( double c );
void setWeight( double w );
void setMass( double m );
double _getTime() const;
@ -66,9 +66,10 @@ private:
double wind_from_north; // fps
bool wind; // if true, local wind will be applied to object
double Cd; // drag coefficient
double weight; // lbs
double mass; // slugs
void Run(double dt);
};
#endif // _FG_AIBALLISTIC_HXX

View file

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

View file

@ -206,7 +206,7 @@ FGAIManager::createBallistic( FGAIModelEntity *entity ) {
ai_ballistic->setWind(entity->wind);
ai_ballistic->setRoll(entity->roll);
ai_ballistic->setCd(entity->cd);
ai_ballistic->setWeight(entity->weight);
ai_ballistic->setMass(entity->mass);
ai_ballistic->init();
ai_ballistic->bind();
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 = entry_node->getBoolValue("wind", false);
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;
if (en->flightplan != ""){
@ -118,3 +119,4 @@ int FGAIScenario::nEntries( void )
}
// end scenario.cxx

View file

@ -25,6 +25,7 @@ SubmodelSystem::SubmodelSystem ()
out[0] = out[1] = out[2] = 0;
in[3] = out[3] = 1;
string contents_node;
}
SubmodelSystem::~SubmodelSystem ()
@ -127,7 +128,7 @@ SubmodelSystem::release (submodel* sm, double dt)
entity.wind_from_north = IC.wind_from_north;
entity.wind = sm->wind;
entity.cd = sm->cd;
entity.weight = sm->weight;
entity.mass = IC.mass;
ai->createBallistic( &entity );
if (sm->count > 0) (sm->count)--;
@ -138,6 +139,7 @@ SubmodelSystem::release (submodel* sm, double dt)
void
SubmodelSystem::load ()
{
int i;
SGPropertyNode *path = fgGetNode("/sim/systems/submodels/path");
SGPropertyNode root;
@ -182,13 +184,18 @@ SubmodelSystem::load ()
sm->first_time = false;
sm->cd = entry_node->getDoubleValue("cd", 0.295);
sm->weight = entry_node->getDoubleValue("weight", 0.25);
sm->contents_node = fgGetNode(entry_node->getStringValue("contents", "none"), true);
sm->trigger->setBoolValue(false);
sm->timer = sm->delay;
sm->contents = sm->contents_node->getDoubleValue();
sm->prop = fgGetNode("/systems/submodels/submodel", i, true);
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 );
}
@ -201,7 +208,16 @@ void
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.lon = _user_lon_node->getDoubleValue();
@ -223,7 +239,6 @@ SubmodelSystem::transform( submodel* sm)
in[1] = sm->y_offset;
in[2] = sm->z_offset;
IC.mass = sm->weight * lbs_to_slugs;
// pre-process the trig functions
@ -331,3 +346,4 @@ SubmodelSystem::updatelat(double lat)

View file

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