Cesium 全球视角 和 多方案镜头切换

news2024/9/20 8:13:21

一.切换镜头

镜头切换,在一个Pawn里的多个镜头。可以使用UE中World Settings里的玩家控制器中,默认的控制器行为会对当前开启的Camera组件进行激活处理。 

谁激活谁就是主相机。

			Cast<UCameraComponent>(m_childComponentMap[it.CameraName])->SetAutoActivate(false);
			Cast<UCameraComponent>(m_childComponentMap[it.CameraName])->SetActive(false);

激活处理。

但是如果是两个Pawn之间切换,就要用Poccess 掌控。蓝图如下:

1.我用这两个都行,前提是这个是在世界里的物体。

	APlayerController* tmpPC = UGameplayStatics::GetPlayerController(GetWorld(), 0);
APlayerController* tmpPC = UGameplayStatics::GetPlayerController(Cast<UObject>(this), 0);
APlayerController* PC1 = GetWorld()->GetFirstLocalPlayerFromController()->GetPlayerController(GetWorld());

APlayerController* PC2 = GetWorld()->GetFirstPlayerController();

APlayerController* PC3 = GEngine->GetFirstLocalPlayerController(GetWorld());

APlayerController* PC4 = UGameplayStatics::GetPlayerController(GetWorld(), 0);

这里我是让每个Pawn自己抢夺,控制权。将Controller安在自己身上。实现不同Pawn之间的是视角切换。

		tmpPC->SetViewTargetWithBlend(Cast<AActor>(this));
		tmpPC->Possess(this);

二. 全球视角 有点像卫星,绕着地球转。

1.这个主要讲思路因为实现,算是比较好实现了。

将控制拿到。

	APlayerController* tmpPC = UGameplayStatics::GetPlayerController(Cast<UObject>(this), 0);
	if (tmpPC)
	{
		tmpPC->SetViewTargetWithBlend(Cast<AActor>(this));
		tmpPC->Possess(this);
		/*m_childComponentMap[cameraName]->SetActive(true);
		usingCamera = Cast<UCameraComponent>(m_childComponentMap[cameraName]);*/
	}

2.通过GlobeAnchor位移,鼠标导致经纬移动,有插值和映射,离地球越远越快。

void AWorldCameraPawn::MoveX(float value)
{
	if (globeAnchor != nullptr)
	{
		FVector curLLH = globeAnchor->GetLongitudeLatitudeHeight();
		double height = curLLH.Z;
		double change;
		change= UKismetMathLibrary::MapRangeClamped(height, 100, 100000, 0.001, 0.3);
		FVector toLLH = FVector(curLLH.X + value * change, curLLH.Y, curLLH.Z);
		FVector finalLLH = FVector(FMath::Lerp(curLLH.X, toLLH.X, 0.1), curLLH.Y, curLLH.Z);
		globeAnchor->MoveToLongitudeLatitudeHeight(finalLLH);
		globeAnchor->SetEastSouthUpRotation(FRotator(-90, 0 - 90, 0).Quaternion());
	}
}

3.滚轮 导致高度变化

void AWorldCameraPawn::MoveUp()
{
	if (globeAnchor != nullptr)
	{
		FVector curLLH = globeAnchor->GetLongitudeLatitudeHeight();
		double height = curLLH.Z;
		double changeAltitude;
		double toAltitude;
		if (height > 10000)
		{
			changeAltitude = UKismetMathLibrary::MapRangeClamped(height, 100, 100000, 10, 200000);
			toAltitude = curLLH.Z + changeAltitude;	
		}
		else
		{
			changeAltitude = UKismetMathLibrary::MapRangeClamped(height, 100, 10000, 10, 1000);
			toAltitude = curLLH.Z + changeAltitude;
		}

		if (toAltitude < 300)
		{
			toAltitude = 300;
		}
		FVector toLLH = FVector(curLLH.X, curLLH.Y, toAltitude);
		globeAnchor->MoveToLongitudeLatitudeHeight(toLLH);
		globeAnchor->SetEastSouthUpRotation(FRotator(-90, 0 - 90, 0).Quaternion());
	}
}

三.处理输入,最好在Controller里,为什么因为你的Pawn换了,你也能逻辑清晰,不必重写。

同一个输入,可以将不同的Pawn对应不同的功能,可能相同也可能不同。这里WorldPawn就是升高高度。而MyCameraPawn是伸缩弹簧臂。

