QGIS API Documentation 3.43.0-Master (32433f7016e)
qgs3dutils.h
Go to the documentation of this file.
1/***************************************************************************
2 qgs3dutils.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 QGS3DUTILS_H
17#define QGS3DUTILS_H
18#define SIP_NO_FILE
19
20#include "qgs3dmapcanvas.h"
21#include "qgs3dmapsettings.h"
23#include "qgs3dtypes.h"
24#include "qgsaabb.h"
25#include "qgsray3d.h"
26#include "qgsraycastingutils.h"
27
28#include <Qt3DRender/QCamera>
29#include <Qt3DRender/QCullFace>
30
31#include <memory>
32
33
34class QgsCameraPose;
35class QgsLineString;
36class QgsPolygon;
37class QgsFeedback;
38
41class Qgs3DMapScene;
44
45namespace Qt3DExtras
46{
47 class QPhongMaterial;
48}
49
50class QSurface;
52
58class _3D_EXPORT Qgs3DUtils
59{
60 public:
66 static QImage captureSceneImage( QgsAbstract3DEngine &engine, Qgs3DMapScene *scene );
67
72 static void waitForFrame( QgsAbstract3DEngine &engine, Qgs3DMapScene *scene );
73
82 static QImage captureSceneDepthBuffer( QgsAbstract3DEngine &engine, Qgs3DMapScene *scene );
83
89 static double calculateEntityGpuMemorySize( Qt3DCore::QEntity *entity );
90
109 static bool exportAnimation( const Qgs3DAnimationSettings &animationSettings, Qgs3DMapSettings &mapSettings, int framesPerSecond, const QString &outputDirectory, const QString &fileNameTemplate, const QSize &outputSize, QString &error, QgsFeedback *feedback = nullptr );
110
115 static int maxZoomLevel( double tile0width, double tileResolution, double maxError );
116
118 static QString altClampingToString( Qgis::AltitudeClamping altClamp );
120 static Qgis::AltitudeClamping altClampingFromString( const QString &str );
121
123 static QString altBindingToString( Qgis::AltitudeBinding altBind );
125 static Qgis::AltitudeBinding altBindingFromString( const QString &str );
126
128 static QString cullingModeToString( Qgs3DTypes::CullingMode mode );
130 static Qgs3DTypes::CullingMode cullingModeFromString( const QString &str );
131
133 static float clampAltitude( const QgsPoint &p, Qgis::AltitudeClamping altClamp, Qgis::AltitudeBinding altBind, float offset, const QgsPoint &centroid, const Qgs3DRenderContext &context );
135 static void clampAltitudes( QgsLineString *lineString, Qgis::AltitudeClamping altClamp, Qgis::AltitudeBinding altBind, const QgsPoint &centroid, float offset, const Qgs3DRenderContext &context );
137 static bool clampAltitudes( QgsPolygon *polygon, Qgis::AltitudeClamping altClamp, Qgis::AltitudeBinding altBind, float offset, const Qgs3DRenderContext &context );
138
140 static QString matrix4x4toString( const QMatrix4x4 &m );
142 static QMatrix4x4 stringToMatrix4x4( const QString &str );
143
145 static void extractPointPositions( const QgsFeature &f, const Qgs3DRenderContext &context, const QgsVector3D &chunkOrigin, Qgis::AltitudeClamping altClamp, QVector<QVector3D> &positions );
146
151 static bool isCullable( const QgsAABB &bbox, const QMatrix4x4 &viewProjectionMatrix );
152
154 static QgsVector3D mapToWorldCoordinates( const QgsVector3D &mapCoords, const QgsVector3D &origin );
156 static QgsVector3D worldToMapCoordinates( const QgsVector3D &worldCoords, const QgsVector3D &origin );
157
162 static QgsAABB layerToWorldExtent( const QgsRectangle &extent, double zMin, double zMax, const QgsCoordinateReferenceSystem &layerCrs, const QgsVector3D &mapOrigin, const QgsCoordinateReferenceSystem &mapCrs, const QgsCoordinateTransformContext &context );
163
168 static QgsRectangle worldToLayerExtent( const QgsAABB &bbox, const QgsCoordinateReferenceSystem &layerCrs, const QgsVector3D &mapOrigin, const QgsCoordinateReferenceSystem &mapCrs, const QgsCoordinateTransformContext &context );
169
174 static QgsAABB mapToWorldExtent( const QgsRectangle &extent, double zMin, double zMax, const QgsVector3D &mapOrigin );
175
180 static QgsAABB mapToWorldExtent( const QgsBox3D &box3D, const QgsVector3D &mapOrigin );
181
186 static QgsRectangle worldToMapExtent( const QgsAABB &bbox, const QgsVector3D &mapOrigin );
187
189 static QgsVector3D transformWorldCoordinates( const QgsVector3D &worldPoint1, const QgsVector3D &origin1, const QgsCoordinateReferenceSystem &crs1, const QgsVector3D &origin2, const QgsCoordinateReferenceSystem &crs2, const QgsCoordinateTransformContext &context );
190
198 static void estimateVectorLayerZRange( QgsVectorLayer *layer, double &zMin, double &zMax );
199
201 static QgsExpressionContext globalProjectLayerExpressionContext( QgsVectorLayer *layer );
202
204 static QgsPhongMaterialSettings phongMaterialFromQt3DComponent( Qt3DExtras::QPhongMaterial *material );
205
207 static QgsRay3D rayFromScreenPoint( const QPoint &point, const QSize &windowSize, Qt3DRender::QCamera *camera );
208
213 static QVector3D screenPointToWorldPos( const QPoint &screenPoint, double depth, const QSize &screenSize, Qt3DRender::QCamera *camera );
214
219 static void pitchAndYawFromViewVector( QVector3D vect, double &pitch, double &yaw );
220
227 static QVector2D screenToTextureCoordinates( QVector2D screenXY, QSize winSize );
228
235 static QVector2D textureToScreenCoordinates( QVector2D textureXY, QSize winSize );
236
243 static double decodeDepth( const QRgb &pixel )
244 {
245 return ( ( qRed( pixel ) / 255.0 + qGreen( pixel ) ) / 255.0 + qBlue( pixel ) ) / 255.0;
246 }
247
253 static std::unique_ptr<QgsPointCloudLayer3DRenderer> convert2DPointCloudRendererTo3D( QgsPointCloudRenderer *renderer );
254
262 static QHash<QgsMapLayer *, QVector<QgsRayCastingUtils::RayHit>> castRay( Qgs3DMapScene *scene, const QgsRay3D &ray, const QgsRayCastingUtils::RayCastContext &context );
263
275 static QgsRectangle tryReprojectExtent2D( const QgsRectangle &extent, const QgsCoordinateReferenceSystem &crs1, const QgsCoordinateReferenceSystem &crs2, const QgsCoordinateTransformContext &context );
276
288 static float screenSpaceError( float epsilon, float distance, int screenSize, float fov );
289
302 static void computeBoundingBoxNearFarPlanes( const QgsAABB &bbox, const QMatrix4x4 &viewMatrix, float &fnear, float &ffar );
303
311 static Qt3DRender::QCullFace::CullingMode qt3DcullingMode( Qgs3DTypes::CullingMode mode );
312
321 static QByteArray addDefinesToShaderCode( const QByteArray &shaderCode, const QStringList &defines );
322
331 static QByteArray removeDefinesFromShaderCode( const QByteArray &shaderCode, const QStringList &defines );
332
340 static void decomposeTransformMatrix( const QMatrix4x4 &matrix, QVector3D &translation, QQuaternion &rotation, QVector3D &scale );
341
348 static int openGlMaxClipPlanes( QSurface *surface );
349
356 static QQuaternion rotationFromPitchHeadingAngles( float pitchAngle, float headingAngle );
357
367 static QgsPoint screenPointToMapCoordinates( const QPoint &screenPoint, QSize size, const QgsCameraController *cameraController, const Qgs3DMapSettings *mapSettings );
368
373 static void calculateViewExtent( const Qt3DRender::QCamera *camera, float maxRenderingDistance, float z, float &minX, float &maxX, float &minY, float &maxY, float &minZ, float &maxZ );
374
383 static QList<QVector4D> lineSegmentToClippingPlanes( const QgsVector3D &startPoint, const QgsVector3D &endPoint, double distance, const QgsVector3D &origin );
384
391 static QgsCameraPose lineSegmentToCameraPose( const QgsVector3D &startPoint, const QgsVector3D &endPoint, const QgsDoubleRange &elevationRange, float fieldOfView, const QgsVector3D &worldOrigin );
392};
393
394#endif // QGS3DUTILS_H
AltitudeClamping
Altitude clamping.
Definition qgis.h:3833
AltitudeBinding
Altitude binding.
Definition qgis.h:3846
Holds information about animation in 3D view.
Entity that encapsulates our 3D scene - contains all other entities (such as terrain) as children.
Definition of the world.
Rendering context for preparation of 3D entities.
CullingMode
Triangle culling mode.
Definition qgs3dtypes.h:35
Miscellaneous utility functions used from 3D code.
Definition qgs3dutils.h:59
static double decodeDepth(const QRgb &pixel)
Decodes the depth value from the pixel's color value The depth value is encoded from OpenGL side (the...
Definition qgs3dutils.h:243
Axis-aligned bounding box - in world coords.
Definition qgsaabb.h:35
Base class for 3D engine implementation.
Abstract base class for 3D symbols that are used by VectorLayer3DRenderer objects.
A 3-dimensional box composed of x, y, z coordinates.
Definition qgsbox3d.h:43
Object that controls camera movement based on user input.
Encapsulates camera pose in a 3D scene.
Represents a coordinate reference system (CRS).
Contains information about the context in which a coordinate transform is executed.
QgsRange which stores a range of double values.
Definition qgsrange.h:233
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:58
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition qgsfeedback.h:44
Line string geometry type, with support for z-dimension and m-values.
Basic shading material used for rendering based on the Phong shading model with three color component...
3D renderer that renders all points from a point cloud layer.
Abstract base class for 2d point cloud renderers.
Point geometry type, with support for z-dimension and m-values.
Definition qgspoint.h:49
Polygon geometry type.
Definition qgspolygon.h:33
A representation of a ray in 3D.
Definition qgsray3d.h:31
A rectangle specified with double values.
A 3D vector (similar to QVector3D) with the difference that it uses double precision instead of singl...
Definition qgsvector3d.h:30
Represents a vector layer which manages a vector based dataset.
Helper struct to store ray casting parameters.