|
@@ -34,6 +34,7 @@ |
|
|
#include "qgsflatterraingenerator.h" |
|
|
#include "qgsonlineterraingenerator.h" |
|
|
#include "qgsray3d.h" |
|
|
#include "qgs3dutils.h" |
|
|
|
|
|
Qgs3DMapCanvas::Qgs3DMapCanvas( QWidget *parent ) |
|
|
: QWidget( parent ) |
|
@@ -257,27 +258,7 @@ void Qgs3DMapCanvas::updateTemporalRange( const QgsDateTimeRange &temporalrange |
|
|
|
|
|
void Qgs3DMapCanvas::identifyPointCloudOnMouseEvent( QVector<QPair<QgsMapLayer *, QVector<QVariantMap>>> &result, QMouseEvent *event ) |
|
|
{ |
|
|
QVector3D deviceCoords( event->x(), event->y(), 0.0 ); |
|
|
QSize windowSize = mEngine->size(); |
|
|
// normalized device coordinates |
|
|
QVector3D normDeviceCoords( 2.0 * deviceCoords.x() / windowSize.width() - 1.0f, 1.0f - 2.0 * deviceCoords.y() / windowSize.height(), mEngine->camera()->nearPlane() ); |
|
|
// clip coordinates |
|
|
QVector4D rayClip( normDeviceCoords.x(), normDeviceCoords.y(), -1.0, 0.0 ); |
|
|
|
|
|
QMatrix4x4 projMatrix = mEngine->camera()->projectionMatrix(); |
|
|
QMatrix4x4 viewMatrix = mEngine->camera()->viewMatrix(); |
|
|
|
|
|
// ray direction in view coordinates |
|
|
QVector4D rayDirView = projMatrix.inverted() * rayClip; |
|
|
// ray origin in world coordinates |
|
|
QVector4D rayOriginWorld = viewMatrix.inverted() * QVector4D( 0.0f, 0.0f, 0.0f, 1.0f ); |
|
|
|
|
|
// ray direction in world coordinates |
|
|
rayDirView.setZ( -1.0f ); |
|
|
rayDirView.setW( 0.0f ); |
|
|
QVector4D rayDirWorld4D = viewMatrix.inverted() * rayDirView; |
|
|
QVector3D rayDirWorld( rayDirWorld4D.x(), rayDirWorld4D.y(), rayDirWorld4D.z() ); |
|
|
rayDirWorld = rayDirWorld.normalized(); |
|
|
|
|
|
mScene->identifyPointCloudOnRay( result, QgsRay3D( QVector3D( rayOriginWorld ), rayDirWorld ) ); |
|
|
QgsRay3D ray = Qgs3DUtils::rayFromScreenPoint( event->pos(), mEngine->size(), mEngine->camera() ); |
|
|
|
|
|
mScene->identifyPointCloudOnRay( result, ray ); |
|
|
} |