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:
parent
06bead966b
commit
328053fe23
7 changed files with 38 additions and 20 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue