1
0
Fork 0
flightgear/src/AIModel/AIBallistic.hxx

102 lines
3.1 KiB
C++
Raw Normal View History

// FGAIBallistic.hxx - AIBase derived class creates an AI ballistic object
//
// Written by David Culp, started November 2003.
// - davidculp2@comcast.net
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
2006-02-21 01:16:04 +00:00
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#ifndef _FG_AIBALLISTIC_HXX
#define _FG_AIBALLISTIC_HXX
#include "AIManager.hxx"
#include "AIBase.hxx"
class FGAIBallistic : public FGAIBase {
public:
FGAIBallistic();
~FGAIBallistic();
void readFromScenario(SGPropertyNode* scFileNode);
bool init(bool search_in_AI_path=false);
virtual void bind();
virtual void unbind();
void update(double dt);
void setAzimuth( double az );
void setElevation( double el );
void setRoll( double rl );
void setStabilisation( bool val );
David Culp: Silly me. I was starting the timer at zero, so the first tracer didn't fly until 0.25 seconds after pulling the trigger. Now the timer starts at the same value as "delay", so the first round comes out immediately. Also, I've added an optional configuration attribute that allows you to change the ballistics of the submodel. This allows parachutes, or anything else that has ballistics different from a bullet. The attribute is called "eda", which is the equivalent drag area. Default value is 0.007, which gives the same ballistics as the current tracers. Increasing this value gives more drag. A value of 2.0 looks good for a parachute. math stuff ######################################################################## The deceleration of the ballictic object is now given by: [ (rho) (Cd) ] / [ (1/2) (m) ] * A * (V * V) where rho is sea-level air density, and Cd and m are fixed, bullet-like values. So the calculation is: 0.0116918 * A * (V * V) The value "A" is what I'm calling the "eda" (equivalent drag area). ######################################################################## A parachute model will have to be built so that the parachutist's feet are in the forward x-direction. Here is the submodel.xml config I use for "parachutes": <submodel> <name>flares</name> <model>Models/Geometry/flare.ac</model> <trigger>systems/submodels/submodel[0]/trigger</trigger> <speed>0.0</speed> <repeat>true</repeat> <delay>0.85</delay> <count>4</count> <x-offset>0.0</x-offset> <y-offset>0.0</y-offset> <z-offset>-4.0</z-offset> <yaw-offset>0.0</yaw-offset> <pitch-offset>0.0</pitch-offset> <eda>2.0</eda> </submodel>
2004-08-26 16:25:54 +00:00
void setDragArea( double a );
void setLife( double seconds );
void setBuoyancy( double fpss );
void setWind_from_east( double fps );
void setWind_from_north( double fps );
void setWind( bool val );
void setCd( double c );
void setMass( double m );
void setNoRoll( bool nr );
void setRandom( bool r );
void setName(const string&);
void setImpact(bool i);
double _getTime() const;
virtual const char* getTypeString(void) const { return "ballistic"; }
static const double slugs_to_kgs; //conversion factor
private:
double azimuth; // degrees true
double elevation; // degrees
double rotation; // degrees
bool aero_stabilised; // if true, object will align with trajectory
David Culp: Silly me. I was starting the timer at zero, so the first tracer didn't fly until 0.25 seconds after pulling the trigger. Now the timer starts at the same value as "delay", so the first round comes out immediately. Also, I've added an optional configuration attribute that allows you to change the ballistics of the submodel. This allows parachutes, or anything else that has ballistics different from a bullet. The attribute is called "eda", which is the equivalent drag area. Default value is 0.007, which gives the same ballistics as the current tracers. Increasing this value gives more drag. A value of 2.0 looks good for a parachute. math stuff ######################################################################## The deceleration of the ballictic object is now given by: [ (rho) (Cd) ] / [ (1/2) (m) ] * A * (V * V) where rho is sea-level air density, and Cd and m are fixed, bullet-like values. So the calculation is: 0.0116918 * A * (V * V) The value "A" is what I'm calling the "eda" (equivalent drag area). ######################################################################## A parachute model will have to be built so that the parachutist's feet are in the forward x-direction. Here is the submodel.xml config I use for "parachutes": <submodel> <name>flares</name> <model>Models/Geometry/flare.ac</model> <trigger>systems/submodels/submodel[0]/trigger</trigger> <speed>0.0</speed> <repeat>true</repeat> <delay>0.85</delay> <count>4</count> <x-offset>0.0</x-offset> <y-offset>0.0</y-offset> <z-offset>-4.0</z-offset> <yaw-offset>0.0</yaw-offset> <pitch-offset>0.0</pitch-offset> <eda>2.0</eda> </submodel>
2004-08-26 16:25:54 +00:00
double drag_area; // equivalent drag area in ft2
double life_timer; // seconds
double gravity; // fps2
double buoyancy; // fps2
double wind_from_east; // fps
double wind_from_north; // fps
bool wind; // if true, local wind will be applied to object
double Cd; // drag coefficient
double mass; // slugs
bool random; // modifier for Cd
double ht_agl_ft; // height above ground level
double load_resistance; // ground load resistanc N/m^2
bool solid; // if true ground is solid for FDMs
bool impact; // if true an impact point on the terrain is calculated
bool impact_data; // if true impact data have been set
double impact_energy;
double impact_speed;
double impact_lat;
double impact_lon;
double impact_elev;
string mat_name;
string name;
void Run(double dt);
void handle_impact();
FGAIBase* ai;
};
#endif // _FG_AIBALLISTIC_HXX