AdvancedLocomotionSystemV4分析(五):镜头

上一篇留下了一个镜头抖动问题,实际上ALS项目是通过自定义
CameraManager实现的,本篇就此来展开一下
AdvancedLocomotionSysemV4分析(一):移动和脚步IK
AdvancedLocomotionSystem分析(二):攀爬系统
AdvancedLocomotionSystemV4分析(三):动作叠加
AdvancedLocomotionSystemV4分析(四):布娃娃和起身
先大概简述一下ALS镜头控制的方法
- 自定义
CameraManager代替默认第三人称模板的SpringArm+Camera的方式 - 重写
BlueprintUpdateCamera CameraManager挂载骨骼模型相机,创建动画蓝图,用曲线来控制相机位置信息
动画蓝图
ALS巧妙的用动画蓝图来辅助相机位置的控制和切换,如何做到的?我们先来看一下这是个什么动画蓝图

随便打开一个角落

所以说,动画蓝图没动画(lll¬ω¬)
完全是用动画蓝图的状态机来自然过渡各类曲线数据,所以显而易见的可以知道在其他地方会 用到这些曲线
ps.相机的骨骼模型你完全可以用一个球代替,曲线都是手动加的,不用到三维软件加
CameraManager

先一个初始化方法把必要的参数给拿到,可以到PlayerController内初始化,毕竟CamaraManager本身就是配置在PlayerController内

然后重写BlueprintUpdateCamera方法,随意给一个判断,不满足就走默认的方式

在CustomCameraBehavior内有很多计算,我们逐一分析

从角色内去获取必要的参数,PivotTarget是观察的目标点,1PTarget为第一人称的位置,第一人称会讲相机放到固定插槽位置,这里是眼睛的位置

当前旋转向控制器旋转插值过去,速度由曲线RotationLagSpeed变量控制

SmoothPivotTarget其实是当前的相机变换信息,插值向第一条的目标点
关于CalclateAxisIndependentLag内部是经过插值计算把CurrentLocation向TargetLocation插值过渡
内部有一点不容易理解,如下图

位置先反向旋转最后又给转回来,如果觉得很难理解,其实可以不加这部操作,区别不大

然后再加上曲线PivotOffset_*的偏移后存为变量PivotLocation,简单粗暴

然后加上相机偏移曲线CameraOffset_*存为变量TargetCameraLocation
关于
CameraOffset与PivotOffset的区别前者是相机的位置,后者是目标点的位置,其实换到大家熟悉的
SpringArm来说,前者就是SocketOffset,后者就是TargetOffset,不熟悉的可以自己去试一试

第三人称下的射线检测,其实就是做了一个类似SpringArm的DoTestCollision的作用

最后就是根据曲线返回第一人称还是第三人称的数据