Cesium最靠普解决禁止相机进入地下

    技术2022-07-15  71

    使用Cesium快一年了,就开源的三维地图引擎而言,个人认为是最方便的了。

     

    在使用过程中遇到了很多的问题,如cgc2000,地图出现暗灰,加载互联网地图显示出现模糊等现像。在网上有很多资料,但是我发现大部分人是说不到重点,或乱写一通,总之最可怕的是知其然而不知其所以然的人,当然最近发现我也是。

     

    1、地图暗灰可以参照

          https://www.jianshu.com/p/4c4a6d769dc5该作者个人认为,是个实在人

          至于网上其它说的调灰度等均不可信,个人认为可以学习,但实际上没有任何用处,浪费时间

    2、加载互联网地图显示出现模糊

          https://blog.csdn.net/weixin_46592036/article/details/106206502该作者个人认为,是个写程序的人,见不得一点瑕疵

          至于网上说的调整maximumScreenSpaceError等,可以试试也有效果,但是个人认为解决得不是很彻底

     

    3、让我最头痛的问题是进地问题

         我在网上查找了很多资料,均能解决一部分问题,总会有很大的可能性进地。

         算了编不了,直接说思路:

          进地主要是通过鼠标抬高地图时,直接翻到地下面了,考虑的方向是实时检测是否与地面接触,但是因为是三维的是一个地球,所以只能考虑设定一个相机仰角,提前保存好坐标,超过仰角则重置相机。

          网上有很多直接通过鼠标事件进行监测,经过测试完全达不到效果,要不是没解决到,要不就是进地后又回弹,使用感觉不好因此我直接修改了Cesium.js的update3D方法代码如下:

    function update3D(controller) {

            //开始

            var scene = controller._scene;

            var camera = scene.camera;

            var cameraPosition = Cartesian3.clone(camera.position);

            var cameraRight = Cartesian3.clone(camera.right);

            var cameraDirection = Cartesian3.clone(camera.direction);

            var cameraUp = Cartesian3.clone(camera.up);

            reactToInput(controller, controller.enableRotate, controller.rotateEventTypes, spin3D, controller.inertiaSpin, '_lastInertiaSpinMovement');

            reactToInput(controller, controller.enableZoom, controller.zoomEventTypes, zoom3D, controller.inertiaZoom, '_lastInertiaZoomMovement');

            reactToInput(controller, controller.enableTilt, controller.tiltEventTypes, tilt3D, controller.inertiaSpin, '_lastInertiaTiltMovement');

            reactToInput(controller, controller.enableLook, controller.lookEventTypes, look3D);

            if (scene.mode == SceneMode.MORPHING) {

                return;

            }

     

            if (scene.mode == SceneMode.SCENE2D) {

                return;

            }

            if(camera.pitch>CesiumMath.toRadians(-20))

            {

                camera.position = cameraPosition;

                camera.right = cameraRight;

                camera.direction = cameraDirection;

                camera.up = cameraUp;

            }

            //结束

        }

    Processed: 0.013, SQL: 9