bool SpatialReference::createWorldToLocal(const osg::Vec3d& xyz, osg::Matrixd& out_world2local ) const { osg::Matrixd local2world; if ( !createLocalToWorld(xyz, local2world) ) return false; out_world2local.invert(local2world); return true; }
void FeaturesToNodeFilter::computeLocalizers( const FilterContext& context, const osgEarth::GeoExtent &extent, osg::Matrixd &out_w2l, osg::Matrixd &out_l2w ) { if ( context.isGeoreferenced() ) { if ( context.getSession()->getMapInfo().isGeocentric() ) { const SpatialReference* geogSRS = context.profile()->getSRS()->getGeographicSRS(); GeoExtent geodExtent = extent.transform( geogSRS ); if ( geodExtent.width() < 180.0 ) { osg::Vec3d centroid, centroidECEF; geodExtent.getCentroid( centroid.x(), centroid.y() ); geogSRS->transform( centroid, geogSRS->getECEF(), centroidECEF ); geogSRS->getECEF()->createLocalToWorld( centroidECEF, out_l2w ); out_w2l.invert( out_l2w ); } } else // projected { if ( extent.isValid() ) { osg::Vec3d centroid; extent.getCentroid(centroid.x(), centroid.y()); extent.getSRS()->transform( centroid, context.getSession()->getMapInfo().getProfile()->getSRS(), centroid ); out_w2l.makeTranslate( -centroid ); out_l2w.invert( out_w2l ); } } } }