mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-12-01 09:24:10 +01:00
LP-29 fix osg attitude handling issue when pitch close to +/-90 (thank you @liftbag for reporting it)
This commit is contained in:
parent
96ed1e40ba
commit
bdb42246e8
@ -252,7 +252,7 @@ public:
|
||||
// disable any installed camera manipulator
|
||||
// TODO create and use own camera manipulator to avoid disabling ON_DEMAND frame update scheme
|
||||
// see https://github.com/gwaldron/osgearth/commit/796daf4792ccaf18ae7eb6a5cb268eef0d42888d
|
||||
// TODO see StandardManaipulator for example on how to react to events (tohabd FOV changes without the need for an update callback?)
|
||||
// TODO see StandardManipulator for an example on how to react to events (to have FOV changes without the need for an update callback?)
|
||||
cm = NULL;
|
||||
break;
|
||||
case ManipulatorMode::Earth:
|
||||
@ -331,23 +331,24 @@ public:
|
||||
}
|
||||
fovDirty = false;
|
||||
|
||||
// qDebug() << "OSGCamera::updateCameraFOV";
|
||||
qDebug() << "OSGCamera::updateCameraFOV" << fieldOfView;
|
||||
|
||||
double fovy, ar, zn, zf;
|
||||
|
||||
camera->getProjectionMatrixAsPerspective(fovy, ar, zn, zf);
|
||||
|
||||
fovy = fieldOfView;
|
||||
camera->setProjectionMatrixAsPerspective(fovy, ar, zn, zf);
|
||||
}
|
||||
|
||||
void updateAspectRatio()
|
||||
{
|
||||
double fovy, ar, zn, zf;
|
||||
|
||||
camera->getProjectionMatrixAsPerspective(fovy, ar, zn, zf);
|
||||
|
||||
osg::Viewport *viewport = camera->getViewport();
|
||||
ar = static_cast<double>(viewport->width()) / static_cast<double>(viewport->height());
|
||||
double aspectRatio = static_cast<double>(viewport->width()) / static_cast<double>(viewport->height());
|
||||
|
||||
qDebug() << "OSGCamera::updateAspectRatio" << aspectRatio;
|
||||
|
||||
double fovy, ar, zn, zf;
|
||||
camera->getProjectionMatrixAsPerspective(fovy, ar, zn, zf);
|
||||
ar = aspectRatio;
|
||||
camera->setProjectionMatrixAsPerspective(fovy, ar, zn, zf);
|
||||
}
|
||||
|
||||
@ -392,10 +393,13 @@ public:
|
||||
osg::DegreesToRadians(0.0), osg::Vec3(0.0, 0.0, 1.0));
|
||||
|
||||
// Final camera matrix
|
||||
double roll = osg::DegreesToRadians(attitude.x());
|
||||
double pitch = osg::DegreesToRadians(attitude.y());
|
||||
double yaw = osg::DegreesToRadians(attitude.z());
|
||||
osg::Matrix cameraMatrix = cameraRotation
|
||||
* osg::Matrix::rotate(osg::DegreesToRadians(attitude.x()), osg::Vec3(1.0, 0.0, 0.0))
|
||||
* osg::Matrix::rotate(osg::DegreesToRadians(attitude.y()), osg::Vec3(0.0, 1.0, 0.0))
|
||||
* osg::Matrix::rotate(osg::DegreesToRadians(attitude.z()), osg::Vec3(0.0, 0.0, 1.0)) * cameraPosition;
|
||||
* osg::Matrix::rotate(roll, osg::Vec3(0, 1, 0))
|
||||
* osg::Matrix::rotate(pitch, osg::Vec3(1, 0, 0))
|
||||
* osg::Matrix::rotate(yaw, osg::Vec3(0, 0, -1.0)) * cameraPosition;
|
||||
|
||||
// Inverse the camera's position and orientation matrix to obtain the view matrix
|
||||
cameraMatrix = osg::Matrix::inverse(cameraMatrix);
|
||||
|
@ -194,10 +194,13 @@ public:
|
||||
|
||||
osg::Quat localRotation()
|
||||
{
|
||||
osg::Quat q = osg::Quat(
|
||||
osg::DegreesToRadians(attitude.x()), osg::Vec3d(1, 0, 0),
|
||||
osg::DegreesToRadians(attitude.y()), osg::Vec3d(0, 1, 0),
|
||||
osg::DegreesToRadians(attitude.z()), osg::Vec3d(0, 0, 1));
|
||||
double roll = osg::DegreesToRadians(attitude.x());
|
||||
double pitch = osg::DegreesToRadians(attitude.y());
|
||||
double yaw = osg::DegreesToRadians(attitude.z());
|
||||
osg::Quat q = osg::Quat(
|
||||
roll, osg::Vec3d(0, 1, 0),
|
||||
pitch, osg::Vec3d(1, 0, 0),
|
||||
yaw, osg::Vec3d(0, 0, -1));
|
||||
|
||||
return q;
|
||||
}
|
||||
|
@ -147,7 +147,7 @@ void OsgEarth::initializeCache()
|
||||
} else {
|
||||
qWarning() << "OsgEarth::initializeCache - Failed to initialize cache";
|
||||
}
|
||||
#endif
|
||||
#endif // ifdef USE_OSGEARTH
|
||||
}
|
||||
|
||||
void OsgEarth::displayInfo()
|
||||
|
@ -81,7 +81,7 @@ Qt.include("common.js")
|
||||
*/
|
||||
|
||||
function attitude() {
|
||||
return Qt.vector3d(attitudeState.pitch, attitudeState.roll, -attitudeState.yaw);
|
||||
return Qt.vector3d(attitudeState.roll, attitudeState.pitch, attitudeState.yaw);
|
||||
}
|
||||
|
||||
function attitudeRoll() {
|
||||
|
Loading…
Reference in New Issue
Block a user