Mathias Frhlich:
this is basically the past patch I sent to the list and which should now really (...!?!?) fix the no ground below aircraft problem. Reasons: I understood my remaining thinko I introduced with the prevous patch, and the same thinko I made in my test cases. The feedback from the list told me that it should help.
This commit is contained in:
parent
807d2cc3ca
commit
557a879483
5 changed files with 59 additions and 48 deletions
|
@ -66,6 +66,7 @@ FGTable::FGTable(int NRows, int NCols, int NTables)
|
|||
Data = Allocate(); // this data array will contain the keys for the associated tables
|
||||
Tables.reserve(nTables);
|
||||
for (int i=0; i<nTables; i++) Tables.push_back(FGTable(NRows, NCols));
|
||||
lastRowIndex=lastColumnIndex=2;
|
||||
|
||||
Debug(0);
|
||||
}
|
||||
|
@ -282,7 +283,7 @@ double FGTable::GetValue(double rowKey, double colKey, double tableKey)
|
|||
}
|
||||
|
||||
Value = Factor*(Tables[r-1].GetValue(rowKey, colKey) - Tables[r-2].GetValue(rowKey, colKey))
|
||||
+ Tables[r-1].GetValue(rowKey, colKey);
|
||||
+ Tables[r-2].GetValue(rowKey, colKey);
|
||||
|
||||
return Value;
|
||||
}
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
#endif
|
||||
|
||||
#include <simgear/compiler.h>
|
||||
#include <simgear/math/sg_geodesy.hxx>
|
||||
|
||||
#include <stdio.h> // size_t
|
||||
#ifdef SG_MATH_EXCEPTION_CLASH
|
||||
|
@ -39,6 +38,7 @@
|
|||
#include <simgear/debug/logstream.hxx>
|
||||
#include <simgear/math/sg_geodesy.hxx>
|
||||
#include <simgear/misc/sg_path.hxx>
|
||||
#include <simgear/structure/commands.hxx>
|
||||
|
||||
#include <FDM/flight.hxx>
|
||||
|
||||
|
@ -92,6 +92,7 @@ public:
|
|||
sgCartToGeod( pt, &lat, &lon, &alt);
|
||||
return alt * SG_METER_TO_FEET;
|
||||
}
|
||||
|
||||
/** Compute the altitude above ground. */
|
||||
virtual double GetAGLevel(double t, const FGLocation& l,
|
||||
FGLocation& cont,
|
||||
|
@ -116,7 +117,6 @@ FGJSBsim::FGJSBsim( double dt )
|
|||
: FGInterface(dt)
|
||||
{
|
||||
bool result;
|
||||
|
||||
// Set up the debugging level
|
||||
// FIXME: this will not respond to
|
||||
// runtime changes
|
||||
|
@ -208,7 +208,7 @@ FGJSBsim::FGJSBsim( double dt )
|
|||
}
|
||||
}
|
||||
Propulsion->SetFuelFreeze((fgGetNode("/sim/freeze/fuel",true))->getBoolValue());
|
||||
|
||||
|
||||
fgSetDouble("/fdm/trim/pitch-trim", FCS->GetPitchTrimCmd());
|
||||
fgSetDouble("/fdm/trim/throttle", FCS->GetThrottleCmd(0));
|
||||
fgSetDouble("/fdm/trim/aileron", FCS->GetDaCmd());
|
||||
|
@ -316,6 +316,14 @@ void FGJSBsim::init()
|
|||
<< ", " << fdmex->GetAtmosphere()->GetPressure()
|
||||
<< ", " << fdmex->GetAtmosphere()->GetDensity() );
|
||||
|
||||
if (fgGetBool("/sim/presets/running")) {
|
||||
for (int i=0; i < Propulsion->GetNumEngines(); i++) {
|
||||
SGPropertyNode * node = fgGetNode("engines/engine", i, true);
|
||||
node->setBoolValue("running", true);
|
||||
Propulsion->GetEngine(i)->SetRunning(true);
|
||||
}
|
||||
}
|
||||
|
||||
common_init();
|
||||
|
||||
copy_to_JSBsim();
|
||||
|
@ -399,12 +407,13 @@ void FGJSBsim::update( double dt )
|
|||
// Compute the potential movement of this aircraft and query for the
|
||||
// ground in this area.
|
||||
double groundCacheRadius = acrad + 2*dt*Propagate->GetUVW().Magnitude();
|
||||
double alt, slr, lat, lon;
|
||||
FGColumnVector3 cart = Auxiliary->GetLocationVRP();
|
||||
if ( needTrim && startup_trim->getBoolValue() ) {
|
||||
double alt = fgic->GetAltitudeFtIC();
|
||||
double slr = fgic->GetSeaLevelRadiusFtIC();
|
||||
double lat = fgic->GetLatitudeDegIC() * SGD_DEGREES_TO_RADIANS;
|
||||
double lon = fgic->GetLongitudeDegIC() * SGD_DEGREES_TO_RADIANS;
|
||||
alt = fgic->GetAltitudeFtIC();
|
||||
slr = fgic->GetSeaLevelRadiusFtIC();
|
||||
lat = fgic->GetLatitudeDegIC() * SGD_DEGREES_TO_RADIANS;
|
||||
lon = fgic->GetLongitudeDegIC() * SGD_DEGREES_TO_RADIANS;
|
||||
cart = FGLocation(lon, lat, alt+slr);
|
||||
}
|
||||
double cart_pos[3] = { cart(1), cart(2), cart(3) };
|
||||
|
@ -412,10 +421,14 @@ void FGJSBsim::update( double dt )
|
|||
groundCacheRadius );
|
||||
if (!cache_ok) {
|
||||
SG_LOG(SG_FLIGHT, SG_WARN,
|
||||
"FGInterface is beeing called without scenery below the aircraft!");
|
||||
return;
|
||||
"FGInterface is being called without scenery below the aircraft!");
|
||||
cout << "altitude = " << alt << endl;
|
||||
cout << "sea level radius = " << slr << endl;
|
||||
cout << "latitude = " << lat << endl;
|
||||
cout << "longitude = " << lon << endl;
|
||||
//return;
|
||||
}
|
||||
|
||||
|
||||
copy_to_JSBsim();
|
||||
|
||||
trimmed->setBoolValue(false);
|
||||
|
@ -544,7 +557,7 @@ bool FGJSBsim::copy_to_JSBsim()
|
|||
} // end FGEngine code block
|
||||
}
|
||||
|
||||
|
||||
|
||||
Propagate->SetSeaLevelRadius( get_Sea_level_radius() );
|
||||
|
||||
Atmosphere->SetExTemperature(
|
||||
|
@ -575,7 +588,7 @@ bool FGJSBsim::copy_to_JSBsim()
|
|||
SGPropertyNode* node = fgGetNode("/systems/refuel", true);
|
||||
Propulsion->SetRefuel(node->getDoubleValue("contact"));
|
||||
Propulsion->SetFuelFreeze((fgGetNode("/sim/freeze/fuel",true))->getBoolValue());
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -622,34 +635,9 @@ bool FGJSBsim::copy_from_JSBsim()
|
|||
Propagate->GetUVW(3) );
|
||||
|
||||
// Make the HUD work ...
|
||||
{
|
||||
const FGLocation& l = Auxiliary->GetLocationVRP();
|
||||
double xyz[3] = { l(eX)*SG_FEET_TO_METER,
|
||||
l(eY)*SG_FEET_TO_METER,
|
||||
l(eZ)*SG_FEET_TO_METER };
|
||||
double lat, lon, alt;
|
||||
sgCartToGeod(xyz, &lat, &lon, &alt);
|
||||
FGQuaternion Tec2geodhl(0, -0.5*M_PI-lat, lon);
|
||||
|
||||
FGColumnVector3 ecVel = l.GetTl2ec()*Propagate->GetVel();
|
||||
FGColumnVector3 geodhlVel = Tec2geodhl.GetT()*ecVel;
|
||||
|
||||
_set_Velocities_Ground( geodhlVel(eNorth)*SG_FEET_TO_METER,
|
||||
geodhlVel(eEast)*SG_FEET_TO_METER,
|
||||
-geodhlVel(eDown)*SG_FEET_TO_METER );
|
||||
|
||||
// Transform the acceleration to the earth centered frame and then
|
||||
// back to the geodetic hl frame.
|
||||
FGColumnVector3 accel = Propagate->GetUVWdot();
|
||||
accel -= Propagate->GetUVW()*Propagate->GetPQR();
|
||||
accel = Propagate->GetTb2l()*accel;
|
||||
accel = l.GetTl2ec()*accel;
|
||||
accel = Tec2geodhl.GetT()*accel;
|
||||
|
||||
_set_Accels_Local( accel(eNorth)*SG_FEET_TO_METER,
|
||||
accel(eEast)*SG_FEET_TO_METER,
|
||||
-accel(eDown)*SG_FEET_TO_METER);
|
||||
}
|
||||
_set_Velocities_Ground( Propagate->GetVel(eNorth),
|
||||
Propagate->GetVel(eEast),
|
||||
-Propagate->GetVel(eDown) );
|
||||
|
||||
_set_V_rel_wind( Auxiliary->GetVt() );
|
||||
|
||||
|
@ -825,6 +813,13 @@ bool FGJSBsim::copy_from_JSBsim()
|
|||
speedbrake_pos_pct->setDoubleValue( FCS->GetDsbPos(ofNorm) );
|
||||
spoilers_pos_pct->setDoubleValue( FCS->GetDspPos(ofNorm) );
|
||||
|
||||
// force a sim reset if crashed (altitude AGL < 0)
|
||||
if (get_Altitude_AGL() < 0.0) {
|
||||
fgSetBool("/sim/crashed", true);
|
||||
SGPropertyNode* node = fgGetNode("/sim/presets", true);
|
||||
globals->get_commands()->execute("old-reinit-dialog", node);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -182,13 +182,22 @@ void FGGain::convert(void)
|
|||
cout << endl;
|
||||
cout << " <component name=\"" << Name << "\" type=\"" << Type << "\">" << endl;
|
||||
|
||||
cout << " <input>" << (InputNodes[0]->GetFullyQualifiedName()).substr(12) << "</input>" << endl;
|
||||
if (invert)
|
||||
cout << " <input>-" << (InputNodes[0]->GetFullyQualifiedName()).substr(12) << "</input>" << endl;
|
||||
else
|
||||
cout << " <input>" << (InputNodes[0]->GetFullyQualifiedName()).substr(12) << "</input>" << endl;
|
||||
|
||||
if (Gain != 1.0)
|
||||
cout << " <gain>" << Gain << "</gain>" << endl;
|
||||
|
||||
if (Type == "PURE_GAIN") { // PURE_GAIN
|
||||
} else if (Type == "SCHEDULED_GAIN") { // SCHEDULED_GAIN
|
||||
cout << " <table>" << endl;
|
||||
cout << " <independentVar>" << ScheduledBy->GetFullyQualifiedName().substr(12) << "</independentVar>" << endl;
|
||||
cout << " <tableData>" << endl;
|
||||
Table->Print(20);
|
||||
cout << " </tableData>" << endl;
|
||||
cout << " </table>" << endl;
|
||||
} else if (Type == "AEROSURFACE_SCALE") { // AEROSURFACE_SCALE
|
||||
cout << " <limit>" << endl;
|
||||
cout << " <min>" << Min << "</min>" << endl;
|
||||
|
|
|
@ -131,7 +131,8 @@ static inline bool fgdPointInTriangle( sgdVec3 point, sgdVec3 tri[3] )
|
|||
SGDfloat tmp = (y2 - y3);
|
||||
SGDfloat tmpn = (x2 - x3);
|
||||
int side1 = SG_SIGN (tmp * (rx - x3) + (y3 - ry) * tmpn);
|
||||
int side2 = SG_SIGN (tmp * (x1 - x3) + (y3 - side1*eps - y1) * tmpn);
|
||||
int side2 = SG_SIGN (tmp * (x1 - x3) + (y3 - y1) * tmpn
|
||||
+ side1 * eps * fabs(tmpn));
|
||||
if ( side1 != side2 ) {
|
||||
// printf("failed side 1 check\n");
|
||||
return false;
|
||||
|
@ -141,7 +142,8 @@ static inline bool fgdPointInTriangle( sgdVec3 point, sgdVec3 tri[3] )
|
|||
tmp = (y3 - ry);
|
||||
tmpn = (x3 - rx);
|
||||
side1 = SG_SIGN (tmp * (x2 - rx) + (ry - y2) * tmpn);
|
||||
side2 = SG_SIGN (tmp * (x1 - rx) + (ry - side1*eps - y1) * tmpn);
|
||||
side2 = SG_SIGN (tmp * (x1 - rx) + (ry - y1) * tmpn
|
||||
+ side1 * eps * fabs(tmpn));
|
||||
if ( side1 != side2 ) {
|
||||
// printf("failed side 2 check\n");
|
||||
return false;
|
||||
|
@ -151,7 +153,8 @@ static inline bool fgdPointInTriangle( sgdVec3 point, sgdVec3 tri[3] )
|
|||
tmp = (y2 - ry);
|
||||
tmpn = (x2 - rx);
|
||||
side1 = SG_SIGN (tmp * (x3 - rx) + (ry - y3) * tmpn);
|
||||
side2 = SG_SIGN (tmp * (x1 - rx) + (ry - side1*eps - y1) * tmpn);
|
||||
side2 = SG_SIGN (tmp * (x1 - rx) + (ry - y1) * tmpn
|
||||
+ side1 * eps * fabs(tmpn));
|
||||
if ( side1 != side2 ) {
|
||||
// printf("failed side 3 check\n");
|
||||
return false;
|
||||
|
|
|
@ -187,7 +187,8 @@ static inline bool fgdPointInTriangle( sgdVec3 point, sgdVec3 tri[3] )
|
|||
SGDfloat tmp = (y2 - y3);
|
||||
SGDfloat tmpn = (x2 - x3);
|
||||
int side1 = SG_SIGN (tmp * (rx - x3) + (y3 - ry) * tmpn);
|
||||
int side2 = SG_SIGN (tmp * (x1 - x3) + (y3 - side1*eps - y1) * tmpn);
|
||||
int side2 = SG_SIGN (tmp * (x1 - x3) + (y3 - y1) * tmpn
|
||||
+ side1 * eps * fabs(tmpn));
|
||||
if ( side1 != side2 ) {
|
||||
// printf("failed side 1 check\n");
|
||||
return false;
|
||||
|
@ -197,7 +198,8 @@ static inline bool fgdPointInTriangle( sgdVec3 point, sgdVec3 tri[3] )
|
|||
tmp = (y3 - ry);
|
||||
tmpn = (x3 - rx);
|
||||
side1 = SG_SIGN (tmp * (x2 - rx) + (ry - y2) * tmpn);
|
||||
side2 = SG_SIGN (tmp * (x1 - rx) + (ry - side1*eps - y1) * tmpn);
|
||||
side2 = SG_SIGN (tmp * (x1 - rx) + (ry - y1) * tmpn
|
||||
+ side1 * eps * fabs(tmpn));
|
||||
if ( side1 != side2 ) {
|
||||
// printf("failed side 2 check\n");
|
||||
return false;
|
||||
|
@ -207,7 +209,8 @@ static inline bool fgdPointInTriangle( sgdVec3 point, sgdVec3 tri[3] )
|
|||
tmp = (y2 - ry);
|
||||
tmpn = (x2 - rx);
|
||||
side1 = SG_SIGN (tmp * (x3 - rx) + (ry - y3) * tmpn);
|
||||
side2 = SG_SIGN (tmp * (x1 - rx) + (ry - side1*eps - y1) * tmpn);
|
||||
side2 = SG_SIGN (tmp * (x1 - rx) + (ry - y1) * tmpn
|
||||
+ side1 * eps * fabs(tmpn));
|
||||
if ( side1 != side2 ) {
|
||||
// printf("failed side 3 check\n");
|
||||
return false;
|
||||
|
|
Loading…
Reference in a new issue