void PlayerController::WheelUpFunction()
{
		
		if (GetPawn()) {
		AAirForce* MyCameraPawn = Cast<AAirForce>(GetPawn());
		
		if (MyCameraPawn) {
			MyCameraPawn->Zoom(0, 10);
		}
		AWorldCameraPawn* WorldCameraPawn = Cast<AWorldCameraPawn>(GetPawn());
		if (WorldCameraPawn)
		{
			WorldCameraPawn->MoveDown();

		}
	}
}

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

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

相关文章

VLDB 2024丨与 TiDB 一起探索数据库学术前沿

VLDB 2024 将于2024年8月26日至8月30日在中国广州举行。VLDB 是数据库领域的顶级国际会议&#xff0c;旨在为数据管理、可扩展数据科学、数据库研究者、供应商、从业者、应用开发者和用户提供交流平台。 2024年的VLDB会议涵盖了数据管理、数据库架构、图形数据管理、数据隐私与…

切换JDK版本

JDK&#xff08;Java Development Kit&#xff09;是Java开发工具包&#xff0c;它包含了Java的开发环境和运行环境。JDK是整个Java的核心&#xff0c;包括了Java运行环境&#xff08;Java Runtime Environment, JRE&#xff09;、Java工具和Java基础的类库&#xff08;rt.jar&…

九、枚举和注解

文章目录 一、枚举介绍二、自定义类实现枚举三、enum关键字实现枚举3.1 enum案例3.2 enum关键字实现枚举注意事项3.3 enum常用方法说明3.4 enum实现接口 四、JDK内置的基本注解类型4.1 注解的理解4.2 基本的Annotation介绍4.3 Override4.4 Deprecated4.5 SuppressWarnings 五、…

【性能优化】:设计模式与技术方案解析(二)

引言 在 【性能优化】&#xff1a;探索系统瓶颈的根源&#xff08;一&#xff09;文章中&#xff0c;我们已经分析了手动结算的弊端和瓶颈&#xff0c;本文来分析下怎么优化系统性能。 需求分析 既然手动结算耗时费力易出错&#xff0c;那么能不能开发一个**程序自动化处理*…

ARM32开发——(十八)RTC实时时表

1. RTC内置实时时钟 1.1 RTC时钟介绍 RTC是实时时钟(Real-Time Clock)的缩写。它是一种硬件模块或芯片,用于提供准确的日期和时间信息。 GD32F407上有RTC的外设,它提供了一个包含日期(年/月/日)和时间(时/分/秒/亚秒)的日历功能。除亚秒用二进制码显示外,时间和日期都以BCD码…

JSP中的动态INCLUDE与静态INCLUDE:简明对比

JSP中的动态INCLUDE与静态INCLUDE&#xff1a;简明对比 1、静态INCLUDE2、动态INCLUDE3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在JSP开发中&#xff0c;页面包含分为动态INCLUDE和静态INCLUDE两种&#xff0c;它们各有特点。…

详细分析Oracle中的ALL_TAB_COLUMNS视图语句

目录 1. 基本知识2. Demo 1. 基本知识 ALL_TAB_COLUMNS 是 Oracle 数据库的一个数据字典视图&#xff0c;用于提供关于数据库中所有可见表的列信息 对于数据库管理、开发和调试非常有用 基本的字段描述如下&#xff1a; 字段名描述OWNER列出表所在的所有者&#xff08;sche…

神经网络——CIFAR10小实战

1.引子 Sequential的使用&#xff1a;将网络结构放入其中即可&#xff0c;可以简化代码。 找了一个对CIFAR10进行分类的模型。 2.代码实战 from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linearclass Tudui(nn.Module):def __init__(self):super(T…

SOMEIP_ETS_069: Unaligned_SOMEIP_Messages_overUDP

测试目的&#xff1a; 验证设备&#xff08;DUT&#xff09;能够处理在单个UDP包中发送的三个SOME/IP消息&#xff0c;并且即使其中一个SOME/IP消息未对齐&#xff0c;DUT仍能对所有三个请求给出正确的响应。 描述 本测试用例旨在检查DUT在通过UDP协议接收到包含一个未对齐S…

【Pytorch】Linear 层,举例:相机参数和Instance Feaure通过Linear层生成Group Weights

