void GeoMath::interpolate(double lat1Rad, double lon1Rad, double lat2Rad, double lon2Rad, double t, double& out_latRad, double& out_lonRad) { static osg::EllipsoidModel em; // questionable. make non-static? osg::Vec3d v0, v1; em.convertLatLongHeightToXYZ(lat1Rad, lon1Rad, 0, v0.x(), v0.y(), v0.z()); double r0 = v0.length(); v0.normalize(); em.convertLatLongHeightToXYZ(lat2Rad, lon2Rad, 0, v1.x(), v1.y(), v1.z()); double r1 = v1.length(); v1.normalize(); osg::Vec3d axis = v0 ^ v1; double angle = acos( v0 * v1 ); osg::Quat q( angle * t, axis ); v0 = (q * v0) * 0.5*(r0 + r1); double dummy; em.convertXYZToLatLongHeight( v0.x(), v0.y(), v0.z(), out_latRad, out_lonRad, dummy ); }
void AutoClipPlaneCullCallback::operator()( osg::Node* node, osg::NodeVisitor* nv ) { if ( _active ) { osgUtil::CullVisitor* cv = Culling::asCullVisitor(nv); if ( cv ) { osgEarth::Map* map = _mapNode.valid() ? _mapNode->getMap() : 0; osg::Camera* cam = cv->getCurrentCamera(); osg::ref_ptr<osg::CullSettings::ClampProjectionMatrixCallback>& clamper = _clampers.get(cam); if ( !clamper.valid() ) { clamper = new CustomProjClamper(); cam->setClampProjectionMatrixCallback( clamper.get() ); OE_INFO << LC << "Installed custom projeciton matrix clamper" << std::endl; } else { CustomProjClamper* c = static_cast<CustomProjClamper*>(clamper.get()); osg::Vec3d eye, center, up; cam->getViewMatrixAsLookAt( eye, center, up ); // clamp the far clipping plane to the approximate horizon distance if ( _autoFarPlaneClamping ) { double d = eye.length(); c->_maxFar = sqrt( d*d - _rp2 ); } else { c->_maxFar = DBL_MAX; } // get the height-above-ellipsoid. If we need to be more accurate, we can use // ElevationQuery in the future.. //osg::Vec3d loc; GeoPoint loc; if ( map ) { loc.fromWorld( map->getSRS(), eye ); //map->worldPointToMapPoint( eye, loc ); } else { static osg::EllipsoidModel em; osg::Vec3d t; em.convertXYZToLatLongHeight( eye.x(), eye.y(), eye.z(), loc.y(), loc.x(), loc.z() ); } //double hae = loc.z(); double hae = loc.z(); if (_mapNode.valid()) { double height = 0.0; _mapNode->getTerrain()->getHeight(loc.getSRS(), loc.x(), loc.y(), &height); //OE_NOTICE << "got height " << height << std::endl; hae -= height; //OE_NOTICE << "HAE=" << hae << std::endl; } // ramp a new near/far ratio based on the HAE. c->_nearFarRatio = Utils::remap( hae, 0.0, _haeThreshold, _minNearFarRatio, _maxNearFarRatio ); } #if 0 { double n, f, a, v; cv->getProjectionMatrix()->getPerspective(v, a, n, f); OE_INFO << std::setprecision(16) << "near = " << n << ", far = " << f << ", ratio = " << n/f << std::endl; } #endif } } traverse( node, nv ); }