X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIBallistic.cxx;h=027196d113948482777f6f735321f1924cc3e662;hb=4bfd1722df24f5be89459b25010e5d7352720a7b;hp=e06bf9f4b9b858260c0f3368571e279436a98b1a;hpb=af284e4bb922a3782c9bd9d947895e787e41adbf;p=flightgear.git diff --git a/src/AIModel/AIBallistic.cxx b/src/AIModel/AIBallistic.cxx index e06bf9f4b..027196d11 100644 --- a/src/AIModel/AIBallistic.cxx +++ b/src/AIModel/AIBallistic.cxx @@ -27,32 +27,57 @@ #include "AIBallistic.hxx" -FGAIBallistic::FGAIBallistic(FGAIManager* mgr) { - manager = mgr; - _type_str = "ballistic"; - _otype = otBallistic; +FGAIBallistic::FGAIBallistic() : FGAIBase(otBallistic) { drag_area = 0.007; life_timer = 0.0; + gravity = 32; +// buoyancy = 64; + no_roll = false; + aero_stabilised = false; } FGAIBallistic::~FGAIBallistic() { } +void FGAIBallistic::readFromScenario(SGPropertyNode* scFileNode) { + if (!scFileNode) + return; + + FGAIBase::readFromScenario(scFileNode); + + setAzimuth(scFileNode->getDoubleValue("azimuth", 0.0)); + setElevation(scFileNode->getDoubleValue("elevation", 0.0)); + setDragArea(scFileNode->getDoubleValue("eda", 0.007)); + setLife(scFileNode->getDoubleValue("life", 900.0)); + setBuoyancy(scFileNode->getDoubleValue("buoyancy", 0)); + setWind_from_east(scFileNode->getDoubleValue("wind_from_east", 0)); + setWind_from_north(scFileNode->getDoubleValue("wind_from_north", 0)); + setWind(scFileNode->getBoolValue("wind", false)); + setRoll(scFileNode->getDoubleValue("roll", 0.0)); + setCd(scFileNode->getDoubleValue("cd", 0.029)); + setMass(scFileNode->getDoubleValue("mass", 0.007)); + setStabilisation(scFileNode->getBoolValue("aero_stabilized", false)); +} bool FGAIBallistic::init() { FGAIBase::init(); - aero_stabilized = true; hdg = azimuth; pitch = elevation; + roll = rotation; + Transform(); return true; } void FGAIBallistic::bind() { // FGAIBase::bind(); + props->tie("sim/time/elapsed-sec", + SGRawValueMethods(*this, + &FGAIBallistic::_getTime)); } void FGAIBallistic::unbind() { // FGAIBase::unbind(); + props->untie("sim/time/elapsed-sec"); } void FGAIBallistic::update(double dt) { @@ -71,9 +96,12 @@ void FGAIBallistic::setElevation(double el) { pitch = elevation = el; } +void FGAIBallistic::setRoll(double rl) { + rotation = rl; +} -void FGAIBallistic::setStabilization(bool val) { - aero_stabilized = val; +void FGAIBallistic::setStabilisation(bool val) { + aero_stabilised = val; } void FGAIBallistic::setDragArea(double a) { @@ -84,39 +112,93 @@ void FGAIBallistic::setLife(double seconds) { life = seconds; } +void FGAIBallistic::setBuoyancy(double fpss) { + buoyancy = fpss; +} + +void FGAIBallistic::setWind_from_east(double fps) { + wind_from_east = fps; +} + +void FGAIBallistic::setWind_from_north(double fps) { + wind_from_north = fps; +} + +void FGAIBallistic::setWind(bool val) { + wind = val; +} + +void FGAIBallistic::setCd(double c) { + Cd = c; +} + +void FGAIBallistic::setMass(double m) { + mass = m; +} + void FGAIBallistic::Run(double dt) { life_timer += dt; +// cout << "life timer 1" << life_timer << dt << endl; if (life_timer > life) setDie(true); double speed_north_deg_sec; double speed_east_deg_sec; - - // the two drag calculations below assume sea-level density, - // mass of 0.03 slugs, drag coeff of 0.295 - // adjust speed due to drag - speed -= 0.0116918 * drag_area * speed * speed * dt; + double wind_speed_from_north_deg_sec; + double wind_speed_from_east_deg_sec; + double Cdm; // Cd adjusted by Mach Number + + // Adjust Cd by Mach number. The equations are based on curves + // for a conventional shell/bullet (no boat-tail). + if ( Mach < 0.7 ) { Cdm = 0.0125 * Mach + Cd; } + else if ( 0.7 < Mach && Mach < 1.2 ) { + Cdm = 0.3742 * pow ( Mach, 2) - 0.252 * Mach + 0.0021 + Cd; } + else { Cdm = 0.2965 * pow ( Mach, -1.1506 ) + Cd; } + +// cout << " Mach , " << Mach << " , Cdm , " << Cdm << endl; + + // 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 -= (Cdm * 0.5 * rho * speed * speed * drag_area/mass) * dt; + + // don't let speed become negative if ( speed < 0.0 ) speed = 0.0; + + // calculate vertical and horizontal speed components vs = sin( pitch * SG_DEGREES_TO_RADIANS ) * speed; hs = cos( pitch * SG_DEGREES_TO_RADIANS ) * speed; // convert horizontal speed (fps) to degrees per second speed_north_deg_sec = cos(hdg / SG_RADIANS_TO_DEGREES) * hs / ft_per_deg_lat; speed_east_deg_sec = sin(hdg / SG_RADIANS_TO_DEGREES) * hs / ft_per_deg_lon; - + + // if wind not required, set to zero + if (!wind) { + wind_from_north = 0; + wind_from_east = 0; + } + + // convert wind speed (fps) to degrees per second + wind_speed_from_north_deg_sec = wind_from_north / ft_per_deg_lat; + wind_speed_from_east_deg_sec = wind_from_east / ft_per_deg_lon; + // set new position - pos.setlat( pos.lat() + speed_north_deg_sec * dt); - pos.setlon( pos.lon() + speed_east_deg_sec * dt); + pos.setlat( pos.lat() + (speed_north_deg_sec - wind_speed_from_north_deg_sec) * dt ); + pos.setlon( pos.lon() + (speed_east_deg_sec - wind_speed_from_east_deg_sec) * dt ); + // adjust vertical speed for acceleration of gravity and buoyancy + vs -= (gravity - buoyancy) * dt; + // adjust altitude (feet) altitude += vs * dt; pos.setelev(altitude * SG_FEET_TO_METER); - // adjust vertical speed for acceleration of gravity - vs -= 32.17 * dt; - // recalculate pitch (velocity vector) if aerostabilized - if (aero_stabilized) pitch = atan2( vs, hs ) * SG_RADIANS_TO_DEGREES; + // cout << "aero_stabilised " << aero_stabilised << endl ; + if (aero_stabilised) pitch = atan2( vs, hs ) * SG_RADIANS_TO_DEGREES; // recalculate total speed speed = sqrt( vs * vs + hs * hs); @@ -124,5 +206,11 @@ void FGAIBallistic::Run(double dt) { // set destruction flag if altitude less than sea level -1000 if (altitude < -1000.0) setDie(true); +} // end Run + +double FGAIBallistic::_getTime() const { +// cout << "life timer 2" << life_timer << endl; + return life_timer; } +// end AIBallistic