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

235 lines
7.9 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 <cmath>
#include <vector>
#include <simgear/structure/SGSharedPtr.hxx>
#include <simgear/scene/material/mat.hxx>
#include "AIManager.hxx"
#include "AIBase.hxx"
class FGAIBallistic : public FGAIBase {
public:
2008-02-15 11:06:27 +00:00
FGAIBallistic(object_type ot = otBallistic);
~FGAIBallistic();
void readFromScenario(SGPropertyNode* scFileNode) override;
bool init(ModelSearchOrder searchOrder) override;
void bind() override;
void reinit() override;
void update(double dt) override;
const char* getTypeString(void) const override { return "ballistic"; }
2008-02-15 11:06:27 +00:00
void Run(double dt);
void setAzimuth( double az );
void setElevation( double el );
void setAzimuthRandomError(double error);
void setElevationRandomError(double error);
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 cd);
void setCdRandomness(double randomness);
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 setLifeRandomness(double randomness);
void setCollision(bool c);
void setExpiry(bool e);
void setImpact(bool i);
void setImpactReportNode(const std::string&);
void setContentsNode(const SGPropertyNode_ptr);
void setFuseRange(double f);
void setSMPath(const std::string&);
void setSubID(int i);
void setSubmodel(const std::string&);
void setExternalForce( bool f );
void setForcePath(const std::string&);
void setContentsPath(const std::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 setPch (double e, double dt, double c);
int setHdg (double az, double dt, double c);
2008-02-15 11:06:27 +00:00
void setBnk(double r, double dt, double c);
void setHt(double h, double dt, double c);
void setSpd(double s, double dt, double c);
void setParentNodes(const SGPropertyNode_ptr);
void setParentPos();
void setOffsetPos(SGGeod pos, double heading, double pitch, double roll);
void setOffsetVelocity(double dt, SGGeod pos);
void setTime(double sec);
double _getTime()const;
2008-02-15 11:06:27 +00:00
double getRelBrgHitchToUser() const;
double getElevHitchToUser() const;
double getLoadOffset() const;
double getContents();
double getDistanceToHitch() const;
double getElevToHitch() const;
double getBearingToHitch() const;
2008-02-15 11:06:27 +00:00
SGVec3d getCartHitchPos() const;
bool getHtAGL(double start);
2008-02-15 11:06:27 +00:00
bool getSlaved() const;
bool getSlavedLoad() const;
FGAIBallistic *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;
// Node for parent model
SGPropertyNode_ptr _pnode;
// Nodes for parent parameters
SGPropertyNode_ptr _p_pos_node;
SGPropertyNode_ptr _p_lat_node;
SGPropertyNode_ptr _p_lon_node;
SGPropertyNode_ptr _p_alt_node;
SGPropertyNode_ptr _p_agl_node;
SGPropertyNode_ptr _p_ori_node;
SGPropertyNode_ptr _p_pch_node;
SGPropertyNode_ptr _p_rll_node;
SGPropertyNode_ptr _p_hdg_node;
SGPropertyNode_ptr _p_vel_node;
SGPropertyNode_ptr _p_spd_node;
2008-02-15 11:06:27 +00:00
double _height;
double _speed;
2008-02-15 11:06:27 +00:00
double _ht_agl_ft; // height above ground level
double _azimuth; // degrees true
double _elevation; // degrees
double _rotation; // degrees
double _speed_north_fps;
double _speed_east_fps;
double _wind_from_east; // fps
double _wind_from_north; // fps
double hs;
2008-02-15 11:06:27 +00:00
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;
SGGeod _parentpos;
SGGeod _oldpos;
SGGeod _offsetpos;
SGGeod _oldoffsetpos;
2008-02-15 11:06:27 +00:00
private:
double _az_random_error; // maximum azimuth error in degrees
double _el_random_error; // maximum elevation error in degrees
bool _aero_stabilised; // if true, object will align with trajectory
double _drag_area; // equivalent drag area in ft2
double _cd; // current drag coefficient
double _init_cd; // initial drag coefficient
double _cd_randomness; // randomness of Cd. 1.0 means +- 100%, 0.0 means no randomness
double _buoyancy; // fps^2
double _life_timer; // seconds
bool _wind; // if true, local wind will be applied to object
double _mass; // slugs
bool _random; // modifier for Cd, life, az
double _life_randomness; // dimension for _random, only applies to life at present
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)
std::string _mat_name;
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
bool _report_expiry;
SGPropertyNode_ptr _impact_report_node; // report node for impact and collision
SGPropertyNode_ptr _contents_node; // node for droptank etc. contents
double _fuse_range;
std::string _submodel;
std::string _force_path;
std::string _contents_path;
void handleEndOfLife(double);
void handle_collision();
void handle_expiry();
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 calcVSHS();
void calcNE();
2008-02-15 11:06:27 +00:00
SGVec3d getCartOffsetPos(SGGeod pos, double heading, double pitch, double roll) const;
double getRecip(double az);
2008-02-15 11:06:27 +00:00
double getMass() const;
double _ground_offset;
double _load_offset;
SGVec3d _oldcartoffsetPos;
SGVec3d _oldcartPos;
};
#endif // _FG_AIBALLISTIC_HXX