Cesium矩阵变换实现本地坐标转世界坐标

主要代码

        // 本地坐标与世界坐标的变换
        // 获取A点对应的世界坐标
        let posA =  Cesium.Cartesian3.fromDegrees(0, 0.0, 0.0);
        console.log("A点世界坐标:", posA);
        // 本地坐标到世界坐标的变换矩阵
        let localToWorldMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(posA);
        // 通过矩阵的逆,求出世界坐标到本地坐标的变换矩阵
        let worldToLocalMatrix = Cesium.Matrix4.inverse(localToWorldMatrix , new Cesium.Matrix4());
        
        // 将B点世界坐标转换到A点本地坐标系下的坐标
        let posB =  Cesium.Cartesian3.fromDegrees(2, 1.0, 0.0);
        console.log("B点世界坐标:", posB);
        let localPosB = Cesium.Matrix4.multiplyByPoint(worldToLocalMatrix , posB, new Cesium.Cartesian3());
        console.log("B点本地坐标(以A为原点的本地坐标系):", localPosB);


        // 将B点本地坐标(A为原点的本地坐标系)转世界坐标
        let worldPointB = Cesium.Matrix4.multiplyByPoint(localToWorldMatrix , localPosB, new Cesium.Cartesian3());
        console.log("B点世界坐标:", worldPointB);
        console.log("B点世界坐标(经纬度格式):", Cesium.Cartographic.fromCartesian(worldPointB));
        // 部分输出
        
        // A点世界坐标: Cartesian3 {x: 0, y: 0, z: 1}
 		// B点世界坐标: Cartesian3 {x: 0, y: 0, z: 2}
		// B点本地坐标(以A为原点的本地坐标系): Cartesian3 {x: 0, y: 0, z: 1}
		
		// A点世界坐标: Cartesian3 {x: 0, y: 1, z: 1}
		// B点世界坐标: Cartesian3 {x: 0, y: 0, z: 2}
		// B点本地坐标(以A为原点的本地坐标系): Cartesian3 {x: 0, y: 1.414205586940174, z: 0.00474951231167009}
		// 可以看出并不是直接的加减操作,说明坐标系变换中包含旋转

参考链接

[1]. Cesium之矩阵变换

[2]. Cesium之球心坐标与本地坐标

[3]. Cesium当中的逆矩阵的简单理解

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cesium是一款开源的JavaScript库,用于创建高度交互式的三维地球浏览器应用程序。当你需要将经度坐标换为屏幕坐标(像素坐标)时,在Cesium中,这个过程通常涉及到地图投影、视口变换和屏幕空间换。 首先,你需要获取经度对应的地理坐标(lon, lat, height)。然后,你可以通过以下步骤将这个地理坐标换为屏幕坐标: 1. **地图投影**:Cesium提供`MercatorProjection`或自定义投影,将经纬度映射到一个平面,比如WGS84坐标系统下的墨卡托投影。 2. **视口换**:从投影平面上得到的点,需要应用当前地图视图的中心、缩放比例以及偏移(视口矩阵),将其换到视口内的空间。 3. **屏幕坐标**:最后,使用`projectToPixel`函数将视口内的点换成屏幕空间的像素坐标,它会考虑浏览器窗口大小和CSS像素密度等因素。 下面是一个简化的伪代码示例: ```javascript const lon = ...; // 给定的经度 const lat = ...; // 给定的纬度 // 创建MercatorProjection实例 const projection = new Cesium.MercatorProjection(); // 获取地理坐标 const geoCoord = projection.project(new Cesium.Cartesian3(lon, lat, 0)); // 获取视口信息 const viewport = viewer.camera.frustum; const screenCoord = Cesium.Cartesian2.fromElements( viewport.project(geoCoord).x, viewport.height - viewport.project(geoCoord).y, viewer.scene.canvas ); console.log(screenCoord); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值