在实现角色移动时,我们是通过获取当前角色向前或者向后移动的向量来计算具体的移动步长,进而增量设置角色位置以达到使角色移动的目的。但是获取向前或者向后的向量得先知道当前角色在世界坐标系中旋转的角度,于是我们就在ControlRotation和ActorRotation之间犹豫不定,对二者异同不甚了解,分别表达的意图也懵懵懂懂,似乎对于初学者总隔着一层面纱,今天我就帮大家揭开它。

有个大前提:只讨论第一人称

首先概念上讲,ControlRotation作为控制器的成员变量,在这里是表示人眼睛朝向,ActorRotation表示人身躯的朝向。

如下示意图,会更明确:

rotation示意图

我们可以从常识上理解,人的眼睛在脑袋上,脑袋是可以左右摆头(Yaw角度变化),可以上下点头(Pitch角度变化),而人的身躯只能左右转动(Yaw角度变化),身躯不能僵直地俯仰,这在第一人称射击游戏里面不会出现。(反正我没有见过,你如果见过请告知我)

我们可以通过代码进一步佐证:

获取眼睛位置和朝向

朝向获取

ControlRotation和ActorRotation的关系

它们两者的关系,其实主要是理清楚它们分别是怎样更新的或者其中一个值的更新怎样影响到另一个值的变化。

1、ControlRotation的更新

我们在开发第一人称射击游戏时,通过鼠标的上下左右移动以控制枪的瞄准方向也就是眼睛的朝向,会利用到如下代理绑定:

ControlRotation的更新代理

随着鼠标移动会使眼睛也保持移动,那么具体ControlRotation怎样被更新的呢?那么我们通过UE4底层代码进一步探究,如下图:

ControlRotation更新算法

我们先看到我标注的关注1,在此ViewRotation就是ControlRotation,它会在PlayerCameraManager的ProcessViewRotation函数里面被更新,更新的变换值是DeltaRot,这个值是角度的增量变化值。更新好了后,通过SetControlRotation更新ControlRotation值,那么再看ProcessViewRotation函数具体的实现,如下图:

ControlRotation增量角度更新

如上图的注释说明,最终值是通过引用做返回,而值的增量更新就是加上了DeltaRot。不过,我们前面就说了ControlRotation实际上就是眼睛的朝向,眼睛朝向按实际情况角度是有限制的,比如向上仰头肯定不能超过90度,否则头就断了(很恐怖的情景)。具体限制的值如下图:

眼睛各角度限制值

由此我们终于弄明白了ControlRotation具体更新的过程,实际上就是把增量变化的角度值增加到其上即可,增量变化的角度值与鼠标的位置变化成线性关系。

2、ActorRotation的更新

那ActorRotation是怎样被更新的,我们回过头来看《ControlRotation更新算法》图中的关注2,当更新完了ControlRotation后,会利用它作为参数传递到了FaceRotation函数中,那就看一下FaceRotation函数做了什么,如下图:

ActorRotation更新

我们看到它其实会根据bUseControllerRotaionPictch,bUseControllerRotaionYaw和bUseControllerRotaionRoll开关,分别判断是否使用ControlRotation的分量角度,最后会通过SetActorRotation函数设置ActorRotation的值,这里也恰好解释了我们经常在编辑器里面设置的几个开关,如下图:

开关设置

对于射击游戏,我们设置让ControlRotation的Yaw值去更新ActorRotation的Yaw值,也就是说眼睛的左右转向控制角色身躯的左右转向。

至此,所有谜底我们都已经解开,我们给出一个结论:

在第一人称射击游戏中,ControlRotation表示的是角色眼睛的朝向,为了符合现实中的效果,分别对眼睛在Pitch、Yaw、Roll三个转向上做了限制,ActorRotation表示的是角色身躯的朝向,根据用户配置,它的Yaw是更新自ControlRotatioin的Yaw值。

不知道大家有没有一种包公破案的感觉,当然这里要简单很多,实际在工作中我们碰到的问题也比这要复杂,但是其实解决问题的思路方法一致。

好,大家如果有兴趣结合案例去综合实践,可以跟着UE4-VR高级课程 虚幻引擎多人在线射击游戏C++开发实战(第一季)第六节课《人物前后移动》来做。

欢迎大家加入我们的qq群,跟业内人士共同探讨交流。

http://qm.qq.com/cgi-bin/qm/qr?k=nBfAvQJM7Q8hCESjMF39WTlxMzDLVsd0 (二维码自动识别)

