QGIS API Documentation 3.29.0-Master (19d7edcfed)
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#include <Qt3DInput/QMouseEvent>
25#include <QImage>
26
27namespace Qt3DInput
28{
29 class QKeyEvent;
30 class QKeyboardDevice;
31 class QKeyboardHandler;
32 class QMouseEvent;
33 class QMouseDevice;
34 class QMouseHandler;
35 class QWheelEvent;
36}
37
38namespace Qt3DRender
39{
40 class QCamera;
41 class QPickEvent;
42}
43
44#include "qgscamerapose.h"
45
46class QDomDocument;
47class QDomElement;
48
49class QgsCameraPose;
50class QgsTerrainEntity;
51class QgsVector3D;
52
53#define SIP_NO_FILE
54
61class _3D_EXPORT QgsCameraController : public Qt3DCore::QEntity
62{
63 Q_OBJECT
64 Q_PROPERTY( Qt3DRender::QCamera *camera READ camera WRITE setCamera NOTIFY cameraChanged )
65 Q_PROPERTY( QRect viewport READ viewport WRITE setViewport NOTIFY viewportChanged )
66 public:
67
70 {
72 WalkNavigation
73 };
74 Q_ENUM( NavigationMode )
75
76
78 {
82 };
83 Q_ENUM( VerticalAxisInversion )
84
85 public:
87 QgsCameraController( Qt3DCore::QNode *parent = nullptr );
88
90 Qt3DRender::QCamera *camera() const { return mCamera; }
92 QRect viewport() const { return mViewport; }
93
98 QgsCameraController::NavigationMode cameraNavigationMode() const { return mCameraNavigationMode; }
99
104 double cameraMovementSpeed() const { return mCameraMovementSpeed; }
105
110 void setCameraMovementSpeed( double movementSpeed );
111
116 QgsCameraController::VerticalAxisInversion verticalAxisInversion() const { return mVerticalAxisInversion; }
117
122 void setVerticalAxisInversion( QgsCameraController::VerticalAxisInversion inversion );
123
129 void setTerrainEntity( QgsTerrainEntity *te );
130
132 void setCamera( Qt3DRender::QCamera *camera );
134 void setViewport( QRect viewport );
136 void frameTriggered( float dt );
137
139 void resetView( float distance );
140
142 void setViewFromTop( float worldX, float worldY, float distance, float yaw = 0 );
143
145 QgsVector3D lookingAtPoint() const;
146
153 void setLookingAtPoint( const QgsVector3D &point, float distance, float pitch, float yaw );
154
159 void setCameraPose( const QgsCameraPose &camPose );
160
165 QgsCameraPose cameraPose() const { return mCameraPose; }
166
172 float distance() const { return mCameraPose.distanceFromCenterPoint(); }
173
179 float pitch() const { return mCameraPose.pitchAngle(); }
180
186 float yaw() const { return mCameraPose.headingAngle(); }
187
189 QDomElement writeXml( QDomDocument &doc ) const;
191 void readXml( const QDomElement &elem );
192
194 void zoom( float factor );
196 void tiltUpAroundViewCenter( float deltaPitch );
198 void rotateAroundViewCenter( float deltaYaw );
200 void setCameraHeadingAngle( float angle );
202 void moveView( float tx, float ty );
203
209 bool willHandleKeyEvent( QKeyEvent *event );
210
211 public slots:
212
217 void setCameraNavigationMode( QgsCameraController::NavigationMode navigationMode );
218
223 void depthBufferCaptured( const QImage &depthImage );
224
225 private:
226 void rotateCamera( float diffPitch, float diffYaw );
227 void updateCameraFromPose();
228 void moveCameraPositionBy( const QVector3D &posDiff );
229
230 signals:
237
241 void cameraMovementSpeedChanged( double speed );
242
247 void setCursorPosition( QPoint point );
248
254
259 void cameraRotationCenterChanged( QVector3D position );
260
261 private slots:
262 void onPositionChanged( Qt3DInput::QMouseEvent *mouse );
263 void onWheel( Qt3DInput::QWheelEvent *wheel );
264 void onMousePressed( Qt3DInput::QMouseEvent *mouse );
265 void onMouseReleased( Qt3DInput::QMouseEvent *mouse );
266 void onKeyPressed( Qt3DInput::QKeyEvent *event );
267 void onKeyReleased( Qt3DInput::QKeyEvent *event );
268 void onPickerMousePressed( Qt3DRender::QPickEvent *pick );
269 void applyFlyModeKeyMovements();
270
271 private:
272 void onKeyPressedFlyNavigation( Qt3DInput::QKeyEvent *event );
273 void onKeyPressedTerrainNavigation( Qt3DInput::QKeyEvent *event );
274 void onPositionChangedFlyNavigation( Qt3DInput::QMouseEvent *mouse );
275 void onPositionChangedTerrainNavigation( Qt3DInput::QMouseEvent *mouse );
276
277 void handleTerrainNavigationWheelZoom();
278
283 double sampleDepthBuffer( const QImage &buffer, int px, int py );
284
285 bool screenPointToWorldPos( QPoint position, Qt3DRender::QCamera *cameraBefore, double &depth, QVector3D &worldPosition );
286
287 private:
289 Qt3DRender::QCamera *mCamera = nullptr;
291 QRect mViewport;
293 float mLastPressedHeight = 0;
294
295 QPointer<QgsTerrainEntity> mTerrainEntity;
296
298 QgsCameraPose mCameraPose;
299
301 QPoint mMousePos;
302 bool mMousePressed = false;
303 Qt3DInput::QMouseEvent::Buttons mPressedButton = Qt3DInput::QMouseEvent::Buttons::NoButton;
304
305 bool mDepthBufferIsReady = false;
306 QImage mDepthBufferImage;
307
308 QPoint mMiddleButtonClickPos;
309 bool mRotationCenterCalculated = false;
310 QVector3D mRotationCenter;
311 double mRotationDistanceFromCenter;
312 double mRotationPitch = 0;
313 double mRotationYaw = 0;
314 std::unique_ptr< Qt3DRender::QCamera > mCameraBeforeRotation;
315
316 QPoint mDragButtonClickPos;
317 std::unique_ptr< Qt3DRender::QCamera > mCameraBeforeDrag;
318 bool mDragPointCalculated = false;
319 QVector3D mDragPoint;
320 double mDragDepth;
321
322 bool mIsInZoomInState = false;
323 std::unique_ptr< Qt3DRender::QCamera > mCameraBeforeZoom;
324 bool mZoomPointCalculated = false;
325 QVector3D mZoomPoint;
326
328 Qt3DInput::QMouseDevice *mMouseDevice = nullptr;
329 Qt3DInput::QKeyboardDevice *mKeyboardDevice = nullptr;
330
331 Qt3DInput::QMouseHandler *mMouseHandler = nullptr;
332 Qt3DInput::QKeyboardHandler *mKeyboardHandler = nullptr;
333 NavigationMode mCameraNavigationMode = NavigationMode::TerrainBasedNavigation;
334 VerticalAxisInversion mVerticalAxisInversion = WhenDragging;
335 double mCameraMovementSpeed = 5.0;
336
337 QSet< int > mDepressedKeys;
338 bool mCaptureFpsMouseMovements = false;
339 bool mIgnoreNextMouseMove = false;
340 QTimer *mFpsNavTimer = nullptr;
341
342 double mCumulatedWheelY = 0;
343
344};
345
346#endif // QGSCAMERACONTROLLER_H
QgsCameraController::NavigationMode cameraNavigationMode() const
Returns the navigation mode used by the camera controller.
QgsCameraPose cameraPose() const
Returns camera pose.
QRect viewport() const
Returns viewport rectangle.
float pitch() const
Returns pitch angle in degrees (0 = looking from the top, 90 = looking from the side).
Qt3DRender::QCamera * camera() const
Returns camera that is being controlled.
float yaw() const
Returns yaw angle in degrees.
void requestDepthBufferCapture()
Emitted to ask for the depth buffer image.
void navigationModeChanged(QgsCameraController::NavigationMode mode)
Emitted when the navigation mode is changed using the hotkey ctrl + ~.
float distance() const
Returns distance of the camera from the point it is looking at.
VerticalAxisInversion
Vertical axis inversion options.
@ WhenDragging
Invert vertical axis movements when dragging in first person modes.
@ Always
Always invert vertical axis movements.
@ Never
Never invert vertical axis movements.
double cameraMovementSpeed() const
Returns the camera movement speed.
void cameraChanged()
Emitted when camera has been updated.
void cameraMovementSpeedChanged(double speed)
Emitted whenever the camera movement speed is changed by the controller.
QgsCameraController::VerticalAxisInversion verticalAxisInversion() const
Returns the vertical axis inversion behavior.
NavigationMode
The navigation mode used by the camera.
@ TerrainBasedNavigation
The default navigation based on the terrain.
void cameraRotationCenterChanged(QVector3D position)
Emitted when the camera rotation center changes.
void viewportChanged()
Emitted when viewport rectangle has been updated.
void setCursorPosition(QPoint point)
Emitted when the mouse cursor position should be moved to the specified point on the map viewport.
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