赞
踩
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
Cesium for Unreal坐标转换涉及到3个类,都是基于C++实现。坐标转换的概念可以参考下面博客,C++测试结果与这篇完全一致。
该类路径地址如下:
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;
该类地址路径如下:
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;
该类地址路径如下:
cesium-native/CesiumGeospatial/include/CesiumGeospatial/Transforms.h
主要实现了东北天坐标转地心坐标。实现函数如下:
- static glm::dmat4x4 eastNorthUpToFixedFrame(
- const glm::dvec3& origin,
- const Ellipsoid& ellipsoid = Ellipsoid::WGS84) noexcept;
我们将上面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来设置头文件目录包含。
- 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
- 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
- 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
- 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
输出结果符合预期。
本文主要介绍了cesium-unreal项目,并从该项目中提取出了C++版本的经纬度、地心坐标、东北天坐标互相转换的方法。
欢迎加技术交流群交流。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。