QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
GeoMapCamera.h
Go to the documentation of this file.
1/****************************************************************************
2 *
3 * (c) 2009-2024 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
4 *
5 * QGroundControl is licensed according to the terms in the file
6 * COPYING.md in the root of the source code directory.
7 *
8 ****************************************************************************/
9
10#pragma once
11
12#include <QtCore/QObject>
13#include <QtCore/QPointF>
14#include <QtCore/QSizeF>
15#include <QtCore/qnumeric.h>
16#include <QtGui/QQuaternion>
17#include <QtGui/QVector3D>
18#include <QtPositioning/QGeoCoordinate>
19#include <QtQmlIntegration/QtQmlIntegration>
20
21#include <optional>
22
34class GeoMapCamera : public QObject
35{
36 Q_OBJECT
37 QML_ELEMENT
38 Q_PROPERTY(QGeoCoordinate center READ center WRITE setCenter NOTIFY centerChanged)
39 Q_PROPERTY(qreal heading READ heading WRITE setHeading NOTIFY headingChanged)
40 Q_PROPERTY(qreal tilt READ tilt WRITE setTilt NOTIFY tiltChanged)
41 Q_PROPERTY(qreal distance READ distance WRITE setDistance NOTIFY distanceChanged)
43 Q_PROPERTY(QSizeF viewportSize READ viewportSize WRITE setViewportSize NOTIFY viewportSizeChanged)
44 Q_PROPERTY(qreal fieldOfView READ fieldOfView WRITE setFieldOfView NOTIFY fieldOfViewChanged)
45 Q_PROPERTY(bool isTopDown READ isTopDown NOTIFY tiltChanged)
46 Q_PROPERTY(Mode mode READ mode WRITE setMode NOTIFY modeChanged)
47 Q_PROPERTY(qreal default3DTilt READ default3DTilt CONSTANT)
48 Q_PROPERTY(QPointF sceneOrigin READ sceneOrigin WRITE setSceneOrigin NOTIFY scenePoseChanged)
49 Q_PROPERTY(QVector3D scenePosition READ scenePosition NOTIFY scenePoseChanged)
50 Q_PROPERTY(QQuaternion sceneRotation READ sceneRotation NOTIFY scenePoseChanged)
51
52public:
53 explicit GeoMapCamera(QObject* parent = nullptr);
54
58 enum class Mode
59 {
60 Mode2D,
61 Mode3D
62 };
63 Q_ENUM(Mode)
64
65 static constexpr qreal kMinDistance = 10.0;
66 static constexpr qreal kMaxDistance = 40000000.0;
67 static constexpr qreal kMinTilt = 0.0;
68 static constexpr qreal kMaxTilt = 85.0;
69 static constexpr qreal kDefaultDistance = 1500.0;
70 static constexpr qreal kDefaultFieldOfView = 60.0;
71 static constexpr qreal kDefault3DTilt = 55.0;
72
73 QGeoCoordinate center() const;
74 void setCenter(const QGeoCoordinate& center);
75
79 bool isPositioned() const { return _positioned; }
80
81 qreal heading() const { return _heading; }
82
83 void setHeading(qreal heading);
84
85 qreal tilt() const { return _tilt; }
86
87 void setTilt(qreal tilt);
88
89 qreal distance() const { return _distance; }
90
91 void setDistance(qreal distance);
92
98 qreal centerElevation() const { return _centerElevation; }
99
100 void setCenterElevation(qreal elevation);
101
102 QSizeF viewportSize() const { return _viewportSize; }
103
104 void setViewportSize(const QSizeF& size);
105
106 qreal fieldOfView() const { return _fieldOfView; }
107
108 void setFieldOfView(qreal fov);
109
113 bool isTopDown() const { return qFuzzyIsNull(_tilt); }
114
115 Mode mode() const { return _mode; }
116
117 void setMode(Mode mode);
118
119 qreal default3DTilt() const { return kDefault3DTilt; }
120
122 Q_INVOKABLE void reset();
123
125 Q_INVOKABLE void lookAt(const QGeoCoordinate& center, qreal heading, qreal tilt, qreal distance);
126
129 Q_INVOKABLE void goTo2D()
130 {
133 }
134
135 Q_INVOKABLE void goTo3D()
136 {
139 }
140
142 Q_INVOKABLE void beginPan(const QPointF& screenPos);
144 Q_INVOKABLE void panTo(const QPointF& screenPos);
145
147 Q_INVOKABLE void beginOrbit(const QPointF& screenPos);
150 Q_INVOKABLE void orbitTo(const QPointF& screenPos);
151
154 Q_INVOKABLE void rotateBy(qreal degrees, const QPointF& screenPos);
155
158 Q_INVOKABLE void tiltBy(qreal degrees, const QPointF& screenPos);
159
162 Q_INVOKABLE void zoom(qreal amount, const QPointF& screenPos);
163
166 Q_INVOKABLE void zoomBy(qreal factor, const QPointF& screenPos);
167
170 Q_INVOKABLE qreal sceneUnitsPerPixel() const;
171
176 Q_INVOKABLE qreal distanceForZoomLevel(qreal zoomLevel) const;
177
185 Q_INVOKABLE QGeoCoordinate centerForCoordinateAtScreenPoint(const QGeoCoordinate& coordinate,
186 const QPointF& screenPos, double worldZ = 0.0,
187 double centerElevation = qQNaN()) const;
188
191 QVector3D cameraPosition() const;
192
196 QPointF cameraGroundPosition() const;
197
200 QPointF sceneOrigin() const { return _sceneOrigin; }
201
202 void setSceneOrigin(const QPointF& origin);
203
206 QVector3D scenePosition() const;
207
210 QQuaternion sceneRotation() const;
211
215 std::optional<QPointF> screenToGround(const QPointF& screenPos) const;
216
221 std::optional<QPointF> groundPointCapped(const QPointF& screenPos, double maxRange) const;
222
226 std::optional<QPointF> worldToScreen(const QPointF& worldGround, double worldZ = 0.0) const;
227
228signals:
240
241private:
242 void _setCenterWorld(const QPointF& world);
244 void _anchorToScreen(const QPointF& anchorWorld, const QPointF& screenPos);
245 static qreal _normalizedHeading(qreal heading);
246
247 QPointF _centerWorld; // mercator meters
248 bool _positioned = false;
249 QPointF _sceneOrigin; // mercator meters
250 Mode _mode = Mode::Mode2D;
251 qreal _heading = 0.0;
252 qreal _tilt = 0.0;
253 qreal _distance = kDefaultDistance;
254 qreal _centerElevation = 0.0;
255 QSizeF _viewportSize;
256 qreal _fieldOfView = kDefaultFieldOfView;
257
258 // Gesture state
259 std::optional<QPointF> _panAnchorWorld;
260 std::optional<QPointF> _orbitAnchorWorld;
261 QPointF _orbitAnchorScreen;
262 QPointF _orbitStartScreen;
263 qreal _orbitStartHeading = 0.0;
264 qreal _orbitStartTilt = 0.0;
265};
qreal default3DTilt() const
Q_INVOKABLE void panTo(const QPointF &screenPos)
Continue a pan gesture: the ground point picked at beginPan stays under the cursor.
QSizeF viewportSize() const
void distanceChanged()
void centerElevationChanged()
void setCenterElevation(qreal elevation)
void setMode(Mode mode)
qreal distance() const
void setFieldOfView(qreal fov)
std::optional< QPointF > worldToScreen(const QPointF &worldGround, double worldZ=0.0) const
Q_INVOKABLE void goTo2D()
qreal fieldOfView() const
void tiltChanged()
Q_INVOKABLE void beginPan(const QPointF &screenPos)
Start a pan gesture at the given screen position (pixels)
static constexpr qreal kMinTilt
QPointF cameraGroundPosition() const
Q_INVOKABLE qreal sceneUnitsPerPixel() const
Q_INVOKABLE void zoom(qreal amount, const QPointF &screenPos)
std::optional< QPointF > screenToGround(const QPointF &screenPos) const
void setCenter(const QGeoCoordinate &center)
void headingChanged()
static constexpr qreal kDefault3DTilt
qreal centerElevation() const
static constexpr qreal kMinDistance
void setSceneOrigin(const QPointF &origin)
void scenePoseChanged()
void fieldOfViewChanged()
Q_INVOKABLE void zoomBy(qreal factor, const QPointF &screenPos)
Q_INVOKABLE void orbitTo(const QPointF &screenPos)
void setDistance(qreal distance)
Q_INVOKABLE void lookAt(const QGeoCoordinate &center, qreal heading, qreal tilt, qreal distance)
Set the full pose in one call. tilt/distance are clamped.
bool isPositioned() const
QVector3D cameraPosition() const
Q_INVOKABLE void goTo3D()
Q_INVOKABLE void beginOrbit(const QPointF &screenPos)
Start an orbit gesture at the given screen position (pixels)
void setHeading(qreal heading)
QVector3D scenePosition() const
void setViewportSize(const QSizeF &size)
void viewportSizeChanged()
static constexpr qreal kDefaultDistance
Q_INVOKABLE void reset()
Restore the default pose at the current center (heading 0, tilt 0, default distance)
QPointF sceneOrigin() const
static constexpr qreal kMaxTilt
qreal heading() const
Q_INVOKABLE void tiltBy(qreal degrees, const QPointF &screenPos)
Mode mode() const
static constexpr qreal kDefaultFieldOfView
std::optional< QPointF > groundPointCapped(const QPointF &screenPos, double maxRange) const
Q_INVOKABLE void rotateBy(qreal degrees, const QPointF &screenPos)
Q_INVOKABLE qreal distanceForZoomLevel(qreal zoomLevel) const
void centerChanged()
qreal tilt() const
Q_INVOKABLE QGeoCoordinate centerForCoordinateAtScreenPoint(const QGeoCoordinate &coordinate, const QPointF &screenPos, double worldZ=0.0, double centerElevation=qQNaN()) const
QGeoCoordinate center() const
void modeChanged()
void setTilt(qreal tilt)
bool isTopDown() const
static constexpr qreal kMaxDistance
QQuaternion sceneRotation() const