Phantom Cameras

How to configure a Phantom Camera — priority, target, lens, stage composition, and snap / focus state.

A Phantom Camera is a virtual camera definition placed in your level as a component on an ordinary entity. It does not render anything. Instead, the GS_PhantomCameraComponent holds priority, lens, target routing, and a stage pipeline slot that authors fill in to give the cam its behavior. The Cam Manager arbitrates priority across all registered Phantom Cameras in a channel — whichever active cam holds the highest priority drives the real camera at any given moment via the Cam Core.

Where previous versions of GS_PhantomCam shipped separate components for each behavior, all of those behaviors are now stage variants layered on top of the single base component. To make a cam follow, orbit, sweep along a spline, or track a group of subjects, you slot a Body stage and an Aim stage — and optionally one or more Additive stages — from the editor’s type-picker.

For architecture details, component properties, and extending the system in C++, see the Framework API reference.

Phantom Camera component in the O3DE Inspector

 

Contents


How Priority Works

Every GS_PhantomCameraComponent has a base priority. The Cam Manager continuously evaluates priority across all active Phantom Cameras in a channel and routes camera control to the highest. Influences (Influence Fields, gameplay code) can add temporary priority modifiers without touching the base value. When the dominant camera changes, the Cam Manager notifies the Cam Core to begin blending toward the new winner.

ConditionResult
Camera A priority 10, Camera B priority 5 — both activeCamera A is dominant.
Camera A is disabled or deactivatedCamera B becomes dominant immediately (or blends if a Blend Profile entry matches the A → B pair).
Camera A and Camera B both priority 10The most recently activated one is dominant.
No Phantom Cameras are active in a channelThe real camera holds its last known position.

In multi-channel projects, each channel arbitrates independently — player 1 dominance changes do not affect player 2’s view.


PhantomCamData Fields

Each Phantom Camera stores a PhantomCamData record with its lens, priority, and follow target. Follow / look-at offsets, damping halflives, and target-mode resolution live on the stages, not on PhantomCamData.

FieldTypePurpose
Prioritys32Base priority used in arbitration. Higher wins.
FOVfloatField of view in degrees. Applied to the real camera when dominant.
NearClipfloatNear clip plane distance.
FarClipfloatFar clip plane distance.
CamTargetEntityIdThe follow target. May be left empty to inherit the channel target from the Cam Manager.

A Phantom Camera with no CamTarget and no inherited channel target sits at its entity’s authored position until a target is bound.


Stage Composition

The cam’s behavior is the composition of one Body stage, one Aim stage, and zero-or-more Additive stages. Each is picked from the editor’s type-picker on the corresponding slot.

SlotCommon picksWhat it controls
BodyDefaultFollowBody, OrbitBody, DynamicOrbitBody, LeadingFollowBody, TrackBodyHow the cam follows the target.
AimDefaultLookAtAim, ClampedLookAimHow the cam orients toward the target.
Additives (Reposition)CollisionReposition, TugAimListener, TugBodyListenerPose corrections — collision pushback, magnetic spatial pulls.
Additives (Noise)PerlinNoise, ImpulseNoisePose perturbations — handheld sway, event-triggered shake.

A third-person shoulder cam, for example, slots LeadingFollowBody + DefaultLookAtAim + a CollisionReposition additive. An orbital boss cam slots DynamicOrbitBody + DefaultLookAtAim + a PerlinNoise additive for handheld feel.

For full step-by-step composition recipes, see the recipes page.

Stage Composition Recipes API

Retired components

ClampedLook_PhantomCamComponent, StaticOrbit_PhantomCamComponent, and Track_PhantomCamComponent no longer exist as separate components. Their behavior is now provided by stage variants:

Retired componentReplacement
StaticOrbit_PhantomCamComponentOrbitBody Body stage.
ClampedLook_PhantomCamComponentClampedLookAim Aim stage.
Track_PhantomCamComponentTrackBody Body stage.

