7228024ed5
if desired) in the stall. This allows for fairly docile stalls when desired, as on trainers (you also need to limit the elevator lift).
126 lines
3.2 KiB
C++
126 lines
3.2 KiB
C++
#ifndef _WING_HPP
|
|
#define _WING_HPP
|
|
|
|
#include "Vector.hpp"
|
|
|
|
namespace yasim {
|
|
|
|
class Surface;
|
|
|
|
// FIXME: need to handle "inverted" controls for mirrored wings.
|
|
class Wing {
|
|
public:
|
|
Wing();
|
|
~Wing();
|
|
|
|
// Do we mirror ourselves about the XZ plane?
|
|
void setMirror(bool mirror);
|
|
|
|
// Wing geometry:
|
|
void setBase(float* base); // in local coordinates
|
|
void setLength(float length); // dist. ALONG wing (not span!)
|
|
void setChord(float chord); // at base, measured along X axis
|
|
void setTaper(float taper); // fraction, 0-1
|
|
void setSweep(float sweep); // radians
|
|
void setDihedral(float dihedral); // radians, positive is "up"
|
|
|
|
void setStall(float aoa);
|
|
void setStallWidth(float angle);
|
|
void setStallPeak(float fraction);
|
|
void setTwist(float angle);
|
|
void setCamber(float camber);
|
|
void setIncidence(float incidence);
|
|
void setInducedDrag(float drag) { _inducedDrag = drag; }
|
|
|
|
void setFlap0(float start, float end, float lift, float drag);
|
|
void setFlap1(float start, float end, float lift, float drag);
|
|
void setSpoiler(float start, float end, float lift, float drag);
|
|
void setSlat(float start, float end, float aoa, float drag);
|
|
|
|
// Set the control axes for the sub-surfaces
|
|
void setFlap0(float lval, float rval);
|
|
void setFlap1(float lval, float rval);
|
|
void setSpoiler(float lval, float rval);
|
|
void setSlat(float val);
|
|
|
|
// Compile the thing into a bunch of Surface objects
|
|
void compile();
|
|
|
|
void getTip(float* tip);
|
|
|
|
bool isMirrored();
|
|
|
|
// Ground effect information
|
|
float getGroundEffect(float* posOut);
|
|
|
|
// Query the list of Surface objects
|
|
int numSurfaces();
|
|
Surface* getSurface(int n);
|
|
float getSurfaceWeight(int n);
|
|
|
|
// The overall drag coefficient for the wing as a whole. Units are
|
|
// arbitrary.
|
|
void setDragScale(float scale);
|
|
float getDragScale();
|
|
|
|
// The ratio of force along the Z (lift) direction of each wing
|
|
// segment to that along the X (drag) direction.
|
|
void setLiftRatio(float ratio);
|
|
float getLiftRatio();
|
|
|
|
private:
|
|
void interp(float* v1, float* v2, float frac, float* out);
|
|
Surface* newSurface(float* pos, float* orient, float chord,
|
|
bool flap0, bool flap1, bool slat, bool spoiler);
|
|
|
|
struct SurfRec { Surface * surface; float weight; };
|
|
|
|
Vector _surfs;
|
|
Vector _flap0Surfs;
|
|
Vector _flap1Surfs;
|
|
Vector _slatSurfs;
|
|
Vector _spoilerSurfs;
|
|
|
|
bool _mirror;
|
|
|
|
float _base[3];
|
|
float _length;
|
|
float _chord;
|
|
float _taper;
|
|
float _sweep;
|
|
float _dihedral;
|
|
|
|
float _stall;
|
|
float _stallWidth;
|
|
float _stallPeak;
|
|
float _twist;
|
|
float _camber;
|
|
float _incidence;
|
|
float _inducedDrag;
|
|
|
|
float _dragScale;
|
|
float _liftRatio;
|
|
|
|
float _flap0Start;
|
|
float _flap0End;
|
|
float _flap0Lift;
|
|
float _flap0Drag;
|
|
|
|
float _flap1Start;
|
|
float _flap1End;
|
|
float _flap1Lift;
|
|
float _flap1Drag;
|
|
|
|
float _spoilerStart;
|
|
float _spoilerEnd;
|
|
float _spoilerLift;
|
|
float _spoilerDrag;
|
|
|
|
float _slatStart;
|
|
float _slatEnd;
|
|
float _slatAoA;
|
|
float _slatDrag;
|
|
};
|
|
|
|
}; // namespace yasim
|
|
#endif // _WING_HPP
|