Skip to content

How to create camera curves

Use this guide to create a custom camera effect curve or tune the Stable camera / Motion 1.6 camera.

Motion uses vector curves for procedural camera motion and Stable upper-body composition, plus one float curve for Stable body clearance. Choose the curve surface by what you intend to control.

Prerequisites

  • MotionCameraComponent on the character
  • Basic familiarity with the Unreal Curve Editor

Choose the curve surface

  • FMotionCurve controls time-based camera motion such as walk bob, sprint energy, impacts, or recoil.
  • StableCameraClearanceCurve maps final view pitch to a dimensionless clearance strength. 0 does not change the Stable camera point. 1 applies all calculated forward clearance.
  • StablePresentationOffsetCurve maps final view pitch to yaw-local XYZ correction for FirstPersonUpperBody and its attached item. It does not move the camera or lower body.

The clearance curve does not contain XYZ camera positions or movement states. Motion evaluates the desired camera point after it applies height, static offsets, and active camera effects. It then calculates the applicable forward distance at that point. The same curve applies to all item states and camera heights.

Use StableCameraClearancePadding for extra distance from the capsule surface. Use MaxStableCameraClearanceCorrection as the safety limit. MotionNativeFirstPersonItemConfig transforms control item-specific grip and screen placement.

Create a curve asset

For a procedural FMotionCurve effect:

  1. In the Content Browser, right-click and select Miscellaneous > Curve.
  2. Choose CurveVector.
  3. Name the asset for the effect, such as Curve_HeadBob or Curve_LandingImpact.

StableCameraClearanceCurve is an FRuntimeFloatCurve on MotionCameraProfile. Add inline keys, or assign a reusable CurveFloat asset. StablePresentationOffsetCurve is an FRuntimeVectorCurve. Assign a CurveVector asset for a reusable shared presentation curve. Motion supplies Curve_FirstPersonPresentationOffset for this purpose.

Design a vector effect curve

Each curve channel maps to a different offset axis:

  • X controls forward or backward location offset. For rotation, it controls roll.
  • Y controls right or left location offset. For rotation, it controls pitch.
  • Z controls up or down location offset. For rotation, it controls yaw.

WARNING

Keep small values for location effects. Return the curve to zero for a smooth end to the effect.

Configure FMotionCurve

For built-in Motion effects, duplicate the applicable profile. Edit the FMotionCurve on the duplicate. For project gameplay systems, create an FMotionCurve in Blueprint or C++. Set these playback fields:

  • Identifier: unique name to add, pause, resume, or remove the curve.
  • CurveAsset: the UCurveVector asset.
  • bShouldLoop: returns to the start at the end when reverse playback is disabled.
  • bShouldReverse: reverses at each endpoint and produces ping-pong playback.
  • Tickrate: playback speed multiplier.
  • Multiplier: effect intensity.
  • FalloutSmoothness: reserved configuration value. RemoveMotionCurve() removes a curve immediately and does not apply this value.
  • bPauseAtNextZero: waits to pause until all three curve axes are within ZeroTolerance of zero.
  • ZeroTolerance: per-axis threshold for pause-at-zero.
  • bRemoveOnComplete: removes one-shot curves automatically at the end.

Profiles store all authored FMotionCurve values. Before playback, Motion copies these values to component state. Thus, runtime fields do not change the profile asset.

Tune Stable camera clearance

The supplied profile uses linear keys that apply full clearance only near the steepest downward angle:

  • -89 degrees: 1
  • -60 degrees: 0
  • 89 degrees: 0

Keep curve values between 0 and 1. Motion limits the evaluated result to this range. Raise the curve earlier if the project body mesh must have more clearance at a smaller downward pitch. Lower the curve if forward movement becomes visible. Adjust padding only if the capsule surface is too close to the visible mesh. Keep a finite maximum correction to limit unusual offsets.

Stable clearance is inactive in Socket mode. Keep CameraPivotSocketName empty to do a test of this curve.

Tune the Stable camera / Motion 1.6 camera

The Stable camera / Motion 1.6 camera uses the full-body MotionCamera socket only as an evaluated animation reference. Motion aligns this reference with the Stable camera anchor before clearance. It then adds StablePresentationOffsetCurve. MaxStablePresentationCorrection limits the total. Offsets use camera yaw with world-up Z. Thus, X stays forward, Y stays right, and Z stays up at all pitch angles.

The supplied shared curve is zero until a steep downward view begins. It then adds forward upper-body and item composition:

  • -89 degrees: (40, 0, 0) cm
  • -60 degrees: (0, 0, 0) cm
  • 89 degrees: (0, 0, 0) cm

Start with StablePresentationAnchorOffset at zero. Use it only for a different neutral anchor relationship. Adjust the shared curve for all item and movement states. Do this before you use a specialized curve. If the limit stays active, examine the pose, anchor, and correction limit.

Apply the curve

Built-in Motion movement effects come from their assigned component profiles. For your own camera polish, call the camera component directly:

cpp
MotionCameraComponent->AddMotionCurve(HeadBobCurve);

Remove the curve when the state ends:

cpp
MotionCameraComponent->RemoveMotionCurve(HeadBobCurve.Identifier);

Do a test of the effect

  1. Start PIE.
  2. Trigger the state that adds the curve.
  3. Make sure that the curve starts, loops, and returns to a neutral camera position.
  4. Adjust the curve keys, tangents, Tickrate, and Multiplier.

Common patterns

  • Walk head bob: loop, reverse, and small multiplier.
  • Sprint camera shake: looping, faster tickrate, stronger multiplier.
  • Landing impact: one-shot, quick downward Z offset, recovery to zero.
  • Jump takeoff: one-shot, short lift or pitch impulse.
  • Weapon recoil: one-shot, fast tickrate, returns to zero.

Do not add separate stance or item curves to reproduce camera positions. First, adjust the shared clearance curve for geometric safety. Then, adjust the shared presentation curve for upper-body and item composition. Use item transforms only for item-specific grip placement. Correct visible cut surfaces or missing torso geometry in the first-person mesh content.

Troubleshooting

  • Curve does not play: confirm camera effects are enabled, the character has a MotionCameraComponent, and the curve has a unique Identifier.
  • Effect is too subtle: increase Multiplier or curve values.
  • Motion is jerky: use smoother tangents in the Curve Editor.
  • Curve never stops: confirm the remove action uses the same Identifier.
  • Stable clearance has no effect: confirm CameraPivotSocketName is empty and native first-person presentation is enabled.
  • Stable clearance starts too early or late: adjust the pitch keys on StableCameraClearanceCurve. Do not add a fixed XYZ offset.
  • Stable arms or item drift during movement/crouch: confirm the full-body skeleton has MotionCamera and that the Stable camera / Motion 1.6 camera is valid.
  • Stable arms or item leave the frame only at steep pitch: adjust StablePresentationOffsetCurve. Do not move the Stable camera to position the item.
  • Stable correction stays at the limit: correct the neutral anchor or pose. Increase MaxStablePresentationCorrection only after you measure the necessary range.

Next steps

Continue with the camera reference.

Motion - Advanced First Person Character Controller