鼠标控制摄像机旋转

通过Mouse X和Mouse Y控制摄像机旋转。

添加Input轴

Unreal触屏和鼠标控制旋转冲突问题-LMLPHP

计算旋转角度

通过移动像素和摄像机FOV角计算像素移动范围和角度之间关系
Unreal触屏和鼠标控制旋转冲突问题-LMLPHP

通过轴事件控制旋转

Unreal触屏和鼠标控制旋转冲突问题-LMLPHP

问题和原因

问题

调试完鼠标控制没有问题的情况下,通过触摸屏旋转则会出现不受控制的乱转问题。

原因

Windows系统会将触摸事件模拟为鼠标事件,这样软件不需进行特殊的触摸屏适配,也可以在触摸屏下进行简单的单指交互操作。
造成触摸屏下出现旋转控制乱转的原因就是Mouse X和Mouse Y轴事件的计算机制。
鼠标在Mouse Pressed状态下,Unreal会锁定鼠标,每次移动鼠标后会把鼠标拉回到按下位置。Unreal在计算Mouse X和Mouse Y轴的Axis Value值时只需要计算当前鼠标位置和按下状态的鼠标位置差值,即可算出Axis Value。

AxisValueX = MouseLocation.X - PressedLocation.X
AxisValueY = MouseLocation.Y - PressedLocation.Y
# 以下操作不需要,Unreal会将鼠标位置自动拉回按下位置
# PressedLocation = MouseLocation

但在触摸屏状态下,这个机制就有问题了。Unreal可以把系统鼠标拉回到按下位置,但触摸屏模拟的鼠标位置是没有办法拉回的,触摸屏模拟的鼠标位置始终位于手指头的下方。这样,计算出来的AxisValueX 和AxisValueY 值就会变得异常的大,导致控制旋转不受控制,旋转异常快或反转(可能旋转超过360°导致看起来倒转了)

解决办法

解决办法就是将触摸事件和鼠标事件分开出来

增加触摸控制旋转代码

Unreal触屏和鼠标控制旋转冲突问题-LMLPHP
通过一个Bool数组记录十指的状态,在通过一个Vector3数组记录十指的位置,计算在指头按下状态下对应指头的移动距离计算旋转角度。

触屏操作下屏蔽鼠标轴响应事件

增加触摸操作蓝图并不会导致Windows系统自动停止模拟触屏为鼠标事件。需要我们修改Mouse X和Mouse Y鼠标轴事件,增加判断是否为触摸屏模拟的鼠标事件,如果是,则不处理
Unreal触屏和鼠标控制旋转冲突问题-LMLPHP
根据记录的十指状态判断是不是触屏操作

Unreal触屏和鼠标控制旋转冲突问题-LMLPHP
如果是,则屏蔽鼠标轴事件处理代码。

03-04 06:00