_stall = 0;
_stallWidth = 0;
_stallPeak = 0;
+ _twist = 0;
_camber = 0;
_incidence = 0;
+ _inducedDrag = 1;
_dragScale = 1;
_liftRatio = 1;
_flap0Start = 0;
_stallPeak = fraction;
}
+void Wing::setTwist(float angle)
+{
+ _twist = angle;
+}
+
void Wing::setCamber(float camber)
{
_camber = camber;
// Calculate a "nominal" segment length equal to an average chord,
// normalized to lie within 0-1 over the length of the wing.
- float segLen = _chord * (0.5*(_taper+1)) / _length;
+ float segLen = _chord * (0.5f*(_taper+1)) / _length;
// Generating a unit vector pointing out the left wing.
float left[3];
// and flap1 are set. Right now flap1 overrides.
int nSegs = (int)Math::ceil((end-start)/segLen);
+ if (_twist != 0 && nSegs < 8) // more segments if twisted
+ nSegs = 8;
float segWid = _length * (end - start)/nSegs;
int j;
for(j=0; j<nSegs; j++) {
- float frac = start + (j+0.5) * (end-start)/nSegs;
+ float frac = start + (j+0.5f) * (end-start)/nSegs;
float pos[3];
interp(root, tip, frac, pos);
sr->surface = s;
sr->weight = chord * segWid;
s->setTotalDrag(sr->weight);
+ s->setTwist(_twist * 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);
}
}
}
+
+ // Last of all, re-set the incidence in case setIncidence() was
+ // called before we were compiled.
+ setIncidence(_incidence);
}
float Wing::getDragScale()
// The negative AoA stall is the same if we're using an uncambered
// airfoil, otherwise a "little badder".
if(_camber > 0) {
- s->setStall(1, stallAoA * 0.8);
- s->setStallWidth(1, _stallWidth * 0.5);
+ s->setStall(1, stallAoA * 0.8f);
+ s->setStallWidth(1, _stallWidth * 0.5f);
} else {
s->setStall(1, stallAoA);
s->setStall(1, _stallWidth);
s->setStallPeak(1, 1);
int i;
for(i=2; i<4; i++) {
- s->setStall(i, 0.2267);
+ s->setStall(i, 0.2267f);
s->setStallWidth(i, 1);
}
if(slat) _slatSurfs.add(s);
if(spoiler) _spoilerSurfs.add(s);
+ s->setInducedDrag(_inducedDrag);
+
return s;
}