【UE4学习】5.相机和蓝图进阶

2023-05-16

文章目录

  • 相机基础
  • Project Setting控制输入
  • 按键事件控制相机
  • 设置追踪目标
  • CameraManager实现相机切换
  • API接口与多态
  • 蓝图之间的通信方式
  • GameMode+Manager显示当前相机信息
  • 事件调度器
  • Sequencer入门
  • 遗留问题

相机基础

UE4中的相机主要包括普通相机Camera、电影相机Cine Camera、摇臂相机Camera Rig Crane和滑轨相机Camera Rig Rail。电影相机比普通相机能够调节的参数更多,摇臂相机和滑轨相机需要搭载普通相机或电影相机才可以工作。
在这里插入图片描述
Lookat Tracking Setting可以让相机追踪某一目标,Filmback调整画幅,Focus Length调整焦距,Aperture调整光圈。

从ue4的相机类中直接继承蓝图的方式:

  1. 将相机拖到主视口中,或在在右边的世界大纲World Outliner中点击该相机,在Details栏中点击Blueprint / Add Script,并设置位置并命名即可。
    在这里插入图片描述
  2. 点击右键,选择创建“Blueprint Class”,搜索自己需要的类型,并创建新蓝图。注意之后要将该蓝图拖到主视口中才能发挥作用。
    在这里插入图片描述

为了在同一个蓝图中控制摇臂和摇臂上挂载的相机,我们需要在摇臂相机蓝图内部CraneCameraMount中添加子组件CineCamera,并将CineCamera的相对位置设置为0,这样即可将CineCamera挂载在摇臂上。
在这里插入图片描述
在这里插入图片描述
滑轨相机如果使用同样的方式挂载,则无法让相机追踪某一物体,因此我们采用child actor的方式,在“蓝图之间的通信方式”中详细说明。

Project Setting控制输入

在主界面的Settings中打开Project Settings,找到Engine–Input–Binding。
在这里插入图片描述
在这里插入图片描述
Action Mappings和Axis Mappings都能够创建用户输入事件,但Axis Mapping还能为同一事件设置多个不同的按键和返回值。如图,当按下W键时,MoveForward返回1;当按下S键时,MoveForward返回-1,这里的输入事件和输出返回值是持续的。之后在所有蓝图中,都能将创建的Action Mappings和Axis Mappings当作某一带返回值的函数(或事件)使用。

按键事件控制相机

  1. 自由相机设置MoveForward、MoveRight、MoveUp、TurnRight和TurnUp等功能。前三个调用AddActorLocalOffset节点或AddActorWorldOffset节点,后两个调用AddLocalRotation节点或AddWorldRotation节点。因为按键输入事件是持续发挥作用的,所以只需让返回值与速度常量相乘,即可作为偏移量使用。
    在这里插入图片描述
  2. 固定位置的摇臂相机用MoveForward调节摇臂长度,TurnRight和TurnUp调节平角Pitch和仰角Yaw。方法是让原变量加上按键事件返回值和速度常量的乘积,再赋值给该变量。注意根据实际意义使用Clamp节点,将长度、平角和仰角限制在一定范围内,如将平角限制在-90°到90°之间,将仰角限制在0°到90°之间。
    在这里插入图片描述
  3. 滑轨相机仅调用MoveForward一个按键事件,控制相机在滑轨上的位置,方法如摇臂相机的控制,只是变量改为Current Position On Rail。
    在这里插入图片描述

设置追踪目标

设置滑轨相机追踪目标。创建一个Actor类型的变量LookAtTargetActor来存储跟踪目标,设置该变量为是实例可编辑。创建一个函数InitLookAtTarget来设置跟踪目标。函数的逻辑是,取出ChildActor中的组件,将其转为CineCameraActor类型,设置其追踪目标为LookAtTargetActor,并勾选Enable Look At Tracking。
在这里插入图片描述
之后在构造函数中调用InitLookAtTarget函数即可。

CameraManager实现相机切换

创建一个空Actor的Blueprint Class,作为CameraManager实现相机控制权的切换。在CameraManager中创建一个Actor类的数组Cameras以调用其它3个蓝图,以及一个String类的数组CameraTypes用来记录相机类型及其顺序。

