mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-07 02:35:33 +08:00
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:
committed by
Klaus Basan
parent
08558a0803
commit
901cf34bc8
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user