w->setDihedral(attrf(a, "dihedral", defDihed) * DEG2RAD);
w->setCamber(attrf(a, "camber", 0));
w->setIncidence(attrf(a, "incidence", 0) * DEG2RAD);
+ w->setTwist(attrf(a, "twist", 0) * DEG2RAD);
// The 70% is a magic number that sorta kinda seems to match known
// throttle settings to approach speed.
_chord = 0;
_incidence = 0;
+ _twist = 0;
_slatPos = _spoilerPos = _flapPos = 0;
_slatDrag = _spoilerDrag = _flapDrag = 1;
_incidence = angle;
}
+void Surface::setTwist(float angle)
+{
+ _twist = angle;
+}
+
void Surface::setSlatParams(float stallDelta, float dragPenalty)
{
_slatAlpha = stallDelta;
// "Rotate" by the incidence angle. Assume small angles, so we
// need to diddle only the Z component, X is relatively unchanged
// by small rotations.
- out[2] += _incidence * out[0]; // z' = z + incidence * x
+ float incidence = _incidence + _twist;
+ out[2] += incidence * out[0]; // z' = z + incidence * x
// Hold onto the local wind vector so we can multiply the induced
// drag at the end.
// Reverse the incidence rotation to get back to surface
// coordinates.
- out[2] -= _incidence * out[0];
+ out[2] -= incidence * out[0];
// Convert back to external coordinates
Math::tmul33(_orient, out, out);
// positive is "up" (i.e. "positive AoA")
void setIncidence(float angle);
+ // The offset from base incidence for this surface.
+ void setTwist(float angle);
+
void setTotalDrag(float c0);
float getTotalDrag();
float _flapPos;
float _spoilerPos;
float _incidence;
+ float _twist;
float _inducedDrag;
};
_stall = 0;
_stallWidth = 0;
_stallPeak = 0;
+ _twist = 0;
_camber = 0;
_incidence = 0;
_inducedDrag = 1;
_stallPeak = fraction;
}
+void Wing::setTwist(float angle)
+{
+ _twist = angle;
+}
+
void Wing::setCamber(float camber)
{
_camber = camber;
// and flap1 are set. Right now flap1 overrides.
int nSegs = (int)Math::ceil((end-start)/segLen);
+ if (_twist != 0 && nSegs < 16) // more segments if twisted
+ nSegs = 16;
float segWid = _length * (end - start)/nSegs;
int j;
sr->surface = s;
sr->weight = chord * segWid;
s->setTotalDrag(sr->weight);
+ s->setTwist(_twist * Math::sqrt(1-frac));
_surfs.add(sr);
if(_mirror) {
sr->surface = s;
sr->weight = chord * segWid;
s->setTotalDrag(sr->weight);
+ s->setTwist(_twist * Math::sqrt(frac));
_surfs.add(sr);
}
}
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; }
float _stall;
float _stallWidth;
float _stallPeak;
+ float _twist;
float _camber;
float _incidence;
float _inducedDrag;