InitAllCameraTypes函数遍历Cameras数组,将每个Actor的第0个tag取出,加入CameraTypes数组(事先为每个Actor添加描述其类型的tag)。在构造函数Construction Script中调用InitAllCameraTypes。
在这里插入图片描述
在Event Graph中开启键盘输入,并为调用不同的相机设置不同的按键及CameraID,对应的键盘操作可触发SwitchCamera函数,并传入一个CameraID。
在这里插入图片描述
调用SwitchCamera函数时,先将IsCameraValid设置为true,CurCameraID设置为传入的CameraID值;再取出Cameras中对应index的Actor,启用它的窗口视图(在API中详细说明);接着判断之前是否在使用相机,如果是,禁用掉之前相机的键盘输入;最后授权目前相机的键盘输入。

API接口与多态

我们注意到,启用窗口视图时,FreeCineCamera和CraneCamera的target都是它本身,而RailCamera的target是其ChildActor中的组件,所以无法在CameraManager中用同一函数实现任意Actor的启用窗口视图,因此,我们采用API接口的方式实现多态。

创建Blueprint Interface类型的蓝图CameraFunc,在蓝图中创建函数SetViewTarget。
在这里插入图片描述
在各个相机蓝图的上方点击Class Settings栏,右侧Details中找到Interfaces–Implemented Interfaces,并添加CameraFunc。
在这里插入图片描述
此时可以看到左侧Interfaces栏中多了一个函数SetViewTarget,右键点击SetViewTarget,并选择Implement Function,可以看到蓝图中多了一个SetViewTarget的节点,我们可以用它编写启用本Actor的相机窗口视图的函数。
在这里插入图片描述
利用SetViewTargetWIthBlend节点编写,注意RailCamera应该取两次ChildActor再传入。
在这里插入图片描述
最后在SwitchCamera函数中,只要调用SetViewTarget接口,就会自动跳转至对应的函数了。

蓝图之间的通信方式

  1. Child Actor。以之前提到的滑轨相机挂载问题为例,我们在PreviewMesh_Mount下添加ChildActor组件,并在右侧Details栏中将其类型选为CineCameraActor即可。在主界面世界大纲中可以看到,滑轨相机下挂载了一个电影相机。
    在这里插入图片描述
    在这里插入图片描述
  2. 利用蓝图类中的Tag。在蓝图编辑器的Component栏中选择它本身,在右边Details栏的Actor栏中可以找到Tags选项,它为所有该类的Actor添加一个或一系列Tag。之后可通过GetAllActorByTag节点找到所有含某个Tag的Actor(类似GetAllActorOfClass)。
    在这里插入图片描述
  3. 变量赋值。在CameraManager中创建一个Actor类的数组Cameras,打开实例可编辑,在世界大纲中即可为数组添加变量,在CameraManager中也可以调用数组元素。

GameMode+Manager显示当前相机信息

首先,创建一个Widget、一个HUD和一个GameMode,在HUD中将widget加入viewport,在World Settings中设置我们自己创建的GameMode和HUD(常规操作)。

在Widget中拖入一个Text,让它的context和新建函数GetCameraType绑定。
在这里插入图片描述
在MainGameMode中创建InitGameMode函数,其内容为用传入值设置蓝图内创建的Actor类变量CameraManager,即将CameraManager变量赋值为蓝图BP_CameraManger。
在这里插入图片描述
在关卡蓝图中设置一旦开始播放,就调用MainGameMode中的InitGameMode函数,并将BP_CameraManager传入。
在这里插入图片描述
在CameraManager中创建GetCurCameraType函数,如果目前在使用相机,则返回对应的相机类型,否则返回“当前相机不可用”。
在这里插入图片描述
在widget中创建BP_MainGameMode类型的变量GameMode,并在构造函数中设置该变量为BP_MainGameMode。
在widget中text绑定的GetCameraType函数中,调用CameraManager中的GetCurCameraType函数,将其返回值转化为Text即可。
在这里插入图片描述
这里使用的是变量赋值的方式实现蓝图间的通信,要想在A蓝图中调用B蓝图,只需在A蓝图中创建一个类型为B蓝图的变量,并将该变量赋值为B蓝图,即可在A蓝图中调用该变量。本Demo的层级关系是,关卡蓝图控制GameMode,GameMode控制Manager,Manager控制各个相机蓝图并向UI传入数值信息,HUD创建UI控件并将其加进Viewport,CameraFunc仅作为API使用。

事件调度器

之后学完再补上这部分。

Sequencer入门

之后学完再补上这部分。

