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);
    }
相关推荐
旧味清欢|4 分钟前
关注分离(Separation of Concerns)在前端开发中的实践演进:从 XMLHttpRequest 到 Fetch API
javascript·http·es6
热爱编程的小曾21 分钟前
sqli-labs靶场 less 8
前端·数据库·less
gongzemin33 分钟前
React 和 Vue3 在事件传递的区别
前端·vue.js·react.js
Apifox1 小时前
如何在 Apifox 中通过 Runner 运行包含云端数据库连接配置的测试场景
前端·后端·ci/cd
-代号95271 小时前
【JavaScript】十四、轮播图
javascript·css·css3
树上有只程序猿1 小时前
后端思维之高并发处理方案
前端
庸俗今天不摸鱼2 小时前
【万字总结】前端全方位性能优化指南(十)——自适应优化系统、遗传算法调参、Service Worker智能降级方案
前端·性能优化·webassembly
QTX187302 小时前
JavaScript 中的原型链与继承
开发语言·javascript·原型模式
黄毛火烧雪下2 小时前
React Context API 用于在组件树中共享全局状态
前端·javascript·react.js
Apifox2 小时前
如何在 Apifox 中通过 CLI 运行包含云端数据库连接配置的测试场景
前端·后端·程序员