首页 > 其他分享 >[未解决] Cesium camera.getPickRay 滚轮缩放 射线拾取问题

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

时间:2023-02-09 14:37:49浏览次数:44  
标签:缩放 viewer scene camera let Cesium 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方法

标签:缩放,viewer,scene,camera,let,Cesium,getPickRay
From: https://www.cnblogs.com/cosmicbison/p/17105136.html

相关文章

  • 4-观测值缩放
    importpandasaspdimportdatetimefromsklearn.preprocessingimportMinMaxScaler#加载数据defparser(x):returndatetime.datetime.strptime(x,'%Y/%m/%......
  • canvas + Cesium 动画图片材质
    letosm=Cesium.createOpenStreetMapImageryProvider({url:"https://a.tile.openstreetmap.org/",})letviewer=newCesium.Viewer(thi......
  • cesium修改TileCoordinatesImageryLayer源码实现随机颜色,点选显示坐标
    cesium修改TileCoordinatesImageryLayer源码实现随机颜色,点选显示坐标。1、修改函数requestImage:实现了随机颜色的瓦片覆盖。TileCoordinatesImageryProvider.prototype.......
  • Camera | 3.瑞芯微平台MIPI摄像头常用调试命令
    瑞芯微专栏前面2篇我们讲解了camera的一些基础概念和知识。本文主要讲述在瑞芯微平台上摄像头开发常用的调试命令。0、环境soc:rk3568board:EVB1-DDR4-V10软......
  • arcgis怎样使文字随图形的缩放而缩放?标注label转注记Annotation?
    在ArcGIS中,文本标注分为三种,既标注(label)、注记(annotation)和图形注记(elementtext)。其中,默认情况下,只有annotation可以随比例进行缩放。1、右击图层【标注】图层。2、......
  • Cesium通过自定义着色器实现倾斜压平
    实现原理PS:使用customShader实现倾斜压平,没改源码获取模型的顶点数据后转以模型中心点的局部坐标系下(这里把所有点数据都在统一的局部坐标系下处理)把绘制的范围转为模......
  • Cesium实现镜面反射
    实现原理计算反射相机与当前相机相对于水面,呈镜面对称的相机从反射相机的角度绘制一张纹理图获取反射相机纹理图对应的UV坐标在反射相机的MVP矩阵的V之前乘以反......
  • Cesium 加载GeoJson数据,看不到实体效果
    问题我真的不知道为什么几乎每次要用Cesium加什么东西,不管是点线面还是图层,总是不顺利要加载一个GeoJson数据,数据包含几个点,需要展示点的位置和标签名称。用以下代码,打印......
  • cesium背景透明
    constviewer=newCesium.Viewer("cesiumContainer",{orderIndependentTranslucency:false,contextOptions:{webgl:{alpha:true,},},}......
  • Cesium之影像底图加载
    1.引言Cesium是一款三维地球和地图可视化开源JavaScript库,使用WebGL来进行硬件加速图形,使用时不需要任何插件支持,基于Apache2.0许可的开源程序,可以免费用于商业和非商业......