遗留问题

  1. RailCamera需要取两次ChildActor以获得真实的相机target,如果说第一次取得的是BP_RailCamera的ChildActor,第二次取得的是ChildActor中的子组件;那么BP_CraneCamera中真正的相机也是蓝图的组件,也为什么CraneCamera不需要取一次ChildActor呢?
  2. 蓝图之间的层级关系和执行顺序。是否所有蓝图都会同时被执行(并行)?一个Level中可否设置多个GameMode并在播放过程中切换?
  3. 利用变量赋值实现蓝图间的通信时,为什么将变量类型设置为需要调用的蓝图后,还要再将变量赋值为对应蓝图?甚至,既然可以通过将蓝图从世界大纲中拖入的方式,用其为变量赋值,那么为什么不直接将它拖入以get该蓝图,然后调用该蓝图的函数?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【UE4学习】5.相机和蓝图进阶 的相关文章

  • mac安装虚拟机VMware fusion12 和ubantu系统

    一 基本安装 下载虚拟机VMware fusion12 我选择了不更新新版本并且允许访问辅助功能 选择 新建 接下来选择 从光盘或者映像安装 从下载目录把ubantu系统拖拽过去 点击安装完成 xff0c 将ubantu系统保存在虚拟机上即
  • VSCode常用命令---记录自己的常用命令

    一 nvm相关命令 node版本管理 查看已安装的版本 nvm list 使用版本 nvm use 版本号 安装版本 nvm install 版本号 卸载版本 nvm uninstall 版本号 常用命令 全局包安装 多用于gitee下载后
  • Ubuntu18.04 Realsense D435i驱动安装与配置

    InterRealSenseD435i SDK安装 一 命令行的安装方式安装 1 注册服务器的公钥 xff1a 打开终端输入 sudo apt key adv keyserver keys gnupg net recv key C8B3A5
  • Qt上位机:与STM32串口通信,数据收发,按钮控制LED

    Qt学习了几周 xff0c 做一个串口助手巩固一下最近学习的内容 遇到的问题1 xff1a write函数只能发送一次数据 xff0c 想要继续发送必须重新关闭打开串口 xff0c 每次只能发送一次数据 解决办法 xff1a 在网上找不到类
  • 考研数据结构2 | 使用 C++ 实现顺序栈 | 栈的基本应用之计算后缀表达式

    文章目录 1 顺序栈 简介2 顺序栈 代码实现3 栈的应用之计算后缀表达式3 1 表达式介绍3 2 计算后缀表达式的实现3 3 完整代码3 4 LeetCode 提交代码 1 顺序栈 简介 在上一次的学习中 xff0c 使用指针实现了链栈
  • C++使用libcurl做HttpClient

    C 43 43 使用libcurl做HttpClient 分类 xff1a 基础技术分享 2012 06 14 19 25 1469人阅读 评论 3 收藏 举报 当使用C 43 43 做HTTP客户端时 xff0c 目前通用的做法就是使用l
  • CAN的报文格式

    CAN的报文格式 在总线中传送的报文 xff0c 每帧由7部分组成 CAN协议支持两种报文格式 xff0c 其唯一的不同是标识符 xff08 ID xff09 长度不同 xff0c 标准格式为11位 xff0c 扩展格式为29位 在标准格式
  • uabntu系统安装软件:E: 无法定位软件包问题

    血泪教训 耽误了贼长时间 一开始参考了如下链接 xff0c 然而我的问题一个没解决 xff0c 哭了 Ubuntu sudo apt get install 出现 E 无法定位软件包问题 解决方法汇总 遥想在想peach的博客 CSDN博客
  • 右手定则

    http www 7wenta com zhuanti 9648 html 问他 首页问答中心竞技场 学习快报 达人榜商城 问他手机版 注册 登录 问他网 gt 学习专题 gt 高中物理 gt 右手定则 物理题库练习题我要提问
  • 【机器人规划】Bug解析

    文章目录 参考文献简介Bug1算法Bug2算法Tangent Bug算法关于O i的选择激光雷达半径对算法的影响 总结 参考文献 自动驾驶决策规划算法 Bug Algorithms Bug算法 Robotic Motion Planning
  • ubantu虚拟机无法联网

    在VMware中安装Ubuntu虚拟机 xff0c 总会发生无法上网的情况 xff0c 主要情况有以下几点 xff1a 宿主机可以上网 xff1b 虚拟机却无法访问网页虚拟机ping不通任何网站 xff0c 用浏览器显示error 一般情况
  • 半监督语义分割论文学习记录

    Semi Supervised Semantic Segmentation with Cross Consistency Training 1 1 motivation 一致性训练的目的是在应用于输入的小扰动上增强模型预测的不变性 因此 x
  • 使用Qt二次开发周立功CAN(一)

    使用Qt二次开发周立功CAN xff08 一 xff09 使用Qt二次开发周立功的CAN通信 xff0c 第一步需要完成动态链接库的加载 xff0c 成功加载之后才能调用其提供的接口函数 加载库需要注意的问题有两个 xff1a 一是Qt版本
  • 字节序基础知识

    在各种计算机体系结构中 xff0c 对于字节 字等的存储机制有所不同 xff0c 因而引发了计算机通信领 域中一个很重要的问题 xff0c 即通信双方交流的信息单元 xff08 比特 字节 字 双字等等 xff09 应该以什么样的顺序进行传
  • vlc命令行: 转码 流化 推流

    写在命令行之前的话 xff1a VLC不仅仅可以通过界面进行播放 xff0c 转码 xff0c 流化 xff0c 也可以通过命令行进行播放 xff0c 转码和流化 还可以利用里面的SDK进行二次开发 vlc命令行使用方法 xff1a 1 x
  • C++ 简单实现HTTP GET/POST 请求

    HTTP 超文本传输协议 是一种客户端与服务端的传输协议 xff0c 最早用于浏览器和服务器之间的通信 xff0c 后来因为其使用灵活 方便等特点 xff0c 广泛用于客户端与服务端的通信 文章将简单介绍HTTP协议 xff0c 同时以C
  • STM32单片机HAL库下串口接收不定长数据

    xff33 xff34 xff2d xff13 xff12 单片机 xff28 xff21 xff2c 库下串口接收不定长数据 xff28 xff21 xff2c 库下的串口接收不定长数据代码配置代码实现代码演示总结 xff28 xff21
  • C++将一个数据格式化为固定长度的字符串

    经常会遇到将数据解析为文本文件的现象 xff0c 通常因为数据长度的不同导致 xff0c 可视化效果不好 写一个输入数据获取固定长度字符串的函数 xff0c 来得到一个固定长度的数据 xff0c 让格式化看起来好看一些 include lt
  • Socket原理与编程基础

    一 Socket简介 Socket是进程通讯的一种方式 xff0c 即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换 几个定义 xff1a xff08 1 xff09 IP地址 xff1a 即依照TCP IP协议分
  • mac 安装brew

    起因是这样的 xff0c 我想在mac上安装htop 然后我了解到可以用brew安装htop 然后再执行命令 brew install htop 所以我就开始吭哧吭哧安装brew 过程xue wei 曲折了一些 先是看到一个文章 xff0c

