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的平移,旋转.缩放.自传.透明度.拉伸等这些小功能: 采 ...
随机推荐
- 开始讨论离散型随机变量吧!《考研概率论学习之我见》 -by zobol
上一文中,笔者给出了随机变量的基本定义:一个可测映射,从结果空间到实数集,我们的目的是为了引入函数这个数学工具到考研概率论中,但是我们在现实中面对的一些事情结果,映射而成的随机变量和其对应的概率值,并 ...
- BUUCTF-九连环
九连环 这题还是稍微有点难度的 使用16进制打开发现压缩包,用binwalk分离看看 分离得到的压缩包同样16进制看看 可以发现多个压缩包,这种情况应该是伪加密的方式,但是直接使用修复压缩包的方式没法 ...
- 封装环形加载进度条(Vue插件版和原生js版)
1.效果预览 2.用到的知识 主要利用SVG的stroke-dasharray和stroke-dashoffset这两个属性. 在看下面文章之前,你需要了解 <!DOCTYPE html> ...
- Linux shell 2>&1的意思
在脚本里经常看到 ./xxx.sh > /dev/null 2>&1 ./xxx.sh > log.file 2>&1 在shell中输入输出都有对应的文件描述 ...
- 【python基础】第05回 数据类型,交互,格式化输出,运算符
上节内容回顾 1.python的注释 # 单行注释 pycharm快捷键:ctrl+? '''多行注释''' """多行注释""" 2.py ...
- 面试突击61:说一下MySQL事务隔离级别?
MySQL 事务隔离级别是为了解决并发事务互相干扰的问题的,MySQL 事务隔离级别总共有以下 4 种: READ UNCOMMITTED:读未提交. READ COMMITTED:读已提交. REP ...
- 期末人福音——用Python写个自动批改作业系统
一.亮出效果 最近一些软件的搜题.智能批改类的功能要下线. 退1024步讲,要不要自己做一个自动批改的功能啊?万一哪天孩子要用呢! 昨晚我做了一个梦,梦见我实现了这个功能,如下图所示:功能简介:作对了 ...
- 利用IDEA搭建SpringBoot项目,整合mybatis
一.配置文件.启动项目 生成之后这几个文件可以删掉的 配置application spring.datasource.url=jdbc:mysql://localhost:3306/test?serv ...
- NC24325 [USACO 2012 Mar S]Flowerpot
NC24325 [USACO 2012 Mar S]Flowerpot 题目 题目描述 Farmer John has been having trouble making his plants gr ...
- python解决“failed to execute pyi_rth_pkgres”问题
pip uninstall pyinstaller pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip