本篇是基于Cesium for Unreal这个插件,基本入门我这里就不多说了,不会的人可以先跟着这个教程学习一下
Cesium for Unreal快速入门
本篇重点讲述一下如何加载本地地形
1、准备工作
安装最新的Cesiumlab软件和ArcGIS软件
2、准备数据
(1)、在地理空间数据云上下载所需的高程数据,根据你所需的经纬度选择其中一个下载,下载完会得到一个压缩包,解压后会得到一个.img的文件
地理空间数据云
(2)、ArcGIS转化数据
通过ArcGIS软件将得到的.img文件转换为.tif格式的文件,这么做的原因是因为下一步的cesiumLab软件并不能处理.img格式的文件,只能处理.tif格式的,打开ArcGIS软件,打开.img文件,TOC列表中右击.img文件,“数据”——“导出数据”,“导出栅格数据”窗口中格式选择tif,选择保存开始转换。
(3)CesiumLab处理地形数据
打开CesiumLab软件,选择数据处理----地形切片----添加tif文件----选择散列文件----选择输出文件夹----确认----之后等待进度条结束----点击分发服务----地形服务,就会看到地形的url和经纬度范围
(4)UE加载地形
将地形服务的URL填入Cesium World Terrain的URL中,将经纬度填入到CesiumGeoreference-1中的经纬度中
这样,本地地形就加载出来了,前提是需要开着cesiumlab软件,如果不想每次打开这个软件,可以用tomcat在本地开启一个服务,这里给大家提供一个参考
CesiumLab地形处理成果在Tomcat和IIS上发布
(5)经纬度和空间坐标相互转化
打开主关卡蓝图,引用CesiumGeoreference-1和DynamicPawn两个对象
Inaccurate Transform Ue to Longitude Latitude Height:ue坐标转化为经纬度坐标
Inaccurate Transform Longitude Latitude Height to Ue:经纬度坐标转化为ue坐标
(6)百度、高德坐标转化为谷歌坐标
因为cesium for unreal用的是谷歌地图,也就是WGS84坐标系,而国内的高德地图是火星GCJ02坐标系,百度用的是BD09坐标系,所以我们一般开发拿到百度或者谷歌的坐标之后需要转化为谷歌坐标。
新建一个C++类,命名为CoordinateTrans,.h文件和.cpp文件如下
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CoordinateTrans.generated.h"
UCLASS()
class CESIUMDEMO_API ACoordinateTrans : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ACoordinateTrans();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
public:
UFUNCTION(BlueprintCallable, Category = "Cesium")
void gcj02towgs84(float lng, float lat, float& wglng, float& wglat);
double transformLat(double x,