Unreal触屏和鼠标控制旋转冲突问题
- 鼠标控制摄像机旋转
- 添加Input轴
- 计算旋转角度
- 通过轴事件控制旋转
- 问题和原因
- 问题
- 原因
- 解决办法
- 增加触摸控制旋转代码
- 触屏操作下屏蔽鼠标轴响应事件
鼠标控制摄像机旋转
通过Mouse X和Mouse Y控制摄像机旋转。
添加Input轴
计算旋转角度
通过移动像素和摄像机FOV角计算像素移动范围和角度之间关系
通过轴事件控制旋转
问题和原因
问题
调试完鼠标控制没有问题的情况下,通过触摸屏旋转则会出现不受控制的乱转问题。
原因
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°导致看起来倒转了)
解决办法
解决办法就是将触摸事件和鼠标事件分开出来
增加触摸控制旋转代码
通过一个Bool数组记录十指的状态,在通过一个Vector3数组记录十指的位置,计算在指头按下状态下对应指头的移动距离计算旋转角度。
触屏操作下屏蔽鼠标轴响应事件
增加触摸操作蓝图并不会导致Windows系统自动停止模拟触屏为鼠标事件。需要我们修改Mouse X和Mouse Y鼠标轴事件,增加判断是否为触摸屏模拟的鼠标事件,如果是,则不处理
根据记录的十指状态判断是不是触屏操作
如果是,则屏蔽鼠标轴事件处理代码。