AlwaysFaceCameraComponent is unchanged — it is still a billboard helper, not a camera type itself.


Channel Scope

Each Phantom Camera authors a Channel Scope that decides how it participates in the channel system. In single-player projects, leave this at the default (Local) and everything routes through channel 0. In multi-channel projects:

ScopeUse for
Local (default)The cam lives in its rig’s channel. Each spawned rig instance has its own copy.
AllChannelsIn-rig per-player broadcast cam — every spawned rig carries a duplicate.
TrueUniqueA single instance bound to a specific channel, or shared across every channel (e.g. cinematic collapse cams paired with Group Targets).

For the full walkthrough, see Channels & Instancing.


Snap and Focus

A Phantom Camera ticks each frame when any of these is true:

  • m_hasFocus — this cam is the channel’s currently-driven cam.
  • m_alwaysUpdate — authored opt-in to always tick (background-tracking cams).
  • m_blendingOut — this cam is the outgoing source of an in-flight blend.

Outside that condition the cam is fully dormant — it does not tick, its stages do not run, and its body does not integrate input.

The cam automatically snaps to its evaluated ideal pose (bypassing damping for one tick) on:

  • Focus gain.
  • A new target binding (SetCameraTarget).
  • A new group-target binding (SetTargetFocusGroup).
  • An explicit QueueSnapCamera() call.

For synchronous snap (typically only needed by framework code at mid-spawn binding), call SnapCameraNow() instead.


Activating and Deactivating Cameras

Phantom Cameras participate in priority arbitration only while their entity is active. Enable or disable the entity to add or remove a camera from the channel. The transition between dominant cameras is animated by whichever Blend Profile entry matches the outgoing → incoming pair (see Blend Profiles).

ScriptCanvas

To raise a camera’s priority and make it dominant:

Because priority is numeric, you can activate multiple cameras simultaneously and let priority values determine dominance without manually disabling others.


Requesting Camera Data

Use PhantomCameraRequestBus (addressed by the Phantom Camera entity’s ID) to read or write its configuration at runtime, query staged poses, or trigger an impulse on all ImpulseNoise additives.

ScriptCanvas


Quick Reference

NeedBusMethod / Event
Read a camera’s lens / priority dataPhantomCameraRequestBus(id)GetCameraData
Change a camera’s follow targetPhantomCameraRequestBus(id)SetCameraTarget(entityId)
Change a camera’s priorityPhantomCameraRequestBus(id)SetCameraPriority(value)
Snap the camera to its ideal next tickPhantomCameraRequestBus(id)QueueSnapCamera
Fire an impulse on all ImpulseNoise additivesPhantomCameraRequestBus(id)TriggerCameraImpulse(strength)
Make a camera dominant(entity activation)Enable the Phantom Camera entity
Remove a camera from arbitration(entity activation)Disable the Phantom Camera entity
Know when the dominant camera changesCamManagerNotificationBusSettingNewCam (channel 0) or SettingNewCamOnChannel (multi-channel)
Read a stable pose for gameplay codePhantomCameraRequestBus(id)GetStablePose — preferred over GetFinalPose for movement input

Glossary

TermMeaning
Phantom CameraA virtual camera definition that publishes a candidate pose every tick.
Stage pipelineThe fixed Body → Aim → Reposition → Noise order that each cam runs each tick.
Body stageThe component that writes state.position. One slot per cam.
Aim stageThe component that writes state.rotation. One slot per cam.
Additive stageA stackable correction or perturbation that runs after Body / Aim.
PriorityA numeric value that determines which Phantom Camera drives the real camera within its channel.
ChannelOne player viewpoint slot. Channel 0 is the implicit default for single-player.

For full definitions, see the Glossary.


See Also

For the full API, component properties, and C++ extension guide:

For related systems:


Get GS_PhantomCam

GS_PhantomCam — Explore this gem on the product page and add it to your project.