UE4学习总结(5) 相机基础

  • 相机种类
  • 控制自由相机
    • 定义Input事件
    • 配置各个按键的控制效果
    • 转换到相机的视角
  • 控制摇臂相机
    • 摇臂相机搭载子相机
    • 配置各个按键的控制效果
  • 控制滑轨相机
    • 滑轨相机搭载子相机
    • 控制相机位置
    • 控制滑轨相机对准目标
    • 转换到相机的视角
  • 控制多相机镜头切换
    • 创建管理相机的蓝图类
    • 信息传递接口的实现
    • 相机切换的实现
    • 视角设定的实现

相机种类

一共有四种相机,分别为普通相机、电影相机、摇臂相机和滑轨相机。四种相机可以从左边Modes里面拖拽,也可以在Actor蓝图类里面“Add component”。

相机内嵌了一个镜头类,图中右下角模拟了相机拍摄到的镜头画面。可以通过配置,使得在播放时,整个画面可以显示某个相机的镜头。相机的这一特点是它存在的意义。在底层编码逻辑上,镜头Actor和相机Actor的关系是一种继承关系。

需要注意的是,只有普通相机和电影相机在创建时自带镜头,而如果只是新建一个摇臂相机或滑轨相机,只是空空如也的支架,需要在蓝图里面手动添加相机挂载在它上面才能有镜头。
如下图,可以发现摇臂相机和滑轨相机的各个可视组件其实相对整体的Actor也是继承关系。

控制自由相机

我们希望用键盘的“WASD”键和鼠标来控制一个自由的电影相机的移动和视角。

定义Input事件

在“Settings-Project Settings-Input“里面自定义Input事件。虽然直接用键盘同样可以实现事件触发,但是这不是编程的好习惯。定义Input事件可以把单纯的字母命名,使得编程时,即使不用注释也能知道这个事件是干什么的。除此之外,”Axis Mapping”可以有输入值,从而把原来的两个按键合并成一个input事件。这里把”W,S”键统称为“MoveForward”,”A,D” 键统称为“MoveRight”, ”Q,E” 键统称为“MoveUp”, 鼠标上、下移动统称为“LookUp”, 鼠标左、右移动统称为“LookRight”,如下图所示,scale是按按键时事件的输入值。

配置各个按键的控制效果

使用”Add Actor Local Offset”(偏移)和”Add Actor Local Rotation”(旋转)。


注意:想要控制某个相机时,一定要启动player controller(如下图),这样按按键才会有反应。并且必须确保只能有一个Actor启动了player controller,否则程序不知道你控制的是谁,会混乱。

转换到相机的视角

如果不更改,点击“播放”以后出生地点并不是相机所在地,视角也不是相机视角。转换到相机的视角的方法是,在level buleprints里面“Set View Target With Blend”到想要去的相机视角即可。下图中的新目标就是自由相机的蓝图类(BP_FreeCamera)。(之后换相机的时候记得改成那些相机)。

控制摇臂相机

摇臂相机可以伸长、缩短臂长,以及用鼠标调整转角。

摇臂相机搭载子相机

前面说过,如果不搭载子相机,摇臂相机就是个空空如也的支架。因此在“CraneCameraMount”里添加一个子类CineCamera。这一逻辑表明,在编程过程中,“CraneCameraMount”的长度、角度与CineCamera同步变化。

配置各个按键的控制效果

和自由相机几乎一样。由于现实生活中摇臂相机的长度有限制、转角也有限制,因此用”Clamp”来限制阈值。

摇臂相机配置完后,也要记得转换到相机的视角!方法和自由相机一模一样。

控制滑轨相机

滑轨相机的滑轨可以自己画,其实他就是一个Spline。滑轨相机的移动基本上是沿滑轨的前后移动,因此它只有一个自由度。


控制滑轨相机在固定滑轨上前后移动,并且不管移动到哪里,相机镜头都对准方阵原点(即利用相机的Track功能)。

滑轨相机搭载子相机

普通相机可以很容易实现track,只需要在detail-track上打勾再选择一个Actor即可,但是蓝图类里面的相机组件没有此功能,因此不能像摇臂相机搭载子相机那样。此处通过建立ChildActor的方法实现挂载相机。

控制相机位置

滑轨的position总长是1.0。因此想绕滑轨转圈圈,就对总长1取余即可。

控制滑轨相机对准目标

在构造函数里进行配置。创建实例化可编辑Actor型变量”LookAtTargetActor”(小眼睛)。 Actor型变量的意思是,这个变量可以指向任意一个Actor。之后设定相机镜头的target是这个变量,即镜头永远指向这个变量。

在关卡配置界面把”LookAtTargetActor”选成想要对准的那个Actor就行。

转换到相机的视角

由于滑轨相机的镜头在它的Child Actor上,而不像之前几个相机那样在自己身上,所以转换到相机的视角部分有所不同。需要找到滑轨相机的Child Actor再设定为New Target.

控制多相机镜头切换

想要实现用UI控件点击对应按钮就能随意切换到对应机位的功能(以上述三种相机为例)。(UI控件配置见之前的博客)

创建管理相机的蓝图类

创建一个CameraManager蓝图类,使得相应事件触发时,自动切换到对应相机机位。Switch Camera函数待编辑,CameraID是函数的输入变量,表征要切换到哪个相机(三个相机分别是0,1,2)。图中三个事件通过UI控件触发。

信息传递接口的实现

各个相机之间以及与CameraManager之间都是不同的蓝图类,只有创建接口才能实现信息传递,才能控制不同相机的状态。因此又用到了实例化可编辑蓝图类变量(可编辑蓝图类变量解释见“ 控制滑轨相机对准目标”)。此处在CameraManager里面创建名为Cameras的可编辑蓝图类变量数组,并把自由相机、摇臂相机、滑轨相机的蓝图类按顺序存进去。

