Skip to content

How to create camera curves

Use this guide to create a custom camera effect curve or tune Stable camera clearance and presentation.

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 Unreal's Curve Editor

Choose the curve surface

  • FMotionCurve drives time-based camera motion such as walking bob, sprint energy, impacts, or recoil.
  • StableCameraClearanceCurve maps final view pitch to a dimensionless clearance strength. 0 leaves the fully composed Stable camera point unchanged; 1 applies all forward clearance derived from the point and the owning capsule.
  • 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 author XYZ camera positions and does not encode standing, crouching, sliding, or vaulting. Motion evaluates the actual desired camera point after height, static offsets, and active camera effects, then derives the forward distance needed at that point. The same curve therefore applies while unarmed or item-held and at arbitrary camera heights. Use StableCameraClearancePadding for extra distance beyond the capsule surface and MaxStableCameraClearanceCorrection as the safety bound. Item-specific grip and screen placement remain in MotionNativeFirstPersonItemConfig transforms.

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. Author its inline keys directly, or assign a CurveFloat asset when the project needs a reusable curve. StablePresentationOffsetCurve is an FRuntimeVectorCurve; assign a CurveVector asset such as the shipped Curve_FirstPersonPresentationOffset when you want a reusable shared presentation curve.

Design a vector effect curve

Each curve channel maps to a different offset axis:

  • X controls forward/back location offset, or roll when used as rotation.
  • Y controls right/left location offset, or pitch when used as rotation.
  • Z controls up/down location offset, or yaw when used as rotation.

WARNING

Keep values small for location effects and return the curve to zero when the effect should settle cleanly.

Configure FMotionCurve

For built-in Motion effects, duplicate the profile that owns the effect and edit the FMotionCurve on that duplicated profile. For your own gameplay systems, create an FMotionCurve in Blueprint or C++ and set the playback fields:

  • Identifier: unique name used to add, pause, resume, or remove the curve.
  • CurveAsset: the UCurveVector asset.
  • bShouldLoop: wraps to the start after reaching the end when reverse playback is disabled.
  • bShouldReverse: reverses at each endpoint, producing ping-pong playback.
  • Tickrate: playback speed multiplier.
  • Multiplier: effect intensity.
  • FalloutSmoothness: reserved configuration value; the current RemoveMotionCurve() path 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 used by pause-at-zero.
  • bRemoveOnComplete: removes one-shot curves automatically after they reach the end.

Profiles store the complete authored FMotionCurve value. Motion copies that value into state stored on the component before playback so fields such as ActiveSeconds, bIsReversing, bIsPaused, and bPendingPause do not mutate the profile asset during play.

Tune Stable camera clearance

The shipped profile uses linear keys that apply full clearance only near the steepest look-down angle:

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

Keep curve values between 0 and 1; Motion clamps the evaluated result to that range. Raise the curve earlier when a project's body mesh needs more clearance at shallower downward pitch. Lower it when forward movement becomes visually noticeable. Adjust padding only when the capsule surface is still too close to the visible mesh, and keep a finite maximum correction so unusual offsets cannot move the view arbitrarily far.

Stable clearance is bypassed in Socket mode. CameraPivotSocketName must be empty to test this curve.

Tune Stable presentation

Stable presentation uses the full-body MotionCamera socket only as an evaluated animation reference. Motion aligns that reference with the pre-clearance Stable camera anchor, then adds StablePresentationOffsetCurve and clamps the total through MaxStablePresentationCorrection. Because offsets use camera yaw with world-up Z, X remains character-forward, Y remains right, and Z remains up at every look pitch.

The shipped shared curve is zero until steep look-down begins, then adds forward upper-body/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 when the character/profile needs a different neutral anchor relationship. Tune the shared curve across unarmed and item-held standing/crouched states before considering a more specialized curve. Persistent clamp activation means the pose, anchor, or correction budget needs review.

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);

Test the effect

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

Common patterns

  • Walking head bob: looping, reversing, subtle 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 just to reproduce camera positions. First tune the shared clearance curve for geometric safety and the shared presentation curve for upper-body/item composition. Use item transforms only for item-specific grip placement, and fix visible cut surfaces or missing torso coverage 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 encode a fixed XYZ offset.
  • Stable arms or item drift during movement/crouch: confirm the full-body skeleton has MotionCamera and that Stable presentation is valid.
  • Stable arms or item leave the frame only at steep pitch: tune StablePresentationOffsetCurve; do not move the Stable camera just to compose the item.
  • Stable correction clamps continuously: fix the neutral anchor/pose or increase MaxStablePresentationCorrection only after measuring the required range.

Next steps

Continue with the camera reference.

Motion - Advanced First Person Character Controller