UE 实现镜头平移,旋转和缩放
0x00 引
在数字孪生三维场景中,通过键盘和鼠标来控制镜头的移动,缩放是很常见的行为,也是很必要的行为,用户正是通过这些操作,达到对整个三维场景的观看和控制。
0x01 键盘控制镜头前后左右移动
通常,我们会通过几个键盘来控制镜头的移动,比如W向前,S向后,A向左,D向右。
如果是开发过threejs的读者,可能能够设想到的思路是这样的,监听键盘事件,如果是字母W就是把镜头的位置和中心点向前移动,其他键类似。
不过UE把相关的类似的操作封装成了新的事件,通过在项目中配置,可以得到相关的事件的映射,如下图所示,在项目配置中(编辑 -> 项目设置 -> 输入):
如上图所示,W和向上键映射了向前的MoveForward事件,S和向下键映射了向后MoveForward事件。 因此监听MoveForward事件即可实现镜头的向前、向后移动。 同理监听MoveRight事件可以实现向右、向左移动。
添加摄像头组件
接着上一篇文章 《UE 实现鼠标点选模型》,打开A_Pawn蓝图类,添加摄像头组件
添加完成后如下所示:
添加完成后,就可以通过对Pawn的控制来达到对镜头的控制。因为镜头是改Pawn的孩子,Pawn的改变会影带动镜头的变化。
添加"浮动pawn移动"组件
"浮动pawn移动"组件为Pawn类提供了简单的运动的能力,指定"浮动pawn移动"组件之后,Pawn类就可以被控制移动。
添加"浮动pawn移动"组件:
添加之后可以看到:
监听MoveForward事件实现前后移动
在蓝图中添加MoveForward事件:
其中Axis Value表示事件的缩放值(1表示向前,-1表示向后)。监听到了MoveForward之后,就是控制Pawn的前后移动,通过“添加移动输入” 可以控制Pawn的移动:
其中目标是Pawn类,此处使用self即可(Pawn类自身,World Direction表示移动的方向,Scale Value 表示移动的缩放值,一般1表示向前,-1向后,这个正好和前面的Axis Value可以对应。
获取Pawn自身的旋转方向作为World Direction的输入。通过获取控制旋转,然后在通过控制旋转获取向前的向量获取Pawn向前的向量。如果你熟悉webgl和threejs,此步骤类似于下面这个函数:
/**
* 获取网元的正前方向量
* @method frontDirection
* @return {Vec3} 返回网元的正前方向量
*/
frontDirection : function() {
var n = new $Vec3(0, 0, 1);
n = n.applyMatrix4(new Mat4().extractRotation(this.matrixWorld));
n.normalize();
return n;
},
如下图所示:
最终全部的蓝图如下:
监听MoveRight事件实现左右移动
这和 “监听MoveForward事件实现前后移动”类似,此处不在详细说明,全部蓝图如下:
0x02 鼠标移动控制镜头旋转
UE有两个鼠标事件“鼠标X”、“鼠标Y”分别表示鼠标X方向和Y方向的移动。
鼠标X事件实现镜头左右旋转
在监听了鼠标X事件后,需要设置镜头的旋转,通过下面的蓝图节点,可以设置Pawn的旋转。
其中目标是Pawn自己,New Rotation表示要设置的新的旋转的值,是一个向量,该属性还可以进行分割成三个分量,x,y,z。之所以要分割是因为我们左右旋转,只需要改变Z轴方向的旋转。
后续涉及到的分割结构体引脚和此处类似,可能不会在单独说明。
首先需要获取原本的旋转值,然后在原本的旋转值基础上,加上一个新的增量。获取Pawn的旋转,可以通过“获取控制旋转”获取控制器的当前的旋转值:
改节点的目标是控制器,所以需要获取控制器作为目标的输入:
在原来的Z轴旋转的基础上,加上一个增量,这个增量就是“鼠标X”节点的Axis Value,不过一般来说,Axis Value 会比较小,所以还会先乘以一个倍数,把相称的结果作为增量。把Z轴旋转添加增量之后的值,赋值给“设置控制旋转”节点的Z旋转值。
整体的蓝图流程如下:
判断鼠标是否按下
一般来说,我们要旋转镜头,需要按下鼠标,然后移动才能旋转。所以我们需要添加一个条件判断,首先通过下面的节点,可以判断鼠标是否按下:
其中目标是玩家控制器,所以需要获取玩家控制器并连接上
其中的key 设置为鼠标左键,表示判断鼠标左键的按下情况。该节点也可以判断其他键的按下情况。
然后添加一个条件分支,把上述节点的结果作为条件分支节点的输入条件:
整体的蓝图流程如下:
鼠标Y事件实现镜头上下旋转
鼠标Y事件实现镜头上下旋转和“鼠标X事件实现镜头左右旋转”,此处不再赘述,区别的地方在设置的是X轴的旋转。
整体的蓝图流程如下。
0x03 鼠标滚轮控制镜头缩放
实现滚轮缩放,需要使用到 弹簧臂组件。 首先在蓝图的添加一个弹簧臂组件,如下图所示:
添加之后的,需要把弹簧臂加做camera的父亲,这样弹簧臂的改变会带着镜头一块改变:
弹簧臂组件有一个长度属性,通过改变这个长度,就能达到伸缩的效果。
首先监听鼠标滚轮事件:
然后设置弹簧臂的长度,可以拖拽弹簧臂组件到蓝图中:
要设置长度,先要获取原本的长度,
最后在原本长度上面增加一个长度,全部的蓝图如下所示:
0x04
本文讲述了通过蓝图实现镜头的平移旋转,旋转和缩放,涉及到了很多的知识点,需要仔细耐心的查看。
如果你有好的经验,也欢迎和我交流。关注公号“ITMan彪叔” 可以添加作者微信进行交流,及时收到更多有价值的文章。
UE 实现镜头平移,旋转和缩放的更多相关文章
- 【转载】Unity中矩阵的平移、旋转、缩放
By:克森 简介 在这篇文章中,我们将会学到几个概念:平移矩阵.旋转矩阵.缩放矩阵.在学这几个基本概念的同时,我们会用到 Mesh(网格).数学运算.4x4矩阵的一些简单的操作.但由于克森也是新手,文 ...
- osg矩阵变换节点-----平移旋转缩放
osg矩阵变换节点-----平移旋转缩放 转自:http://www.cnblogs.com/ylwn817/articles/1973396.html 平移旋转缩放这个三个是osg矩阵操作中,最常见 ...
- osg中使用MatrixTransform来实现模型的平移/旋转/缩放
osg中使用MatrixTransform来实现模型的平移/旋转/缩放 转自:http://www.cnblogs.com/kekec/archive/2011/08/15/2139893.html# ...
- 二维坐标的平移,旋转,缩放及matlab实现
本文结合matlab 软件解释二维坐标系下的平移,旋转,缩放 首先确定点在二维坐标系下的表达方法,使用一个1*3矩阵: Pt = [x,y,1] 其中x,y 分别为点的X,Y坐标,1为对二维坐标的三维 ...
- opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移
常常需要最图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标. 仿射变换在:http:// ...
- 使用C++实现图形的旋转、缩放、平移
编译环境:VS2017 编译框架:MFC 实验内容:显示一个三角形,并将其绕中心进行旋转.缩放以及平移等操作 实验步骤: 1.打开VS2017,并创建MFC项目,具体方法参见:http://www.c ...
- 初学Direct X(7) ——位图的旋转,缩放以及平移
初学Direct X(7) --位图的旋转,缩放以及平移 本文旨在实现通过D3DXMatrixTransformation2D函数实现位图的旋转,缩放以及平移操作,但是具体的原理部分会在后面进一步的探 ...
- 【转载】Unity3D研究院之IOS触摸屏手势控制镜头旋转与缩放
前几篇文章介绍了很多Unity3D引擎自身的一些问题, 今天我们在回到IOS设备上讨论一些触摸屏幕手势,本章的目标是通过触摸iPhone屏幕手势 实现模型左右的旋转,与模型的缩放. 大家想一想模型的旋 ...
- threeJS创建mesh,创建平面,设置mesh的平移,旋转、缩放、自传、透明度、拉伸
这个小案例是当初我在学习的时候,小的一个小案例,代码还需要进一步优化:还请谅解~~:主要用到了threeJS创建mesh,创建平面,设置mesh的平移,旋转.缩放.自传.透明度.拉伸等这些小功能: 采 ...
随机推荐
- Redis之Lua的应用(四)
一.什么是Lua脚本 Lua是一个高效的轻量级脚本语言(和JavaScript类似),用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.Lu ...
- 31.Squid缓存代理服务器应用
Squid缓存代理服务器应用 Squid安装介绍 web缓存的工作机制 缓存网页对象,减少重复请求 squid 主要提供缓存加速.应用层过滤控制的功能. 工作机制 代替客户机问网站请求数据,从而可以隐 ...
- 对互斥事件和条件概率的相互理解《考研概率论学习之我见》 -by zobol
1.从条件概率来定义互斥和对立事件 2.互斥事件是独立事件吗? 3.每个样本点都可以看作是互斥事件,来重新看待条件概率 一.从条件概率来定义互斥和对立事件 根据古典概率-条件概率的定义,当在" ...
- C语言学习之我见-strncmp()字符串比较函数(控制范围)
strncmp()函数,用于范围内,两个字符串的比较,n表示最大比较范围. (1)函数原型 int strncmp(const char *_Str1,const char *_Str2,size_t ...
- BUUCTF-BJDCTF2020]just_a_rar
BJDCTF2020]just_a_rar 压缩包提示是四位数密码 爆破得知压缩包密码 16进制查看解压的图片后发现flag flag{Wadf_123}
- python基础知识-day9(数据驱动)
1.数据驱动的概念 在自动化测试中,需要把测试的数据分离到JSON,YAML等文件中. 2.YAML 的相关知识 YAML 入门教程 分类 编程技术 YAML 是 "YAML Ain't a ...
- SAP 定义用户组
SUGR,可进行创建.查看.删除等维护性操作,并可指定本组的用户
- python爬虫之protobuf协议介绍
前言 在你学习爬虫的知识过程中是否遇到下面的类型.如果有兴趣学习一下或者了解相关知识的,且不嫌在下才疏学浅,可以参考一下.欢迎各位网友的指正. 首先叙述一下问题的会出现的式样. 你可能会在请求参数中看 ...
- 获取请求体数据 POST
POST获取请求体 请求体中封装了 POST请求的请求参数 获取流对象 再从流对象中那数据 一种字节流 一种字符流 BufferedReader getReader()获取字符输入流 只能操作字符 S ...
- C++类对象作为类成员
//当其他类的对象作为本类的成员 构造的时候先去构造类的对象 再去构造自身 //析构函数: 先进后出 先去构造Phone 再去构造Person Person先退出 Phone后退出 //析构与构造顺序 ...