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

UE C++ 多镜头设置缩放 平移

一.整体思路

首先需要在 想要控制的躯体Pawn上,生成不同相机对应的SpringArm组件。其次是在Controller上,拿到这个Pawn,并在其中设置输入响应,并定义响应事件。响应事件里有指向Pawn的指针,并把Pawn的缩放平移功能进行调用。

二.

1.CameraPawn的组件构成

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = MySceneComponent)USceneComponent* MyRoot;UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = MySceneComponent)USpringArmComponent* MySpringArm;UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = MySceneComponent)UCameraComponent* MyCamera;void Zoom(bool Direction, float ZoomSpeed);void Panx(float x);void Pany(float y);void Back();
ACameraPawn::ACameraPawn()
{// Set this pawn to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;MyRoot = CreateDefaultSubobject<USceneComponent>(TEXT("MyRootComponent"));MySpringArm = CreateDefaultSubobject <USpringArmComponent>(TEXT("MySpringArmComponent"));MyCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("MySCameraComponent"));RootComponent = MyRoot;MySpringArm->SetupAttachment(MyRoot);MyCamera->SetupAttachment(MySpringArm);MySpringArm->bDoCollisionTest = false;
}

2.将Pawn自己镜头伸缩,平移功能,复原写好

void ACameraPawn::Zoom(bool Direction, float ZoomSpeed) {if (Direction) {if (MySpringArm->TargetArmLength >= 300 && MySpringArm->TargetArmLength < 5000) {MySpringArm->TargetArmLength += (ZoomSpeed * 2);GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("SpringArmLength is %f"), MySpringArm->TargetArmLength));}}else {if (MySpringArm->TargetArmLength > 300 && MySpringArm->TargetArmLength <= 5000) {MySpringArm->TargetArmLength -= (ZoomSpeed * 2);GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("SpringArmLength is %f"), MySpringArm->TargetArmLength));}}
}void ACameraPawn::Panx(float x)
{MyCamera->AddLocalOffset(FVector(0,x,0));
}void ACameraPawn::Pany(float y)
{MyCamera->AddLocalOffset(FVector(0,0,y));
}void ACameraPawn::Back()
{MyCamera->SetRelativeLocation(FVector(0,0,0));
}

 3.在MyPlayerController里面绑定输入映射,以及响应的事件。

	virtual void SetupInputComponent();void WheelUpFunction();void WheelDownFunction();void PanX(float x);void PanY(float y);void Back();

4.绑定映射

void AMyPlayerController::SetupInputComponent()
{Super::SetupInputComponent();InputComponent->BindAction("WheelUp", IE_Pressed, this, &AMyPlayerController::WheelUpFunction);InputComponent->BindAction("WheelDown", IE_Pressed, this, &AMyPlayerController::WheelDownFunction);InputComponent->BindAction("BackXY",IE_Pressed,this,&AMyPlayerController::Back);InputComponent->BindAxis("PanX",this,&AMyPlayerController::PanX);InputComponent->BindAxis("PanY",this,&AMyPlayerController::PanY);//InputComponent->BindAction("ESCEvent", IE_Pressed, this, &AMyPlayerController::ESCEvent).bExecuteWhenPaused=true;//游戏暂停可以执行//InpuptComponent->BindAxis("PanY",this,);
}

5.响应事件,并操控控制到对应的Pawn里的函数。

void AMyPlayerController::WheelUpFunction()
{if (GetPawn()) {ACameraPawn* MyCameraPawn = Cast<ACameraPawn>(GetPawn());if (MyCameraPawn) {MyCameraPawn->Zoom(1, 10);}}
}void AMyPlayerController::WheelDownFunction()
{if (GetPawn()) {ACameraPawn* MyCameraPawn = Cast<ACameraPawn>(GetPawn());if (MyCameraPawn) {MyCameraPawn->Zoom(0, 10);}}
}void AMyPlayerController::PanX(float x)
{if (GetPawn()){ACameraPawn* MyCameraPawn = Cast<ACameraPawn>(GetPawn());if (MyCameraPawn) {MyCameraPawn->Panx(x);}}
}void AMyPlayerController::PanY(float y)
{if (GetPawn()){ACameraPawn* MyCameraPawn = Cast<ACameraPawn>(GetPawn());if (MyCameraPawn) {MyCameraPawn->Pany(y);}}
}void AMyPlayerController::Back()
{if (GetPawn()){ACameraPawn* MyCameraPawn = Cast<ACameraPawn>(GetPawn());if (MyCameraPawn) {MyCameraPawn->Back();}}
}

