20#include <Qt3DRender/QCamera> 
   22#include <QDomDocument> 
   26  QDomElement elemCamera = doc.createElement( QStringLiteral( 
"camera-pose" ) );
 
   27  elemCamera.setAttribute( QStringLiteral( 
"x" ), mCenterPoint.
x() );
 
   28  elemCamera.setAttribute( QStringLiteral( 
"y" ), mCenterPoint.
y() );
 
   29  elemCamera.setAttribute( QStringLiteral( 
"z" ), mCenterPoint.
z() );
 
   30  elemCamera.setAttribute( QStringLiteral( 
"dist" ), mDistanceFromCenterPoint );
 
   31  elemCamera.setAttribute( QStringLiteral( 
"pitch" ), mPitchAngle );
 
   32  elemCamera.setAttribute( QStringLiteral( 
"heading" ), mHeadingAngle );
 
 
   38  const double x = elem.attribute( QStringLiteral( 
"x" ) ).toDouble();
 
   39  const double y = elem.attribute( QStringLiteral( 
"y" ) ).toDouble();
 
   40  const double z = elem.attribute( QStringLiteral( 
"z" ) ).toDouble();
 
   43  mDistanceFromCenterPoint = elem.attribute( QStringLiteral( 
"dist" ) ).toFloat();
 
   44  mPitchAngle = elem.attribute( QStringLiteral( 
"pitch" ) ).toFloat();
 
   45  mHeadingAngle = elem.attribute( QStringLiteral( 
"heading" ) ).toFloat();
 
 
   51  if ( std::isnan( point.
x() ) || std::isnan( point.
y() ) || std::isnan( point.
z() ) )
 
   52    qWarning() << 
"Not updating camera position: it cannot be NaN!";
 
 
   59  mDistanceFromCenterPoint = std::max( distance, 10.0f );
 
 
   65  mPitchAngle = std::clamp( pitch, 0.0f, 180.0f );
 
 
   72  QVector3D cameraToCenter = q * QVector3D( 0, 0, -mDistanceFromCenterPoint );
 
   73  camera->setUpVector( q * QVector3D( 0, 1, 0 ) );
 
   74  camera->setPosition( mCenterPoint.
toVector3D() - cameraToCenter );
 
   75  camera->setViewCenter( mCenterPoint.
toVector3D() );
 
 
   88  QVector3D viewCenter = mCenterPoint.
toVector3D();
 
   92  QQuaternion qLatLon = QQuaternion::fromAxisAndAngle( QVector3D( 0, 0, 1 ), 
static_cast<float>( lon ) ) * QQuaternion::fromAxisAndAngle( QVector3D( 0, -1, 0 ), 
static_cast<float>( lat ) );
 
   95  QQuaternion qPitchHeading = QQuaternion::fromAxisAndAngle( QVector3D( 1, 0, 0 ), mHeadingAngle ) * QQuaternion::fromAxisAndAngle( QVector3D( 0, 1, 0 ), mPitchAngle );
 
   98  QQuaternion q = qLatLon * qPitchHeading;
 
  100  QVector3D cameraToCenter = ( q * QVector3D( -1, 0, 0 ) ) * mDistanceFromCenterPoint;
 
  101  camera->setUpVector( q * QVector3D( 0, 0, 1 ) );
 
  102  camera->setPosition( viewCenter - cameraToCenter );
 
  103  camera->setViewCenter( viewCenter );
 
 
static QQuaternion rotationFromPitchHeadingAngles(float pitchAngle, float headingAngle)
Returns rotation quaternion that performs rotation around X axis by pitchAngle, followed by rotation ...
 
void updateCameraGlobe(Qt3DRender::QCamera *camera, double lat, double lon)
Updates camera when using a globe scene.
 
void setPitchAngle(float pitch)
Sets pitch angle in degrees.
 
QDomElement writeXml(QDomDocument &doc) const
Writes configuration to a new DOM element and returns it.
 
void setCenterPoint(const QgsVector3D &point)
Sets center point (towards which point the camera is looking)
 
void readXml(const QDomElement &elem)
Reads configuration from a DOM element previously written using writeXml()
 
void setDistanceFromCenterPoint(float distance)
Sets distance of the camera from the center point.
 
void updateCamera(Qt3DRender::QCamera *camera)
Update Qt3D camera view matrix based on the pose.
 
A 3D vector (similar to QVector3D) with the difference that it uses double precision instead of singl...
 
double y() const
Returns Y coordinate.
 
double z() const
Returns Z coordinate.
 
QVector3D toVector3D() const
Converts the current object to QVector3D.
 
double x() const
Returns X coordinate.