于是CameraManager蓝图类里面可以通过Cameras访问三个相机了。

相机切换的实现

需要注意,切换相机有两个操作,首先把之前那个相机”disable input”,接着再把现在这个相机”Enable Input”

其中“Set View Target”是一个自定义的函数,设定视角用的,见5.2,暂时先跳过。

视角设定的实现

对于一个相机情况,只需要在level blueprint里面设定view target就行了,但是对于三个相机,难度会大一些。这是因为滑轨相机和其它两个相机这部分程序不同,滑轨相机需要增加一个寻找Child Actor的步骤而其它相机不用。因此考虑采用面向对象语言的多态性来实现视角设定,即对于不同的相机内部,同一个函数有不同的实现。
新建interface,函数取名“SetViewTarget”,里面空着。然后在三个相机蓝图类里面添加这个interface。(Class Settings-Interfaces-Add)

我们自定义的“SetViewTarget”这个函数在三个相机的蓝图类里面视为事件。
对于自由相机和摇臂相机:

对于滑轨相机:

最后,在CameraManager里面调用这个事件即可。

UE4学习总结(5) 相机基础相关推荐

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

    文章目录 相机基础 Project Setting控制输入 按键事件控制相机 设置追踪目标 CameraManager实现相机切换 API接口与多态 蓝图之间的通信方式 GameMode+Manage ...

  2. UE4: 学习虚幻引擎4的16条准则

    作为一个完全的新手,尝试去学习一个新的游戏引擎看起来会很可怕.你拥有了许多的学习教程.文件和建议,但是你却不明白怎样去开始或是以一个什么样的步骤去学习虚幻引擎4.你在不同的方向间摇摆不定,最终你会越来 ...

  3. 学习MSCKF笔记——四元数基础

    学习MSCKF笔记--四元数基础 学习MSCKF笔记--四元数基础 1. 四元数基本性质 1.1 加法 1.2 乘法 1.3 共轭 1.4 模 1.5 逆 1.6 单位四元数 1.7 指数 1.8 对 ...

  4. 相机基础知识讲解:CMOS和CCD

    相机基础知识讲解之感光元件:CMOS和CCD 前言 一.CMOS 二.CCD 三.CMOS和CCD的区别 性能 指标差异 前言 当你在手机或相机上按下拍照键,都发生了些什么? 当你举起手机或相机时,景 ...

  5. UE4学习笔记1st:编程快速入门

    UE4学习笔记1st:编程快速入门 今天我开始学习虚幻4游戏引擎,为了此我专门买了新的电脑,我将主要配置写在这里,有想学习的同学可以参考 显卡:丽台K620 CPU:E3-1230-V3 主板:b85 ...

  6. 《Java并发编程实践》学习笔记之一:基础知识

    <Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念:  (2)进程:是一种活动,它是由一个动作序列组成 ...

  7. 汇编学习(1)——基础知识

    汇编学习(1)--基础知识 ---谨以此系列文章记录我的汇编学习.  关于汇编 说起汇编语言,那自然不得不想到机器语言,在汇编语言尚未诞生之际,程序猿们只能非常苦逼的敲着0和1,还要记住一大堆复杂难记 ...

  8. 自学python困难吗_Python学习难不难?零基础好学吗?

    Python学习难不难?零基础好学吗?我想对于很多人来说,这都是非常关键的问题,也是很多人都在疑惑的问题.现在市场发展,行业的竞争压力是非常大的,转型的人也是非常多,对于不少人转型人才来说,Pytho ...

  9. 学习python需要什么基础-学习python需要什么基础

    Python编程基础知识的学习最终目的是应用于项目中,因此,项目实战训练必不可少.下面小编给大家介绍学习python需要什么基础,一起来看看吧. 学习python需要掌握的基础 1.要有决心 做任何事 ...

最新文章

  1. 高清SDI编码器|上海视涛科技
  2. .Net异步编程知多少
  3. Linux中crontab无法执行java程序的问题
  4. LeetCode 559N叉树的最大深度-简单
  5. html中如何让图片交错,HTML5/Canvas 光圈交错幻觉
  6. android update sdk --no-ui,CircleCI Android constraintLayout不起作用
  7. Linux Shell 判断块设备节点是否存在
  8. 使用telnet 方式管理交换机
  9. Linux串口通信编程
  10. Hexo博文置顶(自定义排序)
  11. 人像优化效果Lr预设
  12. 谷歌与Facebook的关系数据库之战
  13. conda安装cv2库
  14. MATLAB图像的两种模糊模式
  15. cryptsetup 使用说明 中文翻译
  16. python offset函数_Python Pandas tseries.offsets.BusinessHour.copy用法及代码示例
  17. 问卷星自动填写,智能验证和滑动块
  18. 红海or蓝海?数据分析告诉你:在线教育的井喷与未来
  19. 第十三章 使用动态SQL(二)
  20. linux 查询ip归属地的工具,可视化路由追踪工具Linux版下载

热门文章

  1. 学习php的15张思维导图
  2. 如何免费上传4G以上大文件至百度云盘
  3. 并行性和并发性的区别
  4. 亚马逊无货源跨境电商,小白运营需要注意哪些?店铺如何稳定?
  5. 寒冬悟道者马云:阿里巴巴逢单出击
  6. 求string字符串的长度
  7. macOS Big Sur 11.7.7 (20G1345) 正式版 ISO、PKG、DMG、IPSW 下载
  8. sql显示结果不要科学计数法_教你一招丨标准平板菌落计数法
  9. 海天酱油紧跟互联网步伐,线上线下融合发展
  10. PT8M2101A(触控型 8Bit MTP MCU)