地理坐标转屏幕坐标

function test() {
console.log(viewer.scene.camera);
let heading = viewer.scene.camera.heading;
let pitch = viewer.scene.camera.pitch;
let roll = viewer.scene.camera.roll;
let posWC = viewer.scene.camera.positionWC;
let viewMatrix = viewer.scene.camera.viewMatrix;

           const camera = new Cesium.Camera(viewer.scene);
           camera.setView({
                destination: Cesium.Cartesian3.fromDegrees(99, 21, 10000),
                orientation: {
                    heading: 4.8031672383442245,
                    pitch: -0.46137795322172037,
                    roll: 6.280696062339012
                }
            });
           
           let screenPos = wcPos2ScreenPos(99, 21, 2, posWC, new Cesium.HeadingPitchRoll(heading, pitch, roll), viewer.canvas.width, viewer.canvas.height);
            
          // 屏幕坐标
          let screenCoordinates = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
                viewer.scene,
                Cesium.Cartesian3.fromDegrees(99, 21, 2)
            );
            console.log(screenCoordinates, screenPos);
        }


        function wcPos2ScreenPos(lng, lat, alt, cameraPos, cameraHPR, canvasWidth, canvasHeight){
            cameraHPR.heading = cameraHPR.heading - Cesium.Math.PI_OVER_TWO;
            const rotQuat = Cesium.Quaternion.fromHeadingPitchRoll(cameraHPR, new Cesium.Quaternion());
            const rotMat = Cesium.Matrix3.fromQuaternion(rotQuat, new Cesium.Matrix3());
            const direction = Cesium.Matrix3.getColumn(rotMat, 0, new Cesium.Cartesian3());
            const up = Cesium.Matrix3.getColumn(rotMat, 2, new Cesium.Cartesian3());
            const right = Cesium.Cartesian3.cross(direction, up, new Cesium.Cartesian3());

            const transform = Cesium.Transforms.eastNorthUpToFixedFrame(cameraPos, Cesium.Ellipsoid.WGS84, new Cesium.Matrix4());
            const directionWC =Cesium.Matrix4.multiplyByPointAsVector(transform, direction, new Cesium.Cartesian3());
            const upWC =Cesium.Matrix4.multiplyByPointAsVector(transform, up, new Cesium.Cartesian3());
            const rightWC =Cesium.Matrix4.multiplyByPointAsVector(transform, right, new Cesium.Cartesian3());

            const viewMatrix = Cesium.Matrix4.computeView(cameraPos, directionWC, upWC, rightWC, new Cesium.Matrix4());
            const objPos = Cesium.Cartesian3.fromDegrees(lng, lat, alt);
            const positionEC = Cesium.Matrix4.multiplyByVector(viewMatrix, new Cesium.Cartesian4(objPos.x,objPos.y,objPos.z,1), new Cesium.Cartesian4());

            const aspectRatio = canvasWidth/canvasHeight;
            const fov = Cesium.Math.toRadians(60.0);
            const fovy =aspectRatio <= 1? fov: Math.atan(Math.tan(fov * 0.5) / aspectRatio) * 2.0;
            const near = 0.1;
            const far = 10000000000;
            const top = near * Math.tan(0.5 * fovy);
            const bottom = -top;
            const right1 = aspectRatio * top;
            const left = -right1;
            const projectionMatrix = Cesium.Matrix4.computePerspectiveOffCenter(left, right1, bottom, top, near, far, new Cesium.Matrix4());

            const positionCC = Cesium.Matrix4.multiplyByVector(projectionMatrix, positionEC, new Cesium.Cartesian4());
            let viewport = new Cesium.BoundingRectangle(0,0, canvasWidth, canvasHeight);
            let screenPos = Cesium.SceneTransforms.clipToGLWindowCoordinates(viewport, positionCC);
            screenPos.y = canvasHeight - screenPos.y;
            return screenPos;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值