osgearth_infinitescroll--无限延长的二维地图(设置二维操作器)

代码解析

//获取节点的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));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值