解密ControlRotation与ActorRotation相关推荐

  1. 加解密基础——(对称加密、非对称加密和混合加密)

    本文对之前学习过的加解密相关知识做一简单总结,以备后用. 1. 基本概念 加密算法 通常是复杂的数学公式,这些公式确定如何将明文转化为密文的过程和规则. 密钥 是一串被加入到算法中的随机比特. 待续 ...

  2. 通过T-SQL语句实现数据库加解密功能

    CREATE TABLE [dbo].[Users] ([U_nbr] NVARCHAR(20) NOT NULL PRIMARY KEY,[Pwd] nvarchar(MAX) )--加密 DECL ...

  3. aes前台加密后台解密

    aes加密npm地址:https://www.npmjs.com/package/crypto-js aes加密git地址/下载: https://github.com/brix/crypto-js ...

  4. Sql存储过程加密和解密

    可用于加密SQL存储过程或者触发器(这是SQL Server本身提供的,也就是说这是微软的加密算法) http://www.mscto.com 使用 WITH ENCRYPTION 选项 WITH E ...

  5. aes js 加盐值 解密_crypto-js aes加密解密

    安装 npm install crypto-js --save unit.js import CryptoJS from "crypto-js"; //秘钥 const CRYPT ...

  6. java上传加密_Java上传下载文件并实现加密解密

    使用 Jersey 服务器实现上传,使用 HTTP 请求实现下载 引入依赖 在 pom.xml 中添加 Jersey 相关依赖 com.sun.jersey jersey-client 1.18.1 ...

  7. C语言实现AES加解密

    C语言实现AES加解密 AES算法 具体代码 AES算法 (AES)RIJNDAEL算法是一个数据块长度盒密钥长度都可变的分组加密算法,其数据块长度和密钥长度都可独立地选定为大于等于128位且小于等于 ...

  8. des vue 双倍长 解密_3DES双倍长加密 - osc_ojx9hm4t的个人空间 - OSCHINA - 中文开源技术交流社区...

    importjava.security.SecureRandom;importjavax.crypto.Cipher;importjavax.crypto.SecretKey;importjavax. ...

  9. 舒工给您娓娓道来:2019-nCoV,教室布局筛查追溯系统算法解密!

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

最新文章

  1. 软件性能测试主要看什么指标
  2. Python 实现整数线性规划:分枝定界法(Branch and Bound)
  3. 设置 VirtualBox 虚拟机访问局域网
  4. 会声会影x7 每次安装均会提示:已安装这个产品的另一个版本
  5. 告诉你,我认识的上网的方式
  6. python 比较运算符放在列表中_在Python3中将运算符放在列表中
  7. 关于打印数组一直输出地址符号的一个解决方法
  8. string s=new string() 创建了几个对象_Java的String类5个常见面试题的解答过程和原理...
  9. [转载] Python:把字符串转换成整数
  10. H3C ospf与nat转换
  11. BZOJ4435 : [Cerc2015]Juice Junctions
  12. 今年暑假不ac (c语言版)
  13. 可集成到APP的车架号识别sdk
  14. 2021牛客多校9.F.Train Wreck 构造
  15. Android使用Volley框架显示“Cleartext HTTP traffic to XXX not permitted”的解决方法
  16. 商科能读计算机专业吗,我本科读的计算机 想去新西兰留学可以换专业吗? 没分了跪求啊,...
  17. 一款简单而强大的截图软件 Snipaste
  18. IDEA打开Maven项目一直indexing或 scanning files to index导致整个idea页面卡住 解决方法
  19. vue3表格双击事件
  20. 【机器学习算法介绍】朴素贝叶斯

热门文章

  1. 2003服务器远程桌面连不上解决办法
  2. Axure SVN共享 Commit Failed (details Follow) 问题解决
  3. mysql复制安全性_从MySQL复制功能中得到一举三得实惠
  4. 艾创机器人_世界教育机器人大赛 2019赛季世界锦标赛落幕曲靖代表队获多个奖项...
  5. Javaweb maven项目tomcat报错: javax.naming.NamingException: 无法创建资源实例
  6. .Net 中接口应用的知识点(排序)
  7. 八、计数排序及其应用分析
  8. cpc卡内计费信息异常包括_今日头条信息流广告投放效果好吗?信息流广告计费方式怎么收费?...
  9. Newtonsoft.Json反序列化(Deserialize)出错:Bad JSON escape sequence
  10. 必须理解的分布式系统中雷同的集群技术及原理