Ref T709, avoid camera below ground if aircraft is on ground

This commit is contained in:
Klaus Basan
2019-08-11 17:22:28 +02:00
committed by Mat Sutcliffe
parent 55690b423f
commit 93bf6cb44c
2 changed files with 26 additions and 19 deletions

View File

@@ -387,8 +387,7 @@ namespace XSwiftBus
void CTraffic::setPlanesPositions(const std::vector<std::string> &callsigns, std::vector<double> latitudesDeg, std::vector<double> longitudesDeg, std::vector<double> altitudesFt,
std::vector<double> pitchesDeg, std::vector<double> rollsDeg, std::vector<double> headingsDeg, const std::vector<bool> &onGrounds)
{
(void)onGrounds;
const bool setOnGround = onGrounds.size() == callsigns.size();
for (size_t i = 0; i < callsigns.size(); i++)
{
auto planeIt = m_planesByCallsign.find(callsigns.at(i));
@@ -402,6 +401,8 @@ namespace XSwiftBus
plane->position.pitch = static_cast<float>(pitchesDeg.at(i));
plane->position.roll = static_cast<float>(rollsDeg.at(i));
plane->position.heading = static_cast<float>(headingsDeg.at(i));
if (setOnGround) { plane->isOnGround = onGrounds.at(i); }
}
}
@@ -959,21 +960,21 @@ namespace XSwiftBus
// heading we wanted above.
const double distanceMeterM = static_cast<double>(std::max(10, traffic->getSettings().getFollowAircraftDistanceM()));
static const double PI = std::acos(-1);
traffic->m_deltaCameraPosition.dx = -distanceMeterM * sin(traffic->m_deltaCameraPosition.headingDeg * PI / 180.0);
traffic->m_deltaCameraPosition.dz = distanceMeterM * cos(traffic->m_deltaCameraPosition.headingDeg * PI / 180.0);
traffic->m_deltaCameraPosition.dy = -distanceMeterM * tan(traffic->m_deltaCameraPosition.pitchDeg * PI / 180.0);
traffic->m_deltaCameraPosition.dxMeters = -distanceMeterM * sin(traffic->m_deltaCameraPosition.headingDeg * PI / 180.0);
traffic->m_deltaCameraPosition.dzMeters = distanceMeterM * cos(traffic->m_deltaCameraPosition.headingDeg * PI / 180.0);
traffic->m_deltaCameraPosition.dyMeters = -distanceMeterM * tan(traffic->m_deltaCameraPosition.pitchDeg * PI / 180.0);
traffic->m_deltaCameraPosition.isInitialized = true;
}
double lx = 0, ly = 0, lz = 0; // normally init not needed, just to avoid any issues
double lxMeters = 0, lyMeters = 0, lzMeters = 0; // normally init not needed, just to avoid any issues
static const double kFtToMeters = 0.3048;
if (traffic->m_followPlaneViewCallsign == CTraffic::ownAircraftString())
{
lx = traffic->m_ownAircraftPositionX.get();
ly = traffic->m_ownAircraftPositionY.get();
lz = traffic->m_ownAircraftPositionZ.get();
lxMeters = traffic->m_ownAircraftPositionX.get();
lyMeters = traffic->m_ownAircraftPositionY.get();
lzMeters = traffic->m_ownAircraftPositionZ.get();
}
else
{
@@ -1013,15 +1014,20 @@ namespace XSwiftBus
WARNING_LOG("Pos: " + pos2String(plane->position));
return 0;
}
XPLMWorldToLocal(plane->position.lat, plane->position.lon, plane->position.elevation * kFtToMeters, &lx, &ly, &lz);
// avoid underflow of camera into ground
if (plane->isOnGround)
{
if (traffic->m_deltaCameraPosition.dyMeters < 5) { traffic->m_deltaCameraPosition.dyMeters = 5; }
}
XPLMWorldToLocal(plane->position.lat, plane->position.lon, plane->position.elevation * kFtToMeters, &lxMeters, &lyMeters, &lzMeters);
}
// Fill out the camera position info.
cameraPosition->x = static_cast<float>(lx + traffic->m_deltaCameraPosition.dx);
cameraPosition->y = static_cast<float>(ly + traffic->m_deltaCameraPosition.dy);
cameraPosition->z = static_cast<float>(lz + traffic->m_deltaCameraPosition.dz);
// cameraPosition->pitch = static_cast<float>(traffic->m_deltaCameraPosition.pitch);
// cameraPosition->heading = static_cast<float>(traffic->m_deltaCameraPosition.heading);
cameraPosition->x = static_cast<float>(lxMeters + traffic->m_deltaCameraPosition.dxMeters);
cameraPosition->y = static_cast<float>(lyMeters + traffic->m_deltaCameraPosition.dyMeters);
cameraPosition->z = static_cast<float>(lzMeters + traffic->m_deltaCameraPosition.dzMeters);
cameraPosition->pitch = CTraffic::normalizeToPlusMinus180Deg(static_cast<float>(traffic->m_deltaCameraPosition.pitchDeg));
cameraPosition->heading = CTraffic::normalizeToPlusMinus180Deg(static_cast<float>(traffic->m_deltaCameraPosition.headingDeg));
cameraPosition->roll = 0.0;

View File

@@ -139,9 +139,9 @@ namespace XSwiftBus
//! Camera
struct DeltaCameraPosition
{
double dx = 0.0;
double dy = 0.0;
double dz = 0.0;
double dxMeters = 0.0;
double dyMeters = 0.0;
double dzMeters = 0.0;
double headingDeg = 0.0;
double pitchDeg = 0.0;
bool isInitialized = false;
@@ -177,7 +177,8 @@ namespace XSwiftBus
std::string modelName;
std::string nightTextureMode;
bool hasSurfaces = false;
bool hasXpdr = false;
bool hasXpdr = false;
bool isOnGround = false;
char label[32] {};
CTerrainProbe terrainProbe;
XPMPPlaneSurfaces_t surfaces;