强制的第一人称视角抖动比移动本身更致晕
别名: 摄像机抖动 · 头部晃动 · camera shake
概念解释
爆炸来了,摄像机被强制晃三下——摇杆并没有动,胃先翻了。视角振荡(viewpoint oscillation)是内容把第一人称相机从头部真实运动上撕开,再叠一层晃、冲、弹。这层晃动往往比当时正在用的移动方式更致晕,因为它把高频、非自主的加速度直接写进视口。
走路时的轻微 head bob、受击时的 camera shake、着陆的下蹲弹,都属于这一类:不是用户在移动,是相机在替用户的头做假动作。
机制
头显的相机本应等于头部位姿。强制抖动等于在已经匹配(或已经勉强匹配)的头部运动上,再加一段头部并没有做的角速度和线加速度。半规管和耳石对这类高频瞬态最敏感,视觉却在报「头在磕」,冲突比匀速滑行更尖。用户无法用「我推了杆」来解释这股运动,自主缓冲被拿掉,和被动过山车是同一类。
更糟的是抖动常叠在已有移动上:一边滑行一边晃,等于在稳态光流上打脉冲。游戏从平面屏幕借来的受击反馈,在平面上只是画面在框里抖;在头显里它是整个世界绕着耳石转。幅度小、频率贴近步态的 bob 有时会被认成「在走」,一旦幅度超过步态、或与脚步不同步,就会从拟真变成假动作。
怎么研究
在同一套移动上开关抖动层:无 bob、步态同步的轻 bob、受击 shake、爆炸冲击。FMS 锁到抖动事件,不要锁到整段移动。让人用头部真实点头或受击姿势去对那层动画,可以看不同步有多大。SSQ 会把抖动和不舒适移动加在一个总分里,事件对齐才能指控抖动本身。
操作振幅、频率、持续时间和是否与头部追踪叠加(加法 vs 覆盖)。覆盖头部追踪等于把真实运动删掉,通常比在真实运动上加法更糟。
边界
第三人称或把身体当成被观察对象时,抖动是「那个身体在晃」,不是「我的头在晃」,致晕会轻。抖动若由用户自己的头部运动驱动(把真实 bob 放大),冲突方向相反,有时能增加匹配。极短的单帧闪白作为受击反馈,不带动相机位姿,不走这条通道。对晕动不敏感、却依赖受击反馈来判断伤害的玩家,关掉 shake 会伤操作;需要另一条不经过相机的反馈。从平面主机借来的「屏幕抖」预设不能当头显默认。
怎么落地
- 默认关闭强制 camera shake 和夸张 head bob;受击、爆炸用短闪、声音、控制器震动,不要挪相机。
- 若保留 bob,幅度低于真实步行的头部起伏,并与脚步锁定;不同步就关。
- 抖动绝对不要覆盖头部追踪,只能在追踪结果上做极小加法,并给独立开关。
- 验证:同一段移动,只开关抖动层。FMS 在抖动事件上跳升、关掉后回落,就该把该层移出默认。若关掉后伤害或着陆变得不可读,把信息改走触觉或声音,而不是把抖加回去。