6.需要在ProjectSetting里面,设置使用的按键。

三.可能需要注意的

1.Pawn这里,需要Poccess。不然会控制不到。

2.SpringArm设置视角的位置。Camera最好都是相对位置为0,这样视角返回默认值可以用。

MyCamera->SetRelativeLocation(FVector(0,0,0));

相关文章:

UE C++ 多镜头设置缩放 平移

一.整体思路 首先需要在 想要控制的躯体Pawn上&#xff0c;生成不同相机对应的SpringArm组件。其次是在Controller上&#xff0c;拿到这个Pawn&#xff0c;并在其中设置输入响应&#xff0c;并定义响应事件。响应事件里有指向Pawn的指针&#xff0c;并把Pawn的缩放平移功能进行…...

代码随想录Day69(图论Part05)

并查集 // 1.初始化 int fa[MAXN]; void init(int n) {for (int i1;i<n;i)fa[i]i; }// 2.查询 找到的祖先直接返回&#xff0c;未进行路径压缩 int.find(int i){if(fa[i] i)return i;// 递归出口&#xff0c;当到达了祖先位置&#xff0c;就返回祖先elsereturn find(fa[i])…...

53-1 内网代理3 - Netsh端口转发(推荐)

靶场还是用上一篇文章搭建的靶场 :52-5 内网代理2 - LCX端口转发(不推荐使用LCX)-CSDN博客 一、Netsh 实现端口转发 Netsh是Windows自带的命令行脚本工具,可用于配置端口转发。在一个典型的场景中,如果我们位于公网无法直接访问内网的Web服务器,可以利用中间的跳板机通过…...

慧哥充电桩开源平台小程序、PC后、手机商户端历经2年的无数次迭代。

...

四、(1)网络爬虫入门及准备工作(爬虫及数据可视化)

四、&#xff08;1&#xff09;网络爬虫入门及准备工作&#xff08;爬虫及数据可视化&#xff09; 1&#xff0c;网络爬虫入门1.1 百度指数1.2 天眼查1.3 爬虫原理1.4 搜索引擎原理 2&#xff0c;准备工作2.1 分析爬取页面2.2 爬虫拿到的不仅是网页还是网页的源代码2.3 爬虫就是…...

2024华为OD机试真题-分月饼-(C++/Python)-C卷D卷-200分

2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述 中秋节,公司分月饼,m 个员工,买了 n 个月饼,m ≤ n,每个员工至少分 1 个月饼,但可以分多个,单人分到最多月饼的个数是 Max1 ,单人分到第二多月饼个数是 Max2 ,Max1 - Max2 ≤ 3 ,单人分到第 n - 1…...

Git 查看提交历史

Git 查看提交历史 Git 是一个强大的版本控制系统&#xff0c;它允许开发人员跟踪代码的变化&#xff0c;并与其他人协作。了解如何查看提交历史对于理解项目的发展和维护代码库至关重要。本文将详细介绍如何使用 Git 查看提交历史&#xff0c;包括不同的命令和选项&#xff0c…...

力扣双指针算法题目:快乐数

目录 1.题目 2.思路解析 3.代码展示 1.题目 . - 力扣&#xff08;LeetCode&#xff09; 2.思路解析 题目意思是将一个正整数上面的每一位拿出来&#xff0c;然后分别求平方&#xff0c;最后将这些数字的平方求和得到一个数字&#xff0c;如此循环&#xff0c;如果在此循环中…...

【Tools】了解人工通用智能 (AGI):未来的智能体

什么是人工通用智能 (AGI)&#xff1f; 人工通用智能&#xff08;Artificial General Intelligence&#xff0c;AGI&#xff09;是指一种能够理解、学习和应用知识&#xff0c;具有像人类一样广泛和通用的认知能力的智能系统。与专门处理特定任务的人工智能&#xff08;AI&…...