随机推荐

  • 【项目学习】C++实现高并发服务器——代码学习(三)用户注册登录功能

    项目来源 xff1a WebServer 上一篇 xff1a 存储解析HTTP请求报文 xff0c 创建响应报文 本文介绍以下功能的代码实现 利用RAII机制实现了数据库连接池 xff0c 减少数据库连接建立与关闭的开销 xff0c 同时实
  • 用CSS3实现动画进度条

    CSS3的新特性为我们实现漂亮的进度条扫清了障碍 xff0c 我们可以完全不需要任何图片和简单的Javascript代码就可以构建 一 第一个例子 效果图 xff1a Demo地址 xff1a http namepk sinaapp com
  • tcpdump命令使用详解

    tcpdump命令使用详解 疯狂的小企鹅的博客 CSDN博客 tcpdump命令详解全网最详细的 tcpdump 使用指南 王一白 博客园Tcpdump抓包工具实战教程 xff0c 让你知道一个抓包走天下 xff01 哔哩哔哩 bilibi
  • Chrome浏览器Postman插件安装包及安装教程

    最近电脑装了新环境 xff0c 以前本地的postman安装包竟然找不到了 xff0c 网上费尽心力找了很多资源 xff0c 终于找到纯净的安装包 xff0c 绕开套路 xff0c 现将Postman安装包及安装教程分享给各位 xff0c
  • LayoutInflater的错误用法(Avoid passing null as the view root )

    今天在练习使用Fragment的时候 xff0c 注意到在使用LayoutInflater的时候有黄色报警 xff08 Avoid passing null as the view root needed to resolve layout
  • Android M(6.0)运行时权限申请及遇到的坑

    一 概述 在对动态权限申请进行详细说明时 xff0c 还是先大致介绍下6 0后 xff0c google对权限的一个归类和划分 在Android M之前 xff0c 再开发应用的时候 xff0c 程序员只需要在AndroidManifest
  • Android DataBinding介绍(一)——简介、数据及方法事件绑定

    简介 Data binding 是Google在2015年7月发布的Android Studio v1 3 0 版本上引入的 xff0c 在2016年4月Android Studio v2 0 0 上正式支持 引入之初 xff0c 不支持双
  • CoordinatorLayout的使用(一)——简单使用

    简介 CoordinatorLayout是Android support design推出的新布局 xff0c 主要用于作为视图根布局以及协调子控件的行为 xff08 根据用户的触摸行为产生一定的动画效果 xff09 主要是通过设置子Vie
  • BottomSheetDialog的使用及注意事项

    一 BottomSheetDialog简介 用途 xff1a 底部弹起的view或dialog 实现 xff1a 其关键也是CoordinatorLayout与Behavior 要求 xff1a 采用View的形式展示的话 xff0c 用于
  • mac设置mysql的环境变量

    1 终端输入 xff1a PATH 61 34 PATH 34 usr local mysql bin 这种每次重新进入终端都得写一次 xff0c 比较麻烦 xff1b 2 改变 zshrc文件 终端输入 xff1a vim zshrc 按
  • 关于解决自定义FloatingActionButton滑动行为(Behavior)只隐藏不出现的问题

    最近在使用FloatingActionButton的时候 xff0c 自定义了其Behavior xff0c 然后发现在SDK在25及以上的时候 xff0c 出现了只能隐藏不能重新出现的问题 xff08 24及以下没有出现此问题 xff09
  • NestedScrolling机制解析(二)——NestedScrollView源码

    上一篇文章我们介绍了NestedScrollingParent和NestedScrollingChild接口 xff0c 了解了两个接口里的方法和相互之间的调用关系 这篇我们以NestedScrollView类为例 xff0c 看先嵌套滚动
  • CoordinatorLayout的使用(四)——通过AppBarLayout源码分析联动机制

    一 整体交互逻辑 上一篇文章 xff0c 我们从CoordinatorLayout源码出发 xff0c 分析了一下Behavior几个重点方法的调用逻辑和流程 知道了整个交互的分发流程 但是具体是怎么让一个不是ScrollingView类型
  • Http权威指南笔记(十)——认证

    现在大多数网站都会在cookie等客户端识别机制的基础上建立自己的认证机制 但是HTTP规范中提供的原生认证机制还是有必要了解下 xff0c 了解这些后才能更好理解那些自己建立的认证机制 HTTP原生认证功能一般分为基本认证和摘要认证 基本
  • Http权威指南笔记(十二)——实体与编码

    本章会对HTTP实体和编码进行学习 这里的实体是指HTTP中真正需要传输的实体内容 xff08 比如一张图片 xff0c 一份文档 xff09 这里的编码主要是指内容编码和传输编码 1 报文与实体 如果将HTTP对内容的传输比喻成实际生活中
  • Http权威指南笔记(十三)-国际化

    HTTP报文可以承载任何语言表示的内容的 因为对HTTP来说 xff0c 实体主体真实二进制信息的容器而已 在HTTP中为了支持国际性 xff0c 服务器返回内容的同时需要告知客户端文档是用的什么字母表和语言等信息 xff0c 这样客户端才
  • Http权威指南笔记(十四)-内容协商与转码

    现在很多国际化的一些Web服务都会根据不同地区使用的语言不同 xff0c 返回不同语言的页面内容展示给用户 而这里面就涉及到本篇介绍的内容 内容协商与转码 1 内容协商的技术 目前的内容协商技术主要有3种 客户端驱动协商 服务器驱动协商和透
  • php curl 分离header和body信息

    php curl 分离header和body信息 php中可以通过curl来模拟http请求 xff0c 同时可以获取http response header和body xff0c 当然也设置参数可以只获取其中的某一个 当设置同时获取res
  • 文件缓冲区

    系统自动在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区从内存向磁盘输出数据 xff0c 必须先送到内存中的缓冲区 xff0c 装满缓冲区后才一起送到磁盘 如果从磁盘向计算机读入数据 xff0c 则一次从磁盘文件将一批数据输入到内存缓
  • 【UE4学习】5.相机和蓝图进阶

    文章目录 相机基础Project Setting控制输入按键事件控制相机设置追踪目标CameraManager实现相机切换API接口与多态蓝图之间的通信方式GameMode 43 Manager显示当前相机信息事件调度器Sequencer入