QList<QVector3D> Qgs3DUtils::positions( const Qgs3DMapSettings &map, QgsVectorLayer *layer, const QgsFeatureRequest &request, Qgs3DTypes::AltitudeClamping altClamp ) { QList<QVector3D> positions; QgsFeature f; QgsFeatureIterator fi = layer->getFeatures( request ); while ( fi.nextFeature( f ) ) { if ( f.geometry().isNull() ) continue; const QgsAbstractGeometry *g = f.geometry().constGet(); for ( auto it = g->vertices_begin(); it != g->vertices_end(); ++it ) { QgsPoint pt = *it; float geomZ = 0; if ( pt.is3D() ) { geomZ = pt.z(); } float terrainZ = map.terrainGenerator()->heightAt( pt.x(), pt.y(), map ) * map.terrainVerticalScale(); float h; switch ( altClamp ) { case Qgs3DTypes::AltClampAbsolute: default: h = geomZ; break; case Qgs3DTypes::AltClampTerrain: h = terrainZ; break; case Qgs3DTypes::AltClampRelative: h = terrainZ + geomZ; break; } positions.append( QVector3D( pt.x() - map.origin().x(), h, -( pt.y() - map.origin().y() ) ) ); //qDebug() << positions.last(); } } return positions; }