华媒舍:8种网站构建推广方法全揭密!

网站构建成为了推广宣传和宣传品牌的关键一环。对于新手&#xff0c;搭建和营销推广网站有可能是一项全新的挑战。下面我们就为大家介绍8种网站搭建和营销推广技巧&#xff0c;帮助你在这些方面取得成功。 1.选择适合自己的网站构建平台选择合适的网站构建平台针对构建一个成功…...

【Scrapy】 深入了解 Scrapy 下载中间件的 process_exception 方法

准我快乐地重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 再去做没流着情泪的伊人 假装再有从前演过的戏份 重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 你纵是未明白仍夜深一人 穿起你那无言毛衣当跟你接近 &#x1f3b5; 陈慧娴《傻女》 Scrapy 是…...

DevEco Studio无法识别本地模拟器设备的解决方法

目录 场景 解决办法 方式1 方式2 场景 有很多小伙伴遇到过安装了手机模拟器, 但是开发工具设备栏不识别手机设备的问题, 如下图,明明模拟器都安装了,并启动, 但为什么设备栏不显示呢? 解决后的截图,应该是这样(其实跟 android 类似 )...

EN-SLAM:Implicit Event-RGBD Neural SLAM解读

论文路径&#xff1a;https://arxiv.org/pdf/2311.11013.pdf 目录 1 论文背景 2 论文概述 2.1 神经辐射场&#xff08;NeRF&#xff09; 2.2 事件相机&#xff08;Event Camera&#xff09; 2.3 事件时间聚合优化策略&#xff08;ETA&#xff09; 2.4 可微分的CRF渲染技术…...

2407C++,从构生成协议文件

原文 protobuf会根据proto文件生成c对象及其序化/反序化方法,而iguana的struct_pb则是以结构为核心,编译期反射来生成序化/反序化代码. 有人提出能不能按proto文件输出结构呢,这样就可给其它语言用了,很好建议,实现起来也比较简单. protobuf是从proto文件到c对象,而struct_p…...

遗传算法求解TSP

一、基本步骤 遗传算法求解旅行商问题&#xff08;TSP&#xff09;的一般步骤如下&#xff1a; 编码&#xff1a; 通常采用整数编码&#xff0c;将城市的访问顺序表示为一个染色体。例如&#xff0c;假设有 5 个城市&#xff0c;编码为[1, 3, 5, 2, 4]&#xff0c;表示旅行商的…...

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【明文导入密钥(C/C++)】

明文导入密钥(C/C) 以明文导入ECC密钥为例。具体的场景介绍及支持的算法规格 在CMake脚本中链接相关动态库 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)开发步骤 指定密钥别名keyAlias。 密钥别名的最大长度为64字节。 封装密钥属性集和密钥材料。通过[OH_Huks_I…...

视频汇聚/安防监控/GB28181国标EasyCVR视频综合管理平台出现串流的原因排查及解决

安防视频监控系统/视频汇聚EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理&#xff0c;视频汇聚EasyCVR平台支持设备…...

TypeError: Cannot read properties of null (reading ‘nextSibling‘)

做项目用的Vue3Vite, 在画静态页面时&#xff0c;点击菜单跳转之后总是出现如下报错&#xff0c;百思不得其解。看了网上很多回答&#xff0c;也没有解决问题&#xff0c;然后试了很多方法&#xff0c;最后竟然发现是template里边没有结构的原因。。。 原来我的index.vue是这样…...

解决 npm intasll 安装报错 Error: EPERM: operation not permitted

Node.js安装及环境配置完成之后 npm install express -g 安装全局的模块报错提示没有权限operation not permitted mkdir 错误编号4048&#xff1a; 其原因是当前用户操作该目录权限不足&#xff0c;当以管理员身份运行cmd&#xff0c;再执行npm install express -g 是不会报权…...

redis实用技能

为什么要使用redis及其使用场景 大部分场景是应对高并发高性能场景才会使用,就是访问量已经超过mysql所能承受的,需要做缓存,帮助mysql分流。或者一些复杂查询,mysql执行很慢没法优化,可以做缓存提速(做缓存)做认证服务的时候需要存储用户的session信息,使用redis数据有…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...