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();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/47496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OMOST 作画能力的硬核解析[C#]

1. 简介 1.1 什么是 OMOST? OMOST 是一款利用深度学习和生成对抗网络(GAN)技术的 AI 作画工具,能够自动生成高质量的绘画作品。它广泛应用于艺术创作、广告设计和教育培训等领域。 1.2 OMOST 的核心功能 自动生成绘画风格转换…

【Python】探索 Python 中的 callable 方法

为何每次早餐 仍然魂离魄散 原来 那朝分手都要啜泣中上班 明明能够过得这关 赢回旁人盛赞 原来 顽强自爱这样难 难得的激情总枉费 残忍的好人都美丽 别怕 你将无人会代替 🎵 陈慧娴《情意结》 在 Python 编程中,理解对象的可调用性…

04-用户画像+sqoop使用

优点 sqoop的作用是实现数据的导入和导出,主要是对数据库和数据仓库之间的操作 只要是支持jdbc连接的数据库都可以使用sqoop操作 添加Sqoop到环境变量中 export SQOOP_HOME/export/server/sqoop export PATH$PATH:$SQOOP_HOME/bin:$SQOOP_HOME/sbinsource /etc/…

内联汇编清楚变量指定位

static inline void clear_bit(int nr, volatile unsigned long *addr) {__asm__ __volatile__("lock ; ""btrl %1,%0": "m" (*addr): "Ir" (nr)); } 这段代码是一个内联函数,用于在特定地址的位图中清除一个位。它使用了…

Bootstrap 表单

Bootstrap 表单 Bootstrap 是一个流行的前端框架,用于快速开发响应式和移动设备优先的网页。它包含了一套丰富的组件,其中包括表单元素,这些元素可以帮助开发者创建风格统一、易于使用的表单界面。本文将详细介绍 Bootstrap 表单的基础知识&…

进程线程协程

协程(coroutine)是一种更轻量级的并发编程方式,它可以在一个线程内实现多任务的切换和执行。与进程和线程相比,协程有其独特的特点和优势。 理解协程 协程是一种可以暂停和恢复执行的函数。与传统函数不同,协程可以在…

嵌入式单片机软件与硬件的结合方法分析

不知道大家有没有疑惑,为什么软件能控制硬件?关于这个问题,给出直观解释的文章:本文分析STM32单片机到底是如何软硬件结合的,分析单片机程序如何编译,运行。 软硬件结合 初学者,通常有一个困惑,就是为什么软件能控制硬件?就像当年的51,为什么只要写P1=0X55,就可以…

Leetcode3212. 统计 X 和 Y 频数相等的子矩阵数量

Every day a Leetcode 题目来源:3212. 统计 X 和 Y 频数相等的子矩阵数量 解法1:二维前缀和 维护二维前缀和,分别统计 ‘X’ 和 ‘Y’ 的个数。 统计足以下条件的子矩阵数量: 包含 grid[0][0]‘X’ 和 ‘Y’ 的频数相等。至少…

贪吃蛇超精讲(C语言)

前言 如果你还是个萌新小白,那么该项目的攻克过程一定会十分艰难。虽然作者已经将文章尽可能写的逻辑清晰,内容详细。但所谓“纸上得来终觉浅”,在讲到陌生结构和函数时,大家请一定自己动手去敲一遍代码,这很重要&…

00 JavaWeb

学习资料:B站视频-黑马程序员JavaWeb基础教程 文章目录 JavaWeb1、JavaWeb简介2、 JavaWeb主要内容3、JavaWeb技术栈4、JavaWeb课程安排5、Web核心课程安排 JavaWeb 1、JavaWeb简介 Web:全球广域网,也称为万维网(www),能够通过浏…

Mysql-索引结构

一.什么是索引? 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引 二.无索引的情况 找到…

Java BitSet学习

一. 位运算 在学习 BitSet 之前,我们先看一下位运算; 下述我们拿 long 来接收位运算的返回值,我们知道 long 为 64 位,8 个字节; // 1. 右移一位,表示 num / 2;右移 6 位,表示 nu…

C++ | Leetcode C++题解之第273题整数转换英文表示

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<string> singles {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Ni…

DC-1靶场打靶第一次!!!!冲冲冲!

今天打了一下DC-1这个靶场&#xff0c;感觉收获比大&#xff0c;我就来记录一下。 我的思路是下面的这个 我们先把靶机导入&#xff0c;然后与我们的liunx(攻击机)在同一个网段中&#xff0c;这也大大的减低难度。 然后我们先对自己这个网段内存活的主机进行操作&#xff0c;我…

【Spring Boot】网页五子棋项目中遇到的困难及解决方法

目录 一、HikariPool-1 - Starting异常二、Invalid bound statement (not found)异常三、The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary异常四、The server time zone value时区报错异常五、补充知识点…

免费【2024】springboot 白优校园社团网站的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

Django transaction.atomic()事务处理

在Django中&#xff0c;transaction.atomic()是一个上下文管理器&#xff0c;它会自动开始一个事务&#xff0c;并在代码块执行完毕后提交事务。如果在代码块中抛出异常&#xff0c;事务将被自动回滚&#xff0c;确保数据库的一致性和完整性。 在实际应用中&#xff0c;你可能需…

PHP 表单验证:邮件和URL

PHP 表单验证&#xff1a;邮件和URL 在Web开发中&#xff0c;表单验证是一个至关重要的环节&#xff0c;它确保了用户输入的数据的有效性和安全性。特别是在处理邮件地址和URL时&#xff0c;准确的验证尤为重要。本文将详细介绍如何使用PHP来验证表单中的邮件地址和URL。 邮件…

[HTML]一文掌握

背景知识 主流浏览器 浏览器是展示和运行网页的平台&#xff0c; 常见的五大浏览器有 IE浏览器、火狐浏览器&#xff08;Firefox&#xff09;、谷歌浏览器&#xff08;Chrome&#xff09;、Safari浏览器、欧朋浏览器&#xff08;Opera&#xff09; 渲染引擎 浏览器解析代码渲…

R语言读取txt和csv只有1列时

多半是间隔符的问题 ?read.table read.table(file, header FALSE, sep "", quote "\"",dec ".", numerals c("allow.loss", "warn.loss", "no.loss"),row.names, col.names, as.is !stringsAsFacto…