cesium-unreal移植坐标转换

Part1cesium-unreal简介

5ca474e0fd79e64c0ec2b72af726fac8.png

a5f75f1c817689cc4cd104f79e892b50.pngCesium for Unreal将3D地理空间生态系统带入了Unreal引擎。通过将高精度全尺寸WGS84地球、开放式API和开放式空间索引标准(如3Dtiles)以及基于云的Cesium Ion真实世界内容与Unreal Engine相结合,该项目开创了3D地理空间软件的新纪元。914702195498fb81e56cf3af1084266f.pngCesium for Unreal支持基于开放标准和API的云和私有网络内容和服务。您可以自由使用任何支持的内容源、标准、API与Cesium for Unreal的组合。
github地址:
https://github.com/CesiumGS/cesium-unreal

Part2坐标转换

Cesium for Unreal坐标转换涉及到3个类,都是基于C++实现。坐标转换的概念可以参考下面博客,C++测试结果与这篇完全一致。

玩转"经纬度  地心坐标  东北天坐标"

1Ellipsoid类

该类路径地址如下:

cesium-native/CesiumGeospatial/include/CesiumGeospatial/Ellipsoid.h

主要功能为定义了椭球对象,并实现了WGS84的椭球模型。这个对象还实现了求解球面某点法线、经纬度转笛卡尔坐标系,笛卡尔转经纬度。相关函数名称如下:
求解球面某点法:

glm::dvec3
  geodeticSurfaceNormal(const Cartographic& cartographic) const noexcept;

经纬度转笛卡尔坐标系:

glm::dvec3
  cartographicToCartesian(const Cartographic& cartographic) const noexcept;

笛卡尔转经纬度:

std::optional<Cartographic>
  cartesianToCartographic(const glm::dvec3& cartesian) const noexcept;

2Cartographic类

该类地址路径如下:

cesium-native/CesiumGeospatial/include/CesiumGeospatial/Cartographic.h

主要保存了经纬度和大地高的椭球数据。保存在如下成员变量中:

/**
   * @brief The longitude, in radians.
   */
  double longitude;

  /**
   * @brief The latitude, in radians.
   */
  double latitude;

  /**
   * @brief The height, in meters.
   */
  double height;

3Transforms类

该类地址路径如下:

cesium-native/CesiumGeospatial/include/CesiumGeospatial/Transforms.h

主要实现了东北天坐标转地心坐标。实现函数如下:

static glm::dmat4x4 eastNorthUpToFixedFrame(
      const glm::dvec3& origin,
      const Ellipsoid& ellipsoid = Ellipsoid::WGS84) noexcept;

Part3代码移植

我们将上面3个类移植到C++工程中,即可实现经纬度、地心坐标、东北天坐标的转换。

cmake组织如下:

cmake_minimum_required(VERSION 3.0.0)
project(eastNorthUp VERSION 0.1.0)
set(CMAKE_CXX_STANDARD 17)
AUX_SOURCE_DIRECTORY(./src SC_FILES)
INCLUDE_DIRECTORIES ("src")
add_executable(eastNorthUp ${SC_FILES})
target_include_directories(eastNorthUp
SYSTEM PUBLIC
${CMAKE_CURRENT_LIST_DIR}/extern/glm
)

说明:
1、cesium-unreal采用C++17编写,所以我们通过 set(CMAKE_CXX_STANDARD 17)来设置编译为C++17
2、代码路径在src下面,通过AUX_SOURCE_DIRECTORY遍历所有文件并赋值给变量SC_FILES
3、这里还调用了glm的数学矩阵库,所以通过target_include_directories来设置头文件目录包含。

4经纬度转地心坐标

auto ct = Cartographic::fromDegrees(116, 39);
  auto center = Ellipsoid::WGS84.cartographicToCartesian(ct);
  std::cout << std::setprecision(10)
            << "x:" << center.x << " "
            << "Y:" << center.y << " "
            << "z:" << center.z << std::endl;

输出

x:-2175779.4973128252 Y:4461009.0617699539 z:3992317.0227517267

5地心坐标转经纬度

auto cartographic = Ellipsoid::WGS84.cartesianToCartographic(center);
  auto ctvalue = cartographic.value();
  std::cout << std::setprecision(10)
            << "longitude:" << HMath::radiansToDegrees(ctvalue.longitude) << " "
            << "latitude:" << HMath::radiansToDegrees(ctvalue.latitude) << std::endl;

输出:

longitude:116.0000000000 latitude:39.0000000000

6东北天转地心坐标

auto enr2ffTransforms = Transforms::eastNorthUpToFixedFrame(center);
  glm::dvec3 enrPoint(0, 0, 0);
  auto result1 = glm::dvec3(enr2ffTransforms * glm::dvec4(enrPoint, 1));
  std::cout << std::setprecision(10)
            << "x:" << result1.x << " "
            << "Y:" << result1.y << " "
            << "z:" << result1.z << std::endl;

输出

x:-2175779.4973128252 Y:4461009.0617699539 z:3992317.0227517267

7地心坐标转东北天

auto enr2ffTransformsInverse = glm::inverse(enr2ffTransforms);
  auto result2 = glm::dvec3(enr2ffTransformsInverse * glm::dvec4(result1, 1));
  std::cout << std::setprecision(10)
            << "x:" << result2.x << " "
            << "Y:" << result2.y << " "
            << "z:" << result2.z << std::endl;

输出

x:0.0000000000 Y:0.0000000005 z:-0.0000000014

输出结果符合预期。

Part4总结

本文主要介绍了cesium-unreal项目,并从该项目中提取出了C++版本的经纬度、地心坐标、东北天坐标互相转换的方法。
欢迎加技术交流群交流。218383068cb225413fce35604341e0a8.png

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值