diff --git a/src/3d/terrain/qgsterrainentity_p.cpp b/src/3d/terrain/qgsterrainentity_p.cpp index 49789593a93..75be3e34558 100644 --- a/src/3d/terrain/qgsterrainentity_p.cpp +++ b/src/3d/terrain/qgsterrainentity_p.cpp @@ -102,21 +102,31 @@ bool QgsTerrainEntity::rayIntersection( const QgsRayCastingUtils::Ray3D &ray, QV if ( mMap.terrainGenerator()->type() != QgsTerrainGenerator::Dem ) return false; // currently only working with DEM terrain + float minDist = -1; + QList lst = activeNodes(); for ( QgsChunkNode *n : lst ) { - if ( n->entity() && QgsRayCastingUtils::rayBoxIntersection( ray, n->bbox() ) ) + if ( n->entity() && ( minDist < 0 || n->bbox().distanceFromPoint( ray.origin() ) < minDist ) && QgsRayCastingUtils::rayBoxIntersection( ray, n->bbox() ) ) { Qt3DRender::QGeometryRenderer *rend = n->entity()->findChild(); Qt3DRender::QGeometry *geom = rend->geometry(); DemTerrainTileGeometry *demGeom = static_cast( geom ); Qt3DCore::QTransform *tr = n->entity()->findChild(); - if ( demGeom->rayIntersection( ray, tr->matrix(), intersectionPoint ) ) - return true; + QVector3D nodeIntPoint; + if ( demGeom->rayIntersection( ray, tr->matrix(), nodeIntPoint ) ) + { + float dist = ( ray.origin() - intersectionPoint ).length(); + if ( minDist < 0 || dist < minDist ) + { + minDist = dist; + intersectionPoint = nodeIntPoint; + } + } } } - return false; + return minDist >= 0; } void QgsTerrainEntity::onShowBoundingBoxesChanged()