代码解析
//获取节点的x,y,h,w
GeoExtent mapExtent = mapNode->getMap()->getProfile()->getExtent();
//设置为2维模式,静止鼠标中键,既不可旋转
manipulator->getSettings()->bindMouse(osgEarth::Util::EarthManipulator::ACTION_NULL, osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON, 0);
// 计算一个合理的最大范围,这样用户就不会缩小到我们需要超过3个变换的地方。
double maxDim = osg::maximum(mapExtent.width(), mapExtent.height());
double range = ((0.5 * maxDim) / 0.267949849);
manipulator->getSettings()->setMinMaxDistance(0.0, range);
osg::Group* root = new osg::Group;
// 我们将绘制地图三次,这样我们就可以提供一个从左到右无限滚动的视图。
// The centerMatrix is centered around the eye point.
osg::MatrixTransform* centerMatrix = new osg::MatrixTransform;
centerMatrix->addChild( mapNode );
root->addChild( centerMatrix );
// The left matrix is to the left of the center matrix
osg::MatrixTransform* leftMatrix = new osg::MatrixTransform;
leftMatrix->addChild( mapNode );
root->addChild( leftMatrix );
// The right matrix is to the right of the center matrix
osg::MatrixTransform* rightMatrix = new osg::MatrixTransform;
rightMatrix->addChild( mapNode );
root->addChild( rightMatrix );
viewer.setSceneData( root );
// 每一帧去判断当前视点
Viewpoint vp = manipulator->getViewpoint();
double eyeX = vp.focalPoint()->x();
GeoPoint focalPoint = *vp.focalPoint();
// 不允许视点超出地图范围,自定义操作器可以借鉴。
if (focalPoint.y() > mapExtent.yMax())
{
focalPoint.y() = mapExtent.yMax();
vp.focalPoint() = focalPoint;
manipulator->setViewpoint( vp );
}
else if (focalPoint.y() < mapExtent.yMin())
{
focalPoint.y() = mapExtent.yMin();
vp.focalPoint() = focalPoint;
manipulator->setViewpoint( vp );
}
GeoExtent centerExtent = mapExtent;
// 判断视点左右是否移除地图,用于衔接
float direction = 0.0;
if (eyeX < mapExtent.xMin())
{
// Move to the left
direction = -1.0;
}
else if (eyeX > mapExtent.xMax())
{
// Move to the right
direction = 1.0;
}
// 移动中心范围,使它的中心周围的眼睛点。
float offset = 0.0;
if (direction != 0.0)
{
while (true)
{
centerExtent = GeoExtent(centerExtent.getSRS(),
mapExtent.xMin() + offset, mapExtent.yMin(),
mapExtent.xMax() + offset, mapExtent.yMax());
if (eyeX >= centerExtent.xMin() && eyeX <= centerExtent.xMax())
{
break;
}
offset += direction * centerExtent.width();//这样保证了视点一直在中间的map中,三张衔接保证了不会出现溢出的情况
}
}
// 以当前偏移量设置三张地图
centerMatrix->setMatrix(osg::Matrixd::translate(offset, 0.0, 0.0));
leftMatrix->setMatrix(osg::Matrixd::translate(offset - mapExtent.width(), 0.0, 0.0));
rightMatrix->setMatrix(osg::Matrixd::translate(offset + mapExtent.width(), 0.0, 0.0));