QGIS API Documentation  3.4.15-Madeira (e83d02e274)
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 
138  private:
139  void rotateCamera( float diffPitch, float diffYaw );
140  void updateCameraFromPose( bool centerPointChanged = false );
141 
142  signals:
144  void cameraChanged();
146  void viewportChanged();
147 
148  private slots:
149  void onPositionChanged( Qt3DInput::QMouseEvent *mouse );
150  void onWheel( Qt3DInput::QWheelEvent *wheel );
151  void onMousePressed( Qt3DInput::QMouseEvent *mouse );
152  void onMouseReleased( Qt3DInput::QMouseEvent *mouse );
153  void onKeyPressed( Qt3DInput::QKeyEvent *event );
154  void onKeyReleased( Qt3DInput::QKeyEvent *event );
155  void onPickerMousePressed( Qt3DRender::QPickEvent *pick );
156 
157  private:
159  Qt3DRender::QCamera *mCamera = nullptr;
161  QRect mViewport;
163  float mLastPressedHeight = 0;
164 
165  QPointer<QgsTerrainEntity> mTerrainEntity;
166 
168  QgsCameraPose mCameraPose;
169 
171  QPoint mMousePos;
172 
174  Qt3DInput::QMouseDevice *mMouseDevice = nullptr;
175  Qt3DInput::QKeyboardDevice *mKeyboardDevice = nullptr;
176 
177  Qt3DInput::QMouseHandler *mMouseHandler = nullptr;
178  Qt3DInput::QKeyboardHandler *mKeyboardHandler = nullptr;
179 
180 };
181 
182 #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
float distance() const
Returns distance of the camera from the point it is looking at.
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
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.