Fix X-Plane follow aircraft

This commit fixes two bugs:
- The camera position was never initialized until space was pressed. The camera position was therefore random
- Instead of saving the camera position, we actually want to save the delta camera position.

ref T465
This commit is contained in:
Roland Rossgotterer
2018-12-11 15:03:42 +01:00
committed by Klaus Basan
parent 08558a0803
commit 901cf34bc8
2 changed files with 40 additions and 35 deletions

View File

@@ -872,7 +872,7 @@ namespace XSwiftBus
{
// Ideally we would like to test against right mouse button, but X-Plane SDK does not
// allow that.
if (traffic->m_isSpacePressed)
if (!traffic->m_deltaCameraPosition.isInitialized || traffic->m_isSpacePressed)
{
int w, h, x, y;
// First get the screen size and mouse location. We will use this to decide
@@ -880,50 +880,45 @@ namespace XSwiftBus
// fixme: In a future update, change the orbit only while right mouse button is pressed.
XPLMGetScreenSize(&w, &h);
XPLMGetMouseLocation(&x, &y);
double heading = 360.0 * static_cast<double>(x) / static_cast<double>(w);
double pitch = 20.0 * ((static_cast<double>(y) / static_cast<double>(h)) * 2.0 - 1.0);
traffic->m_deltaCameraPosition.heading = 360.0 * static_cast<double>(x) / static_cast<double>(w);
traffic->m_deltaCameraPosition.pitch = 20.0 * ((static_cast<double>(y) / static_cast<double>(h)) * 2.0 - 1.0);
// Now calculate where the camera should be positioned to be 200
// meters from the plane and pointing at the plane at the pitch and
// heading we wanted above.
static const double PI = std::acos(-1);
double dx = -50.0 * sin(heading * PI / 180.0);
double dz = 50.0 * cos(heading * PI / 180.0);
double dy = -50.0 * tan(pitch * PI / 180.0);
traffic->m_deltaCameraPosition.dx = -50.0 * sin(traffic->m_deltaCameraPosition.heading * PI / 180.0);
traffic->m_deltaCameraPosition.dz = 50.0 * cos(traffic->m_deltaCameraPosition.heading * PI / 180.0);
traffic->m_deltaCameraPosition.dy = -50.0 * tan(traffic->m_deltaCameraPosition.pitch * PI / 180.0);
double lx, ly, lz;
static const double kFtToMeters = 0.3048;
traffic->m_deltaCameraPosition.isInitialized = true;
}
if (traffic->m_followPlaneViewCallsign == traffic->ownAircraftString())
{
lx = traffic->m_ownAircraftPositionX.get();
ly = traffic->m_ownAircraftPositionY.get();
lz = traffic->m_ownAircraftPositionZ.get();
}
else
{
auto planeIt = traffic->m_planesByCallsign.find(traffic->m_followPlaneViewCallsign);
if (planeIt == traffic->m_planesByCallsign.end()) { return 0; }
Plane *plane = planeIt->second;
double lx, ly, lz;
static const double kFtToMeters = 0.3048;
XPLMWorldToLocal(plane->position.lat, plane->position.lon, plane->position.elevation * kFtToMeters, &lx, &ly, &lz);
}
if (traffic->m_followPlaneViewCallsign == traffic->ownAircraftString())
{
lx = traffic->m_ownAircraftPositionX.get();
ly = traffic->m_ownAircraftPositionY.get();
lz = traffic->m_ownAircraftPositionZ.get();
}
else
{
auto planeIt = traffic->m_planesByCallsign.find(traffic->m_followPlaneViewCallsign);
if (planeIt == traffic->m_planesByCallsign.end()) { return 0; }
Plane *plane = planeIt->second;
// Fill out the camera position info.
traffic->m_lastCameraPosition.x = static_cast<float>(lx + dx);
traffic->m_lastCameraPosition.y = static_cast<float>(ly + dy);
traffic->m_lastCameraPosition.z = static_cast<float>(lz + dz);
traffic->m_lastCameraPosition.pitch = static_cast<float>(pitch);
traffic->m_lastCameraPosition.heading = static_cast<float>(heading);
XPLMWorldToLocal(plane->position.lat, plane->position.lon, plane->position.elevation * kFtToMeters, &lx, &ly, &lz);
}
// Fill out the camera position info.
cameraPosition->x = traffic->m_lastCameraPosition.x;
cameraPosition->y = traffic->m_lastCameraPosition.y;
cameraPosition->z = traffic->m_lastCameraPosition.z;
cameraPosition->pitch = traffic->m_lastCameraPosition.pitch;
cameraPosition->heading = traffic->m_lastCameraPosition.heading;
cameraPosition->roll = 0;
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->roll = 0.0;
}
// Return 1 to indicate we want to keep controlling the camera.