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

213 lines
6.6 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
//
2008-02-15 11:06:27 +00:00
// With major additions by Vivian Meazza, Feb 2008
//
// 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 <math.h>
#include <vector>
#include <simgear/structure/SGSharedPtr.hxx>
#include <simgear/scene/material/mat.hxx>
#include "AIManager.hxx"
#include "AIBase.hxx"
SG_USING_STD(vector);
SG_USING_STD(list);
class FGAIBallistic : public FGAIBase {
public:
2008-02-15 11:06:27 +00:00
FGAIBallistic(object_type ot = otBallistic);
~FGAIBallistic();
void readFromScenario(SGPropertyNode* scFileNode);
virtual osg::Node* load3DModel(const string &path,
SGPropertyNode *prop_root);
bool init(bool search_in_AI_path=false);
virtual void bind();
virtual void unbind();
void update(double dt);
2008-02-15 11:06:27 +00:00
FGAIBallistic *ballistic;
void Run(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 );
2008-02-15 11:06:27 +00:00
void setWeight( double w );
void setNoRoll( bool nr );
void setRandom( bool r );
void setName(const string&);
void setCollision(bool c);
void setImpact(bool i);
void setImpactReportNode(const string&);
2008-02-15 11:06:27 +00:00
void setContentsNode(const string&);
void setFuseRange(double f);
void setSMPath(const string&);
void setSubID(int i);
void setSubmodel(const string&);
void setExternalForce( bool f );
void setForcePath(const string&);
void setForceStabilisation( bool val );
2008-02-15 11:06:27 +00:00
void setGroundOffset(double g);
void setLoadOffset(double l);
void setSlaved(bool s);
void setSlavedLoad(bool s);
void setHitchPos();
void setPch (double e, double dt, double c);
void setHdg (double az, double dt, double c);
void setBnk(double r, double dt, double c);
void setHt(double h, double dt, double c);
void setHitchVelocity(double dt);
void setFormate(bool f);
double _getTime() const;
double getRelBrgHitchToUser() const;
double getElevHitchToUser() const;
double getLoadOffset() const;
double getContents();
SGVec3d getCartHitchPos() const;
2008-02-15 11:06:27 +00:00
bool getHtAGL();
bool getSlaved() const;
bool getSlavedLoad() const;
virtual const char* getTypeString(void) const { return "ballistic"; }
static const double slugs_to_kgs; //conversion factor
static const double slugs_to_lbs; //conversion factor
SGPropertyNode_ptr _force_node;
SGPropertyNode_ptr _force_azimuth_node;
SGPropertyNode_ptr _force_elevation_node;
2008-02-15 11:06:27 +00:00
SGGeod hitchpos;
2008-02-15 11:06:27 +00:00
double _height;
double _ht_agl_ft; // height above ground level
double _azimuth; // degrees true
double _elevation; // degrees
double _rotation; // degrees
2008-02-15 11:06:27 +00:00
bool _formate_to_ac;
void setTgtXOffset(double x);
void setTgtYOffset(double y);
void setTgtZOffset(double z);
void setTgtOffsets(double dt, double c);
double getTgtXOffset() const;
double getTgtYOffset() const;
double getTgtZOffset() const;
double _tgt_x_offset;
double _tgt_y_offset;
double _tgt_z_offset;
double _elapsed_time;
private:
virtual void reinit() { init(); }
bool _aero_stabilised; // if true, object will align with trajectory
double _drag_area; // equivalent drag area in ft2
double _life_timer; // seconds
2008-02-15 11:06:27 +00:00
double _gravity; // fps^2
double _buoyancy; // fps^2
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 _load_resistance; // ground load resistanc N/m^2
double _frictionFactor; // dimensionless modifier for Coefficient of Friction
bool _solid; // if true ground is solid for FDMs
double _elevation_m; // ground elevation in meters
bool _force_stabilised;// if true, object will align to external force
2008-02-15 11:06:27 +00:00
bool _slave_to_ac; // if true, object will be slaved to the parent ac pos and orientation
bool _slave_load_to_ac;// if true, object will be slaved to the parent ac pos
double _contents_lb; // contents of the object
double _weight_lb; // weight of the object (no contents if appropriate) (lbs)
bool _report_collision; // if true a collision point with AI Objects is calculated
bool _report_impact; // if true an impact point on the terrain is calculated
bool _external_force; // if true then apply external force
SGPropertyNode_ptr _impact_report_node; // report node for impact and collision
2008-02-15 11:06:27 +00:00
SGPropertyNode_ptr _contents_node; // report node for impact and collision
double _fuse_range;
2008-02-15 11:06:27 +00:00
double _distance;
double _dt_count;
double _next_run;
string _name;
string _path;
string _submodel;
string _force_path;
const SGMaterial* _material;
void handle_collision();
void handle_impact();
void report_impact(double elevation, const FGAIBase *target = 0);
2008-02-15 11:06:27 +00:00
void slaveToAC(double dt);
void setContents(double c);
void formateToAC(double dt);
SGVec3d getCartUserPos() const;
2008-02-15 11:06:27 +00:00
double getDistanceLoadToHitch() const;
double getElevLoadToHitch() const;
double getBearingLoadToHitch() const;
double getRecip(double az);
2008-02-15 11:06:27 +00:00
double getMass() const;
double hs;
double _ground_offset;
double _load_offset;
double _force;
double _old_height;
SGVec3d _oldcarthitchPos;
SGGeod oldhitchpos;
};
#endif // _FG_AIBALLISTIC_HXX