镜头上下左右移动时,Mesh的惯性表现。

在FPS(第一人称射击)游戏中,Sway 主要指武器摆动效果,即武器模型会根据玩家的鼠标/视角移动产生惯性摆动,模拟真实世界中物体因重力、惯性和手持不稳而产生的自然晃动,从而增强游戏的沉浸感和真实感。

表现上:

  • 当camera向上移动时,枪口位置会跟随得比较快,而握把位置滞后比较多。
  • 水平向右移动时,枪口位置跟随比较快,握把位置跟随比较慢,同时武器会有roll的惯性表现。
  • 旋转表现上,旋转中心在枪身的某个位置。
  • camera移动速度越快,位置和朝向落后越多(但有限)。
  • 当camera移动停止时,枪的位置和朝向都还原。

程序做法

实现上:
需要确定滞后偏移。需要有两个值:;;
这两个值以Component空间叠加的方式作用在tag_weapon上,以实现上面的表现。

所以滞后目标最后都是,过程中跟随目标的大小与移动速度成正比。
应用时,需要将旋转中心调整到指定位置,之后修改tag_weapon。可以利用反算的方式(需要新增一个AnimNode)。
实际应用上可以对、用弹簧平滑,表现更灵活。

const FVector SwayLookLocTarget = bShouldUpdateSwayTarget ? ((SwayConfig.LookSway.LocationVertical * CameraPitchAcceleration + SwayConfig.LookSway.LocationHorizontal * ClampedYawInput) * swayScale) : FVector::ZeroVector;
		
		CurrentLookSwayLocationLag = UKismetMathLibrary::VectorSpringInterp(CurrentLookSwayLocationLag, SwayLookLocTarget,
			LookSwayLocationSpringState, SwayConfig.InterpolationSpring.Stiffness, SwayConfig.InterpolationSpring.CriticalDampingVector, DeltaSeconds, SwayConfig.InterpolationSpring.Mass);
const FVector SwayLookRotTarget = bShouldUpdateSwayTarget ? ((SwayConfig.LookSway.RotationVertical * CameraPitchAcceleration + SwayConfig.LookSway.RotationHorizontal * ClampedYawInput) * swayScale) : FVector::ZeroVector;
		CurrentLookSwayRotationLag = UKismetMathLibrary::VectorSpringInterp(CurrentLookSwayRotationLag, SwayLookRotTarget,
			LookSwayRotationSpringState, SwayConfig.InterpolationSpring.Stiffness, SwayConfig.InterpolationSpring.CriticalDampingVector, DeltaSeconds, SwayConfig.InterpolationSpring.Mass);

动画做法

通过两个变量 X 与 Y 分别代表玩家在水平面上视角旋转的幅度(如:Yaw、Pitch 差值),用以驱动对应方向的动画;
4 个基于 base grip 动画(分别为 Look Up,Look Down,Look Left,Look Right)的 additive 动画。
放入一个blend space中采样。

叠加到移动pose上