[未解决] Cesium camera.getPickRay 滚轮缩放 射线拾取问题

需求

相机变化(包括移动、缩放)时,获取当前视野范围的四点坐标。
采用的思路是,添加相机变化的监听事件,当变化大于设置的识别精度,则会触发方法,获取当前屏幕四点坐标,分别建立相机与四点坐标的射线,求射线与地球的交点。
下面是以这个思路实现的代码:

    viewer.scene.camera.percentageChanged = 0.2; // 设置相机变化的识别精度,默认值为0.5
    // 设置相机变化的监听事件
    cameraChangedListener = (percentage) => {
        getScreenPoi();
    };
    removeChanged = viewer.camera.changed.addEventListener( cameraChangedListener );

    getScreenPoi(){
        let canvas = viewer.scene.canvas;
        let ptLT = new Cesium.Cartesian2(0, 0); // 左上角
        let ptLB = new Cesium.Cartesian2(0, canvas.clientHeight); // 左下角
        let ptRT = new Cesium.Cartesian2(canvas.clientWidth, 0); // 右上角
        let ptRB = new Cesium.Cartesian2(canvas.clientWidth, canvas.clientHeight); // 右下角

        let pickLT = viewer.scene.globe.pick(viewer.camera.getPickRay(ptLT), viewer.scene);
        let pickLB = viewer.scene.globe.pick(viewer.camera.getPickRay(ptLB), viewer.scene);
        let pickRT = viewer.scene.globe.pick(viewer.camera.getPickRay(ptRT), viewer.scene);
        let pickRB = viewer.scene.globe.pick(viewer.camera.getPickRay(ptRB), viewer.scene);

        if (pickLT) {
            // 将三维坐标转成地理坐标
            let geoPtLT =
                viewer.scene.globe.ellipsoid.cartesianToCartographic(pickLT);
            // 地理坐标转换为经纬度坐标
            left_top = [
                (geoPtLT.longitude / Math.PI) * 180,
                (geoPtLT.latitude / Math.PI) * 180,
            ];
        }
        if(pickLB) {
            ...
        }
    }

问题

上面代码基本可以满足需求,但是遇到奇怪的bug:鼠标滚轮向下滚动,即缩小(高度变高)时,有较大概率遇到四个点的pickXX会有一个或几个出现undefined的情况,但平移、放大都正常。
考虑了问题原因,想从以下几个方面寻找:

  1. 滚轮缩小事件
  2. camera.getPickRay方法
posted @ 2023-02-09 14:18  宇宙野牛  阅读(235)  评论(0编辑  收藏  举报