QGIS API Documentation  3.10.0-A Coruña (6c816b4204)
qgscameracontroller.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgscameracontroller.h
3  --------------------------------------
4  Date : July 2017
5  Copyright : (C) 2017 by Martin Dobias
6  Email : wonder dot sk at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #ifndef QGSCAMERACONTROLLER_H
17 #define QGSCAMERACONTROLLER_H
18 
19 #include "qgis_3d.h"
20 
21 #include <QPointer>
22 #include <QRect>
23 #include <Qt3DCore/QEntity>
24 
25 namespace Qt3DInput
26 {
27  class QKeyEvent;
28  class QKeyboardDevice;
29  class QKeyboardHandler;
30  class QMouseEvent;
31  class QMouseDevice;
32  class QMouseHandler;
33  class QWheelEvent;
34 }
35 
36 namespace Qt3DRender
37 {
38  class QCamera;
39  class QPickEvent;
40 }
41 
42 #include "qgscamerapose.h"
43 
44 class QDomDocument;
45 class QDomElement;
46 
47 class QgsCameraPose;
48 class QgsTerrainEntity;
49 class QgsVector3D;
50 
56 class _3D_EXPORT QgsCameraController : public Qt3DCore::QEntity
57 {
58  Q_OBJECT
59  Q_PROPERTY( Qt3DRender::QCamera *camera READ camera WRITE setCamera NOTIFY cameraChanged )
60  Q_PROPERTY( QRect viewport READ viewport WRITE setViewport NOTIFY viewportChanged )
61  public:
63  QgsCameraController( Qt3DCore::QNode *parent = nullptr );
64 
66  Qt3DRender::QCamera *camera() const { return mCamera; }
68  QRect viewport() const { return mViewport; }
69 
75  void setTerrainEntity( QgsTerrainEntity *te );
76 
78  void setCamera( Qt3DRender::QCamera *camera );
80  void setViewport( QRect viewport );
82  void frameTriggered( float dt );
83 
85  void resetView( float distance );
86 
88  void setViewFromTop( float worldX, float worldY, float distance, float yaw = 0 );
89 
91  QgsVector3D lookingAtPoint() const;
92 
99  void setLookingAtPoint( const QgsVector3D &point, float distance, float pitch, float yaw );
100 
105  void setCameraPose( const QgsCameraPose &camPose );
106 
111  QgsCameraPose cameraPose() const { return mCameraPose; }
112 
117  float distance() const { return mCameraPose.distanceFromCenterPoint(); }
118 
124  float pitch() const { return mCameraPose.pitchAngle(); }
125 
131  float yaw() const { return mCameraPose.headingAngle(); }
132 
134  QDomElement writeXml( QDomDocument &doc ) const;
136  void readXml( const QDomElement &elem );
137 
139  void zoom( float factor );
141  void tiltUpAroundViewCenter( float deltaPitch );
143  void rotateAroundViewCenter( float deltaYaw );
145  void setCameraHeadingAngle( float angle );
147  void moveView( float tx, float ty );
148 
149  private:
150  void rotateCamera( float diffPitch, float diffYaw );
151  void updateCameraFromPose( bool centerPointChanged = false );
152 
153  signals:
155  void cameraChanged();
157  void viewportChanged();
158 
159  private slots:
160  void onPositionChanged( Qt3DInput::QMouseEvent *mouse );
161  void onWheel( Qt3DInput::QWheelEvent *wheel );
162  void onMousePressed( Qt3DInput::QMouseEvent *mouse );
163  void onMouseReleased( Qt3DInput::QMouseEvent *mouse );
164  void onKeyPressed( Qt3DInput::QKeyEvent *event );
165  void onKeyReleased( Qt3DInput::QKeyEvent *event );
166  void onPickerMousePressed( Qt3DRender::QPickEvent *pick );
167 
168  private:
170  Qt3DRender::QCamera *mCamera = nullptr;
172  QRect mViewport;
174  float mLastPressedHeight = 0;
175 
176  QPointer<QgsTerrainEntity> mTerrainEntity;
177 
179  QgsCameraPose mCameraPose;
180 
182  QPoint mMousePos;
183 
185  Qt3DInput::QMouseDevice *mMouseDevice = nullptr;
186  Qt3DInput::QKeyboardDevice *mKeyboardDevice = nullptr;
187 
188  Qt3DInput::QMouseHandler *mMouseHandler = nullptr;
189  Qt3DInput::QKeyboardHandler *mKeyboardHandler = nullptr;
190 
191 };
192 
193 #endif // QGSCAMERACONTROLLER_H
3 Class for storage of 3D vectors similar to QVector3D, with the difference that it uses double preci...
Definition: qgsvector3d.h:31
QgsCameraPose cameraPose() const
Returns camera pose.
float pitch() const
Returns pitch angle in degrees (0 = looking from the top, 90 = looking from the side).
QRect viewport() const
Returns viewport rectangle.
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
Definition: MathUtils.cpp:786
3 Class that encapsulates camera pose in a 3D scene.
Definition: qgscamerapose.h:41
float yaw() const
Returns yaw angle in degrees.
3 Object that controls camera movement based on user input
float distance() const
Returns distance of the camera from the point it is looking at.