mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-25 18:25:42 +08:00
Ref T709, avoid camera below ground if aircraft is on ground
This commit is contained in:
committed by
Mat Sutcliffe
parent
08ba4d8f65
commit
038a2ffdf0
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user