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

UE5 C++在Cesium上给定一个坐标垂直地面射线正交的地形高度

一.方法一:需要一个Actor里,向下垂直射线。自身高度-射线距离。

#include "CesiumGlobeAnchorComponent.h"
#include "CesiumOriginShiftComponent.h"
#include "GeoTransforms.h"
#include "CesiumGeoreference.h"
	UPROPERTY(BlueprintReadOnly, EditAnywhere, meta = (AllowPrivateAccess = "true"))UCesiumGlobeAnchorComponent* globeAnchor;//地球组件UPROPERTY(BlueprintReadOnly, EditAnywhere, meta = (AllowPrivateAccess = "true"))UCesiumOriginShiftComponent* originShift;//地球组件UWorld* world;FHitResult hitRes;ECollisionChannel colChannel;GeoTransforms* geoTrans;ACesiumGeoreference* Geo;

核心逻辑如下,Pitch为-90.,俯仰向下。射线从自身射到 自身前方50000000cm,返回的FHitResult里面可以拿到距离。自身的高度-距离就是地面高度。

if (globeAnchor != nullptr) {if ((!isnan(Latitude)) && (!isnan(Longitude))){globeAnchor->MoveToLongitudeLatitudeHeight(FVector(Longitude, Latitude, Atitude));//FVector actorLoc = globeAnchor->GetLongitudeLatitudeHeight();FVector actorLoc = GetActorLocation();globeAnchor->SetEastSouthUpif (globeAnchor != nullptr) {if ((!isnan(Latitude)) && (!isnan(Longitude))){globeAnchor->MoveToLongitudeLatitudeHeight(FVector(Longitude, Latitude, Atitude));//FVector actorLoc = globeAnchor->GetLongitudeLatitudeHeight();FVector actorLoc = GetActorLocation();globeAnchor->SetEastSouthUpRotation(FRotator(-90, 0 - 90, 0).Quaternion());bool isSuccess = world->LineTraceSingleByChannel(hitRes, actorLoc, actorLoc + GetActorForwardVector() * 50000000, colChannel);// 绘制射线DrawDebugLine(GetWorld(), actorLoc, hitRes.GetActor() ? hitRes.Location : actorLoc + GetActorForwardVector() * 50000000, FColor::Red, false, 1.0f);//GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Green, actorLoc.ToString());//GEngine->AddOnScreenDebugMessage(-1,10.0f,FColor::Red, GetActorForwardVector().ToString());/*if (Geo->IsValidLowLevel()){*///float z = Geo->TransformLongitudeLatitudeHeightPositionToUnreal(hitRes.Location).Z;float z = Atitude-(hitRes.Distance/100);//GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, FString::Printf(TEXT("%f"), z));return z;/*	}*/}Rotation(FRotator(-90, 0 - 90, 0).Quaternion());bool isSuccess = world->LineTraceSingleByChannel(hitRes, actorLoc, actorLoc + GetActorForwardVector() * 50000000, colChannel);// 绘制射线DrawDebugLine(GetWorld(), actorLoc, hitRes.GetActor() ? hitRes.Location : actorLoc + GetActorForwardVector() * 50000000, FColor::Red, false, 1.0f);//GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Green, actorLoc.ToString());//GEngine->AddOnScreenDebugMessage(-1,10.0f,FColor::Red, GetActorForwardVector().ToString());/*if (Geo->IsValidLowLevel()){*///float z = Geo->TransformLongitudeLatitudeHeightPositionToUnreal(hitRes.Location).Z;float z = Atitude-(hitRes.Distance/100);//GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, FString::Printf(TEXT("%f"), z));return z;/*	}*/}

方法二. 在某个目标,上空射线得到位置。UE位置坐标系 再通过CesiumGereforce组件转化 为经纬度坐标系代码如下:。UE5的TransformLongitudeLatitudeHeightPositionToUnreal的支持double,UE4蓝图只支持float的可能需要改一下Cesium源码,UE4从零开始制作数字孪生道路监测平台_ue4数字孪生-CSDN博客。

float AAltitudeChecker::GetAltitudeByLongitudeAndLatitude(const float& Longitude, const float& Latitude) {FVector actorLoc = GetActorLocation();//SetActorRotation(FRotator(-90, 0, 0));if (globeAnchor) {globeAnchor->MoveToLongitudeLatitudeHeight(FVector( Longitude, Latitude, 10000.f ));globeAnchor->SetEastSouthUpRotation(FRotator(-90, 0, 0).Quaternion());bool isSuccess = world->LineTraceSingleByChannel(hitRes, actorLoc, actorLoc + GetActorForwardVector() * 50000000, colChannel);if (isSuccess) {float floatRes = GetUEABsByLLA(hitRes.Location).Z;return floatRes;}}return -1;
}FVector AAltitudeChecker::GetUEABsByLLA(const FVector& lla) {if(Geo->IsValidLowLevel())	return Geo->TransformLongitudeLatitudeHeightPositionToUnreal(FVector(lla.X, lla.Y, lla.Z));return FVector();
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 监控系列(八)部署dameng_exporter并对接prometheus
  • CVE-2020-7248 OpenWRT libubox标记二进制数据序列化漏洞(更新中)
  • MySQL SQL 编程练习
  • 深度解读大语言模型中的Transformer架构
  • Jetpack Compose 通过 OkHttp 发送 HTTP 请求的示例
  • FTP传输的两种模式的技术原理和应用
  • vue3+element-plus 实现动态菜单和动态路由的渲染
  • 传神社区|数据集合集第7期|法律NLP数据集合集
  • 【芯智雲城】详解智能电机驱动在汽车中的应用
  • GUI界面开发之tkinter(二) 学习文本组件
  • k8s部署kafka集群
  • Navicat图形化管理工具安装教程
  • vue接入google map自定义marker教程
  • Microsoft 365 Office BusinessPro LTSC 2024 for Mac( 微软Office办公套件)
  • 学习Numpy的奇思妙想
  • 网络传输文件的问题
  • ES6指北【2】—— 箭头函数
  • [译]如何构建服务器端web组件,为何要构建?
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Apache的基本使用
  • CentOS7简单部署NFS
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • PHP 的 SAPI 是个什么东西
  • Python 基础起步 (十) 什么叫函数?
  • 给新手的新浪微博 SDK 集成教程【一】
  • 官方解决所有 npm 全局安装权限问题
  • 诡异!React stopPropagation失灵
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 入手阿里云新服务器的部署NODE
  • 使用权重正则化较少模型过拟合
  • 微服务入门【系列视频课程】
  • 用简单代码看卷积组块发展
  • 你对linux中grep命令知道多少?
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 大数据全解:定义、价值及挑战
  • 正则表达式-基础知识Review
  • ​configparser --- 配置文件解析器​
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​渐进式Web应用PWA的未来
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (4)Elastix图像配准:3D图像
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • .CSS-hover 的解释
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @Transaction注解失效的几种场景(附有示例代码)