解密ControlRotation与ActorRotation

在实现角色移动时,我们是通过获取当前角色向前或者向后移动的向量来计算具体的移动步长,进而增量设置角色位置以达到使角色移动的目的。但是获取向前或者向后的向量得先知道当前角色在世界坐标系中旋转的角度,于是我们就在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群,跟业内人士共同探讨交流。

qm.qq.com/cgi-bin/qm/qr? (二维码自动识别)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值