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 08ba4d8f65
commit 038a2ffdf0
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, 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) 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++) for (size_t i = 0; i < callsigns.size(); i++)
{ {
auto planeIt = m_planesByCallsign.find(callsigns.at(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.pitch = static_cast<float>(pitchesDeg.at(i));
plane->position.roll = static_cast<float>(rollsDeg.at(i)); plane->position.roll = static_cast<float>(rollsDeg.at(i));
plane->position.heading = static_cast<float>(headingsDeg.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. // heading we wanted above.
const double distanceMeterM = static_cast<double>(std::max(10, traffic->getSettings().getFollowAircraftDistanceM())); const double distanceMeterM = static_cast<double>(std::max(10, traffic->getSettings().getFollowAircraftDistanceM()));
static const double PI = std::acos(-1); static const double PI = std::acos(-1);
traffic->m_deltaCameraPosition.dx = -distanceMeterM * sin(traffic->m_deltaCameraPosition.headingDeg * PI / 180.0); traffic->m_deltaCameraPosition.dxMeters = -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.dzMeters = 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.dyMeters = -distanceMeterM * tan(traffic->m_deltaCameraPosition.pitchDeg * PI / 180.0);
traffic->m_deltaCameraPosition.isInitialized = true; 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; static const double kFtToMeters = 0.3048;
if (traffic->m_followPlaneViewCallsign == CTraffic::ownAircraftString()) if (traffic->m_followPlaneViewCallsign == CTraffic::ownAircraftString())
{ {
lx = traffic->m_ownAircraftPositionX.get(); lxMeters = traffic->m_ownAircraftPositionX.get();
ly = traffic->m_ownAircraftPositionY.get(); lyMeters = traffic->m_ownAircraftPositionY.get();
lz = traffic->m_ownAircraftPositionZ.get(); lzMeters = traffic->m_ownAircraftPositionZ.get();
} }
else else
{ {
@@ -1013,15 +1014,20 @@ namespace XSwiftBus
WARNING_LOG("Pos: " + pos2String(plane->position)); WARNING_LOG("Pos: " + pos2String(plane->position));
return 0; 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. // Fill out the camera position info.
cameraPosition->x = static_cast<float>(lx + traffic->m_deltaCameraPosition.dx); cameraPosition->x = static_cast<float>(lxMeters + traffic->m_deltaCameraPosition.dxMeters);
cameraPosition->y = static_cast<float>(ly + traffic->m_deltaCameraPosition.dy); cameraPosition->y = static_cast<float>(lyMeters + traffic->m_deltaCameraPosition.dyMeters);
cameraPosition->z = static_cast<float>(lz + traffic->m_deltaCameraPosition.dz); cameraPosition->z = static_cast<float>(lzMeters + traffic->m_deltaCameraPosition.dzMeters);
// cameraPosition->pitch = static_cast<float>(traffic->m_deltaCameraPosition.pitch);
// cameraPosition->heading = static_cast<float>(traffic->m_deltaCameraPosition.heading);
cameraPosition->pitch = CTraffic::normalizeToPlusMinus180Deg(static_cast<float>(traffic->m_deltaCameraPosition.pitchDeg)); cameraPosition->pitch = CTraffic::normalizeToPlusMinus180Deg(static_cast<float>(traffic->m_deltaCameraPosition.pitchDeg));
cameraPosition->heading = CTraffic::normalizeToPlusMinus180Deg(static_cast<float>(traffic->m_deltaCameraPosition.headingDeg)); cameraPosition->heading = CTraffic::normalizeToPlusMinus180Deg(static_cast<float>(traffic->m_deltaCameraPosition.headingDeg));
cameraPosition->roll = 0.0; cameraPosition->roll = 0.0;

View File

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