背景 看论文看到这个pipeline&#xff0c;对于相机参数和Instance Fature 的融合有点兴趣&#xff0c;研究如下&#xff1a; Linear 层 Linear 层是最基本的神经网络层之一&#xff0c;也称为全连接层。它将输入与每个输出神经元完全连接。每个连接都有一个权重和一个偏置。…

inflight 守恒算法负反馈解析

终于说到这个话题了。 bbr 不好吗&#xff0c;我自己也做过很多关于 bbr 的仿真验证&#xff0c;现网数据分析以及数学建模&#xff0c;结论均指向 bbr 是一个公平高效且天然不会引发 bufferbloat 的算法&#xff0c;但细节值得商榷&#xff1a; 非理想哑铃拓扑下测量误差的叠…

Dubbo3框架概述

1 什么是分布式系统? 《分布式系统原理与范型》定义: “分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统” 分布式系统(distributed system)是建立在网络之上的软件系统。 简单来说:多个(不同职责)人共同来完成一件事! 任何一台服务器都无法…

Dockerfile+私有仓库

使用Dockerfile创建应用镜像 在Docker file中定义所需要执⾏的指令&#xff0c;使⽤ docker build创建镜 像&#xff0c;过程中会按照dockerfile所定义的内容进⾏打开临时性容器&#xff0c;把docker file中命令全部执⾏完成&#xff0c;就得到了⼀个容器应⽤镜像&#xff0c;每…

PHP-开发工具下载-配置-使用

.1.下载 使用各种人工智能工具推荐的php免费开发工具。 文心一言推荐的工具 讯飞星火的回答 kimi的回答 根据自己的了解&#xff0c;最终选择vscode这款开发工具。 .2.配置 文心一言的回答 讯飞星火的回答 kimi的回答 最终选择使用PHP Debug 插件来支持。 安装中文插件。 …

NASA数据集:MetOp-A ASCAT 第 2 级海洋表面风矢量,针对沿岸海洋进行了优化

MetOp-A ASCAT Level 2 Ocean Surface Wind Vectors Optimized for Coastal Ocean 简介 该数据集包含 MetOp-A 上的高级散射计&#xff08;ASCAT&#xff09;以 12.5 公里采样分辨率&#xff08;注&#xff1a;有效分辨率为 25 公里&#xff09;进行的近实时 2 级沿岸海面风矢…

实战OpenCV之图像的数学运算

基础入门 在OpenCV中&#xff0c;图像的数学运算是一种基本而强大的工具&#xff0c;可以用于多种图像处理任务&#xff0c;包括&#xff1a;图像增强、图像融合、特征提取等。这些运算包括加法、减法、乘法和除法等基本的数学操作。 加法运算&#xff1a;可以用来合并两个图像…

【JS】卢小姐排队问题(100) |思路参考+代码解析(C++)

题目 LYA 的班级要进行一次班级活动&#xff0c;全班同学按照学号从小到大排成一列。但是卢小姐来晚了&#xff0c;没有来得及排队。现在卢小姐想知道&#xff0c;她应该插入到队列的哪个位置&#xff0c;才能保证队列仍然是按照学号从小到大排列的。请你帮助卢小姐找到她应该…

微服务框架之Kitex

Kitex: 高性能的 Golang 微服务框架 Kitex 是由字节跳动&#xff08;ByteDance&#xff09;开发并开源的一款高性能微服务框架&#xff0c;专为构建分布式系统和微服务架构设计。Kitex 基于 Golang&#xff0c;旨在提供一个简单、高效、灵活的开发体验&#xff0c;帮助开发者快…

ST表(区间查询

解决的问题&#xff1a; 数组区间查询最大值和最小值对于解决数组的树状数组的区间修改 ------- 线段树倍增思想 核心代码&#xff1a; #include<bits/stdc.h> using namespace std; const int N1e5; int num[N]; int f[N][N]; int main(){int n;cin>>n;//输入默…

无线通信频率分配

首先看看无线电信号的频谱如何划分&#xff1a; 一、5G NR 3GPP已指定5G NR 支持的频段列表&#xff0c;5G NR频谱范围可达100GHz&#xff0c;指定了两大频率范围&#xff1a; ① Frequency range 1 &#xff08;FR1&#xff09;&#xff1a;就是我们通常讲的6GHz以下频段 频率…