当前位置: 首页 > news >正文

如何获得Cesium的TileSet并设置本地服务器的Url

一.总体思路

首先使用管理者获得TileSet,通过JSON文件读写,调用对应的Cesium内部提供的函数。

UE5中Json文件的读取与解析 - 知乎 (zhihu.com)  不太了解JSON的可以学习这个。

二.具体实现

1.创建Actor,并且

如何获得Cesium的TileSet,设置本地Url
一.首先使用管理者获得TileSet
二.通过JSON文件读写
三.设置CesiumMap

1.首先前置声明两个可以直接设置组件,一个定时器负责定时读取JSON。

#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "UrlManager.generated.h"class ACesium3DTileset;
class UCesiumTileMapServiceRasterOverlay;
UCLASS()
class HMSLIVEEARTH_API AUrlManager : public AActor
{GENERATED_BODY()public:	// Sets default values for this actor's propertiesAUrlManager();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:	// Called every framevirtual void Tick(float DeltaTime) override;ACesium3DTileset* CesiumTil;UCesiumTileMapServiceRasterOverlay* CesiumRas;//声明定时器FTimerHandle Time;
private:bool LoadUrl();void SetUrl();FString Tileseturl;FString RasterOverlayurl;FString preTileseturl="";FString preRasterOverlayurl="";};


2.包含两个需要用到的头文件Cesium3DTileset.h,CesiumTileMapServiceRasterOverlay.h,如果不能包含。可能是你的插件,依赖里没有包含Cesium模块。

#include "Cesium3DTileset.h"
#include "CesiumTileMapServiceRasterOverlay.h"


3.拿到这个TileSet类,需要使用 Actors的数组,通过GetAllActorsOfClass函数(是不是很想蓝图那个)拿到这个世界所有这个类型的类放到这个数组里。
TArray<AActor*> Actors;
UGameplayStatics::GetAllActorsOfClass(GetWorld(), ACesium3DTileset::StaticClass(), Actors);

再道数组里拿到第一个Actor类进行Cast转换。
4.通过这个实例类,拿到使用组件通过类型,参数后面记得加::static
CesiumRas = Cast<UCesiumTileMapServiceRasterOverlay>(CesiumTil->GetComponentByClass(UCesiumTileMapServiceRasterOverlay::StaticClass()));


5.读取JSON文件,
JSON数据文件路径,使用UKismetSystemLibrary::GetProjectDirectory() 工程路径。加上你的配置文件路径。
使用FPlatformFileManager静态类里的FileExists来检测文件,FPlatformFileManager::Get().GetPlatformFile().FileExists(*urlPath).
如果存在,再读取。FFileHelper里的LoadFileToString。将文件里的所有字符读到FileStr这个FSring里。

6.准备解析FString 通过TJsonReaderFactory<>创建TJsonReader。 和存储JsonObject的指针 Root;
通过循环  FJsonSerializer::Deserialize解析文件到Root里。Root里拿到每个键对应的值,赋值到变量里。也就是两个url。

//JSON数据文件路径
FString urlPath = UKismetSystemLibrary::GetProjectDirectory()  + "CesiumUrl.Json";
FString FileStr;
//获取文件
if (!FPlatformFileManager::Get().GetPlatformFile().FileExists(*urlPath))
{UE_LOG(LogTemp, Error, TEXT("%s not exist"), *urlPath);return false;
}
//读取文件到字符串
FFileHelper::LoadFileToString(FileStr, *urlPath);
TSharedRef< TJsonReader<> > Reader = TJsonReaderFactory<>::Create(FileStr);
TSharedPtr<FJsonObject> Root;//解析文件
if (FJsonSerializer::Deserialize(Reader, Root))
{if (Root->HasField(TEXT("Tileseturl"))){Tileseturl = Root->GetStringField(TEXT("Tileseturl"));RasterOverlayurl = Root->GetStringField(TEXT("TileMapServiceRasterOverlayurl"));if (Tileseturl.Equals(preTileseturl) && RasterOverlayurl.Equals(preRasterOverlayurl)){return false;}else{preTileseturl = Tileseturl;preRasterOverlayurl = RasterOverlayurl;return true;}}
}
else
{return false;
}
return true;


7.设置url,在将才指针拿到两个实例的情况下,设置url函数。Tile记得刷新,不然会无法及时加载地形。本人在项目中是定时器刷新的。

//获得第一个Cesium3DTileset
TArray<AActor*> Actors;
UGameplayStatics::GetAllActorsOfClass(GetWorld(), ACesium3DTileset::StaticClass(), Actors);
//获取和设置两个组件的 url
if (Actors.Num() != 0)	
{CesiumTil = Cast<ACesium3DTileset>(Actors[0]);if (CesiumTil != nullptr ){CesiumTil->SetUrl(Tileseturl); //CesiumRas = Cast<UCesiumTileMapServiceRasterOverlay>(CesiumTil->GetComponentByClass(UCesiumTileMapServiceRasterOverlay::StaticClass()));CesiumRas->Url = RasterOverlayurl;CesiumTil->RefreshTileset();}
}


 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • IO半虚拟化-vhost学习笔记
  • U-Net: 一种用于图像分割的深度学习架构
  • MyPostMan 迭代文档管理、自动化接口闭环测试工具(自动化测试篇)
  • go 实现websocket以及详细设计流程过程,确保通俗易懂
  • 谷粒商城实战笔记-37-前端基础-Vue-基本语法插件安装
  • 【阿里OSS文件上传】SpringBoot实现阿里OSS对象上传
  • 【Vite】快速入门及其配置
  • WPF中UI元素继承关系
  • python os库使用教程
  • 【源码阅读】Sony的go breaker熔断器源码探究
  • C2W1.Assignment.Parts-of-Speech Tagging (POS).Part2
  • 算法日记day 15(二叉树的遍历)
  • 【Qt】QWidget核心属性相关API
  • 新版网页无插件H.265播放器EasyPlayer.js如何测试demo视频?
  • 深入浅出mediasoup—通信框架
  • [译]如何构建服务器端web组件,为何要构建?
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 10个确保微服务与容器安全的最佳实践
  • centos安装java运行环境jdk+tomcat
  • conda常用的命令
  • Invalidate和postInvalidate的区别
  • Javascript设计模式学习之Observer(观察者)模式
  • Just for fun——迅速写完快速排序
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Service Worker
  • socket.io+express实现聊天室的思考(三)
  • Tornado学习笔记(1)
  • Vue.js源码(2):初探List Rendering
  • 构造函数(constructor)与原型链(prototype)关系
  • 讲清楚之javascript作用域
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 如何合理的规划jvm性能调优
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 通过几道题目学习二叉搜索树
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • FaaS 的简单实践
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 阿里云移动端播放器高级功能介绍
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​一些不规范的GTID使用场景
  • #1014 : Trie树
  • #Linux(帮助手册)
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (3)STL算法之搜索
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (七)c52学习之旅-中断
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十三)MipMap
  • (四)软件性能测试