return;
}
+ // special case this so the logic below doesn't produce a non-zero
+ // force; should probably have a "no force" flag instead...
+ if(_cx == 0. && _cy == 0. && _cz == 0.) {
+ for(int i=0; i<3; i++) out[i] = torque[i] = 0.;
+ return;
+ }
+
Math::mul3(1/vel, v, out);
// Convert to the surface's coordinates
out[1] *= _cy;
// Diddle the induced drag
- float IDMUL = 0.5;
Math::mul3(-1*_inducedDrag*out[2]*lwind[2], lwind, lwind);
Math::add3(lwind, out, out);
Math::mul3(scale, torque, torque);
}
+#if 0
+void Surface::test()
+{
+ static const float DEG2RAD = 0.0174532925199;
+ float v[3], force[3], torque[3];
+ float rho = Atmosphere::getStdDensity(0);
+ float spd = 30;
+
+ setFlap(0);
+ setSlat(0);
+ setSpoiler(0);
+
+ for(float angle = -90; angle<90; angle += 0.01) {
+ float rad = angle * DEG2RAD;
+ v[0] = spd * -Math::cos(rad);
+ v[1] = 0;
+ v[2] = spd * Math::sin(rad);
+ calcForce(v, rho, force, torque);
+ float lift = force[2] * Math::cos(rad) + force[0] * Math::sin(rad);
+ //__builtin_printf("%f %f\n", angle, lift);
+ __builtin_printf("%f %f\n", angle, torque[2]);
+ }
+}
+#endif
+
// Returns a multiplier for the "plain" force equations that
// approximates an airfoil's lift/stall curve.
float Surface::stallFunc(float* v)
// Wacky use of indexing, see setStall*() methods.
int fwdBak = v[0] > 0; // set if this is "backward motion"
- int posNeg = v[2] < 0; // set if the lift is toward -z
+ int posNeg = v[2] < 0; // set if the airflow is toward -z
int i = (fwdBak<<1) | posNeg;
float stallAlpha = _stalls[i];