Cesium屏幕中心坐标和相机位置坐标计算

1.获取当前屏幕中心点的位置

javascript 复制代码
    getCenterPosition() {
        let centerResult = viewer.camera.pickEllipsoid(
            new Cesium.Cartesian2(
                viewer.canvas.clientWidth / 2,
                viewer.canvas.clientHeight / 2,
            ),
        )
        centerPoint = centerResult;
        let curPosition = Cesium.Ellipsoid.WGS84.cartesianToCartographic(centerResult);
        let curLongitude = (curPosition.longitude * 180) / Math.PI;
        let curLatitude = (curPosition.latitude * 180) / Math.PI;
        return {
            lon: curLongitude,
            lat: curLatitude,
        }
        // }
    }

2.获取当前相机的位置

javascript 复制代码
 getCameraPosition() {
        var position = viewer.scene.camera.positionCartographic;
        // 弧度转经纬度
        var longitude = Cesium.Math.toDegrees(position.longitude);
        var latitude = Cesium.Math.toDegrees(position.latitude);
        var height = position.height;
        return { lng: longitude, lat: latitude, h: height }
    }

3.绕非固定屏幕中心点旋转

moveRotation方法参数中第一个参数step是移动步长,第二个参数i是判断是否是俯仰角还是航向角进行绕中心点进行翻滚,entity可以另外分离出来做一个方法,这样避免每次调用moveRotation方法都生成一个entity覆盖物。

javascript 复制代码
  moveRotation(step, i = 0) {
        // 添加实体
        let a = this.getCenterPosition();
        let b = this.getCameraPosition();
        entity = viewer.entities.add({
            position: new Cesium.Cartesian3.fromDegrees(a.lon, a.lat, 0),
            point: {
                pixelSize: 0,
                // show: false
            }
        });
        let clickPosition1 = Cesium.Cartesian3.fromDegrees(a.lon, a.lat, 0);
        let clickPosition2 = Cesium.Cartesian3.fromDegrees(b.lng, b.lat, b.h);
        // 计算两个点之间的距离
        let distancetemp = Cesium.Cartesian3.distance(clickPosition1, clickPosition2);
        // 距离远一些就将移动角度调整大一些
        if (i && distancetemp > 20000) {
            heading += 3 * step;
        } else if (i) {
            heading += step;
        } else if (!i && distancetemp > 20000) {
            pitch += 3 * step;
        } else if (!i) {
            pitch += step;
        }
       let offset = new Cesium.HeadingPitchRange(
            heading,
            pitch,
            distancetemp  // 相机距离地球球心的距离
        );
        viewer.zoomTo(entity, offset);
    }

4.相机位置在原地据法向量升起和下降

该方法的参数distance接受正负数,对应上升和下降

javascript 复制代码
   moveForward(distance) {
        var camera = viewer.camera;
        var direction = camera.direction;
        //获得此位置默认的向上方向
        var up = Cesium.Cartesian3.normalize(camera.position, new Cesium.Cartesian3());
        var right = Cesium.Cartesian3.cross(direction, up, new Cesium.Cartesian3());
        direction = Cesium.Cartesian3.cross(up, right, new Cesium.Cartesian3());
        direction = Cesium.Cartesian3.normalize(direction, direction);
        direction = Cesium.Cartesian3.multiplyByScalar(direction, distance, direction);
        camera.position = Cesium.Cartesian3.add(camera.position, direction, camera.position);
    }
相关推荐
To_OC10 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
不好听61310 小时前
从一行 JSX 到屏幕像素:前端开发者必须懂的浏览器渲染管线
前端
恒拓高科WorkPlus10 小时前
企业级内网即时通讯建设模型:BeeWorks内网IM四层架构
前端
前端小李子11 小时前
前端环境变量裸奔?我用 EnvShield 给它穿了件防弹衣
前端
youtootech11 小时前
HarmonyOS《柚兔学伴》项目实战25-我的页面、Web 嵌入与项目总结
前端·华为·harmonyos
小林ixn12 小时前
从零到一理解 React 父子组件通信:手写一个 Todo 应用带你彻底搞懂单向数据流
前端·javascript·react.js
gaosushexiangji12 小时前
基于高速3D-DIC的风力叶片旋转工况下应变测量与振动模态分析
数码相机
醇氧13 小时前
CountDownLatch / CyclicBarrier / Semaphore 面试高频问答清单
前端·面试·职场和发展
窝子面14 小时前
手搓最简前后端协作-node
javascript·数据库