QGIS API Documentation 4.1.0-Master (0cdd3ae6384)
Loading...
Searching...
No Matches
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
19#include <memory>
20
22#include "qgs3dmapcanvas.h"
23#include "qgs3dmapsettings.h"
24#include "qgs3dtypes.h"
25#include "qgsaabb.h"
26#include "qgsmaterial.h"
27#include "qgsray3d.h"
28#include "qgsraycastresult.h"
29
30#include <QMatrix3x3>
31#include <QMatrix4x4>
32#include <Qt3DCore/QGeometry>
33#include <Qt3DRender/QCamera>
34#include <Qt3DRender/QCullFace>
35
36#define SIP_NO_FILE
37
38class QgsCameraPose;
39class QgsLineString;
40class QgsPolygon;
41class QgsFeedback;
42
45class Qgs3DMapScene;
48
49namespace Qt3DExtras
50{
51 class QPhongMaterial;
52}
53
54namespace Qt3DRender
55{
56 class QAbstractTexture;
57}
58
59class QSurface;
63
70struct _3D_EXPORT QgsMeshNodeData
71{
72 std::unique_ptr<Qt3DCore::QGeometry> geometry;
73 std::unique_ptr<QgsMaterial> material;
74 QMatrix4x4 meshTransform;
75};
76
82class _3D_EXPORT Qgs3DUtils
83{
84 public:
90 static QImage captureSceneImage( QgsAbstract3DEngine &engine, Qgs3DMapScene *scene );
91
97 static void waitForFrame( QgsAbstract3DEngine &engine, Qgs3DMapScene *scene );
98
104 static void waitForEntitiesLoaded( Qgs3DMapScene *scene );
105
114 static QImage captureSceneDepthBuffer( QgsAbstract3DEngine &engine, Qgs3DMapScene *scene );
115
121 static double calculateEntityGpuMemorySize( Qt3DCore::QEntity *entity );
122
141 static bool exportAnimation(
142 const Qgs3DAnimationSettings &animationSettings,
143 Qgs3DMapSettings &mapSettings,
144 int framesPerSecond,
145 const QString &outputDirectory,
146 const QString &fileNameTemplate,
147 const QSize &outputSize,
148 QString &error,
149 QgsFeedback *feedback = nullptr
150 );
151
156 static int maxZoomLevel( double tile0width, double tileResolution, double maxError );
157
159 static QString altClampingToString( Qgis::AltitudeClamping altClamp );
161 static Qgis::AltitudeClamping altClampingFromString( const QString &str );
162
164 static QString altBindingToString( Qgis::AltitudeBinding altBind );
166 static Qgis::AltitudeBinding altBindingFromString( const QString &str );
167
169 static QString cullingModeToString( Qgs3DTypes::CullingMode mode );
171 static Qgs3DTypes::CullingMode cullingModeFromString( const QString &str );
172
174 static float clampAltitude( const QgsPoint &p, Qgis::AltitudeClamping altClamp, Qgis::AltitudeBinding altBind, float offset, const QgsPoint &centroid, const Qgs3DRenderContext &context );
176 static void clampAltitudes( QgsLineString *lineString, Qgis::AltitudeClamping altClamp, Qgis::AltitudeBinding altBind, const QgsPoint &centroid, float offset, const Qgs3DRenderContext &context );
178 static bool clampAltitudes( QgsPolygon *polygon, Qgis::AltitudeClamping altClamp, Qgis::AltitudeBinding altBind, float offset, const Qgs3DRenderContext &context );
179
181 static QString matrix4x4toString( const QMatrix4x4 &m );
183 static QMatrix4x4 stringToMatrix4x4( const QString &str );
184
196 static QColor srgbToLinear( const QColor &color );
197
207 static Qt3DRender::QAbstractTexture::TextureFormat determineTextureFormat( QImage::Format format, bool isSrgb, bool &requiresConversionToRgb );
208
210 static void extractPointPositions(
211 const QgsFeature &f,
212 const Qgs3DRenderContext &context,
213 const QgsVector3D &chunkOrigin,
214 Qgis::AltitudeClamping altClamp,
215 QVector<QVector3D> &positions,
216 const QgsVector3D &translation = QgsVector3D( 0, 0, 0 )
217 );
218
223 static bool isCullable( const QgsAABB &bbox, const QMatrix4x4 &viewProjectionMatrix );
224
226 static QgsVector3D mapToWorldCoordinates( const QgsVector3D &mapCoords, const QgsVector3D &origin );
228 static QgsVector3D worldToMapCoordinates( const QgsVector3D &worldCoords, const QgsVector3D &origin );
229
235 const QgsRectangle &extent,
236 double zMin,
237 double zMax,
238 const QgsCoordinateReferenceSystem &layerCrs,
239 const QgsVector3D &mapOrigin,
240 const QgsCoordinateReferenceSystem &mapCrs,
241 const QgsCoordinateTransformContext &context
242 );
243
249 const QgsAABB &bbox, const QgsCoordinateReferenceSystem &layerCrs, const QgsVector3D &mapOrigin, const QgsCoordinateReferenceSystem &mapCrs, const QgsCoordinateTransformContext &context
250 );
251
256 static QgsAABB mapToWorldExtent( const QgsRectangle &extent, double zMin, double zMax, const QgsVector3D &mapOrigin );
257
262 static QgsAABB mapToWorldExtent( const QgsBox3D &box3D, const QgsVector3D &mapOrigin );
263
268 static QgsRectangle worldToMapExtent( const QgsAABB &bbox, const QgsVector3D &mapOrigin );
269
272 const QgsVector3D &worldPoint1,
273 const QgsVector3D &origin1,
275 const QgsVector3D &origin2,
277 const QgsCoordinateTransformContext &context
278 );
279
287 static void estimateVectorLayerZRange( QgsVectorLayer *layer, double &zMin, double &zMax );
288
290 static QgsPhongMaterialSettings phongMaterialFromQt3DComponent( Qt3DExtras::QPhongMaterial *material );
291
293 static QgsRay3D rayFromScreenPoint( const QPoint &point, const QSize &windowSize, Qt3DRender::QCamera *camera );
294
303 static QVector3D screenPointToWorldPos( const QPoint &screenPoint, double depth, const QSize &screenSize, Qt3DRender::QCamera *camera );
304
309 static void pitchAndYawFromViewVector( QVector3D vect, double &pitch, double &yaw );
310
317 static QVector2D screenToTextureCoordinates( QVector2D screenXY, QSize winSize );
318
325 static QVector2D textureToScreenCoordinates( QVector2D textureXY, QSize winSize );
326
333 static double decodeDepth( const QRgb &pixel ) { return ( ( qRed( pixel ) / 255.0 + qGreen( pixel ) ) / 255.0 + qBlue( pixel ) ) / 255.0; }
334
340 static std::unique_ptr<QgsPointCloudLayer3DRenderer> convert2DPointCloudRendererTo3D( QgsPointCloudRenderer *renderer );
341
347 static QgsRayCastResult castRay( Qgs3DMapScene *scene, const QgsRay3D &ray, const QgsRayCastContext &context );
348
360 static QgsRectangle tryReprojectExtent2D( const QgsRectangle &extent, const QgsCoordinateReferenceSystem &crs1, const QgsCoordinateReferenceSystem &crs2, const QgsCoordinateTransformContext &context );
361
373 static float screenSpaceError( float epsilon, float distance, int screenSize, float fov );
374
387 static void computeBoundingBoxNearFarPlanes( const QgsAABB &bbox, const QMatrix4x4 &viewMatrix, float &fnear, float &ffar );
388
396 static Qt3DRender::QCullFace::CullingMode qt3DcullingMode( Qgs3DTypes::CullingMode mode );
397
406 static QByteArray addDefinesToShaderCode( const QByteArray &shaderCode, const QStringList &defines );
407
416 static QMatrix4x4 axisTransformMatrix( const QString &upAxis, const QString &forwardAxis );
417
426 static QByteArray removeDefinesFromShaderCode( const QByteArray &shaderCode, const QStringList &defines );
427
435 static void decomposeTransformMatrix( const QMatrix4x4 &matrix, QVector3D &translation, QQuaternion &rotation, QVector3D &scale );
436
443 static int openGlMaxClipPlanes( QSurface *surface );
444
451 static QQuaternion rotationFromPitchHeadingAngles( float pitchAngle, float headingAngle );
452
462 static QgsPoint screenPointToMapCoordinates( const QPoint &screenPoint, QSize size, const QgsCameraController *cameraController, const Qgs3DMapSettings *mapSettings );
463
473 static QVector3D calculateDirectionalLightUpVector( const QVector3D &lightDirection );
474
487 static std::vector<float> calculateCascadeSplits( int numberCascades, float nearPlane, float farPlane, float lambda = 0.9f );
488
502 static void calculateFrustumSliceCorners( float zNear, float zFar, float fov, float aspectRatio, const QMatrix4x4 &invertedCameraView, QVector3D ( &corners )[8], QVector3D &center );
503
519 static void calculateViewSpaceOrthographicBounds(
520 const QVector3D ( &worldCorners )[8], const QMatrix4x4 &viewMatrix, float &left, float &right, float &bottom, float &top, float &nearPlane, float &farPlane
521 );
522
531 static QList<QVector4D> lineSegmentToClippingPlanes( const QgsVector3D &startPoint, const QgsVector3D &endPoint, double distance, const QgsVector3D &origin );
532
539 static QgsCameraPose lineSegmentToCameraPose( const QgsVector3D &startPoint, const QgsVector3D &endPoint, const QgsDoubleRange &elevationRange, float fieldOfView, const QgsVector3D &worldOrigin );
540
545 static std::unique_ptr<Qt3DRender::QCamera> copyCamera( Qt3DRender::QCamera *cam ) SIP_SKIP;
546
553 static void setTextureFiltering( Qt3DRender::QAbstractTexture *texture, const QgsMaterialContext &context );
554
555 // we start with a maximal z range because we can't know this upfront. There's too many
556 // factors to consider eg vertex z data, terrain heights, data defined offsets and extrusion heights,...
557 // This range will be refined after populating the nodes to the actual z range of the generated chunks nodes.
558 // Assuming the vertical height is in meter, then it's extremely unlikely that a real vertical
559 // height will exceed this amount!
560 static constexpr double MINIMUM_VECTOR_Z_ESTIMATE = -100000;
561 static constexpr double MAXIMUM_VECTOR_Z_ESTIMATE = 100000;
562
563 private:
568 static QVector3D axisStringToVector( const QString &axis );
569};
570
571#endif // QGS3DUTILS_H
AltitudeClamping
Altitude clamping.
Definition qgis.h:4167
AltitudeBinding
Altitude binding.
Definition qgis.h:4180
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:83
static QgsVector3D transformWorldCoordinates(const QgsVector3D &worldPoint1, const QgsVector3D &origin1, const QgsCoordinateReferenceSystem &crs1, const QgsVector3D &origin2, const QgsCoordinateReferenceSystem &crs2, const QgsCoordinateTransformContext &context)
Transforms a world point from (origin1, crs1) to (origin2, crs2).
static Qgs3DTypes::CullingMode cullingModeFromString(const QString &str)
Converts a string to a value from CullingMode enum.
static Qgis::AltitudeClamping altClampingFromString(const QString &str)
Converts a string to a value from AltitudeClamping enum.
static QString matrix4x4toString(const QMatrix4x4 &m)
Converts a 4x4 transform matrix to a string.
static QgsRectangle worldToMapExtent(const QgsAABB &bbox, const QgsVector3D &mapOrigin)
Converts axis aligned bounding box in 3D world coordinates to extent in map coordinates.
static QgsRectangle worldToLayerExtent(const QgsAABB &bbox, const QgsCoordinateReferenceSystem &layerCrs, const QgsVector3D &mapOrigin, const QgsCoordinateReferenceSystem &mapCrs, const QgsCoordinateTransformContext &context)
Converts axis aligned bounding box in 3D world coordinates to extent in map layer CRS.
static void pitchAndYawFromViewVector(QVector3D vect, double &pitch, double &yaw)
Function used to extract the pitch and yaw (also known as heading) angles in degrees from the view ve...
static int maxZoomLevel(double tile0width, double tileResolution, double maxError)
Calculates the highest needed zoom level for tiles in quad-tree given width of the base tile (zoom le...
static QgsAABB mapToWorldExtent(const QgsRectangle &extent, double zMin, double zMax, const QgsVector3D &mapOrigin)
Converts map extent to axis aligned bounding box in 3D world coordinates.
static QgsAABB layerToWorldExtent(const QgsRectangle &extent, double zMin, double zMax, const QgsCoordinateReferenceSystem &layerCrs, const QgsVector3D &mapOrigin, const QgsCoordinateReferenceSystem &mapCrs, const QgsCoordinateTransformContext &context)
Converts extent (in map layer's CRS) to axis aligned bounding box in 3D world coordinates.
static Qgis::AltitudeBinding altBindingFromString(const QString &str)
Converts a string to a value from AltitudeBinding enum.
static double calculateEntityGpuMemorySize(Qt3DCore::QEntity *entity)
Calculates approximate usage of GPU memory by an entity.
static void extractPointPositions(const QgsFeature &f, const Qgs3DRenderContext &context, const QgsVector3D &chunkOrigin, Qgis::AltitudeClamping altClamp, QVector< QVector3D > &positions, const QgsVector3D &translation=QgsVector3D(0, 0, 0))
Calculates (x,y,z) positions of (multi)point from the given feature.
static QString cullingModeToString(Qgs3DTypes::CullingMode mode)
Converts a value from CullingMode enum to a string.
static bool isCullable(const QgsAABB &bbox, const QMatrix4x4 &viewProjectionMatrix)
Returns true if bbox is completely outside the current viewing volume.
static QVector2D screenToTextureCoordinates(QVector2D screenXY, QSize winSize)
Converts from screen coordinates to texture coordinates.
static void estimateVectorLayerZRange(QgsVectorLayer *layer, double &zMin, double &zMax)
Try to estimate range of Z values used in the given vector layer and store that in zMin and zMax.
static QgsPhongMaterialSettings phongMaterialFromQt3DComponent(Qt3DExtras::QPhongMaterial *material)
Returns phong material settings object based on the Qt3D material.
static QString altClampingToString(Qgis::AltitudeClamping altClamp)
Converts a value from AltitudeClamping enum to a string.
static Qt3DRender::QAbstractTexture::TextureFormat determineTextureFormat(QImage::Format format, bool isSrgb, bool &requiresConversionToRgb)
Given a QImage format, returns the most appropriate corresponding texture format.
static QMatrix4x4 stringToMatrix4x4(const QString &str)
Convert a string to a 4x4 transform matrix.
static QgsVector3D worldToMapCoordinates(const QgsVector3D &worldCoords, const QgsVector3D &origin)
Converts 3D world coordinates to map coordinates (applies offset).
static QgsVector3D mapToWorldCoordinates(const QgsVector3D &mapCoords, const QgsVector3D &origin)
Converts map coordinates to 3D world coordinates (applies offset).
static QVector2D textureToScreenCoordinates(QVector2D textureXY, QSize winSize)
Converts from texture coordinates coordinates to screen coordinates.
static bool exportAnimation(const Qgs3DAnimationSettings &animationSettings, Qgs3DMapSettings &mapSettings, int framesPerSecond, const QString &outputDirectory, const QString &fileNameTemplate, const QSize &outputSize, QString &error, QgsFeedback *feedback=nullptr)
Captures 3D animation frames to the selected folder.
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:333
static QVector3D screenPointToWorldPos(const QPoint &screenPoint, double depth, const QSize &screenSize, Qt3DRender::QCamera *camera)
Converts the clicked mouse position to the corresponding 3D world coordinates.
static void waitForFrame(QgsAbstract3DEngine &engine, Qgs3DMapScene *scene)
Waits for a frame to be rendered.
static float clampAltitude(const QgsPoint &p, Qgis::AltitudeClamping altClamp, Qgis::AltitudeBinding altBind, float offset, const QgsPoint &centroid, const Qgs3DRenderContext &context)
Clamps altitude of a vertex according to the settings, returns Z value.
static QString altBindingToString(Qgis::AltitudeBinding altBind)
Converts a value from AltitudeBinding enum to a string.
static void clampAltitudes(QgsLineString *lineString, Qgis::AltitudeClamping altClamp, Qgis::AltitudeBinding altBind, const QgsPoint &centroid, float offset, const Qgs3DRenderContext &context)
Clamps altitude of vertices of a linestring according to the settings.
static QgsRay3D rayFromScreenPoint(const QPoint &point, const QSize &windowSize, Qt3DRender::QCamera *camera)
Convert from clicked point on the screen to a ray in world coordinates.
static QImage captureSceneImage(QgsAbstract3DEngine &engine, Qgs3DMapScene *scene)
Captures image of the current 3D scene of a 3D engine.
static constexpr double MINIMUM_VECTOR_Z_ESTIMATE
Definition qgs3dutils.h:560
static QColor srgbToLinear(const QColor &color)
Converts a SRGB color to a linear color.
static void waitForEntitiesLoaded(Qgs3DMapScene *scene)
Waits for all entities in the scene to be loaded.
static constexpr double MAXIMUM_VECTOR_Z_ESTIMATE
Definition qgs3dutils.h:561
static QImage captureSceneDepthBuffer(QgsAbstract3DEngine &engine, Qgs3DMapScene *scene)
Captures the depth buffer of the current 3D scene of a 3D engine.
Axis-aligned bounding box - in world coords.
Definition qgsaabb.h:33
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:45
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:217
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:60
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.
Context settings for a material.
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:53
Polygon geometry type.
Definition qgspolygon.h:37
A representation of a ray in 3D.
Definition qgsray3d.h:31
Responsible for defining parameters of the ray casting operations in 3D map canvases.
Contains the results of ray casting operations in a 3D map canvas.
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:33
Represents a vector layer which manages a vector based dataset.
#define SIP_SKIP
Definition qgis_sip.h:133
Pairs a Qt3D geometry with its material and transform.
Definition qgs3dutils.h:71
std::unique_ptr< QgsMaterial > material
Material.
Definition qgs3dutils.h:73
QMatrix4x4 meshTransform
Mesh space (raw coordinates) to object space transform.
Definition qgs3dutils.h:74
std::unique_ptr< Qt3DCore::QGeometry > geometry
Geometry.
Definition qgs3dutils.h:72