Part1cesium-unreal简介
![5ca474e0fd79e64c0ec2b72af726fac8.png](https://i-blog.csdnimg.cn/blog_migrate/ba11eab1d628201c59a49a670f9447fe.png)
Cesium for Unreal将3D地理空间生态系统带入了Unreal引擎。通过将高精度全尺寸WGS84地球、开放式API和开放式空间索引标准(如3Dtiles)以及基于云的Cesium Ion真实世界内容与Unreal Engine相结合,该项目开创了3D地理空间软件的新纪元。
Cesium 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++版本的经纬度、地心坐标、东北天坐标互相转换的方法。
欢迎加技术交流群交流。