How-To: Set Up a First-Person Camera

Goal: put the view at the pawn's eye, looking exactly where the player is looking - no boom, no offset curve, no penetration avoidance (the camera is already inside the pawn's own collision).

Prerequisites
You completed Quick Start - a UCrimsonCameraComponent on your pawn and ACrimsonPlayerCameraManager on your controller.

1. Create a first-person mode

Make a Blueprint subclass of UCrimsonCameraMode_FirstPerson. It drives the view straight from the control rotation, clamped by the base ViewPitchMin / ViewPitchMax. Its FieldOfView defaults to 90 rather than the plugin-wide 80, because the same number reads narrower in first person.

Content Browser -> Crimson Plugins -> Camera -> Camera Modes -> Camera Mode - First Person. Open it and set the First Person category (Eye Socket Name, Eye Offset, Hide Owner Mesh While Active) plus Field Of View and the pitch clamps in the View category.
Verify
The mode opens with a First Person category exposing Eye Socket Name, Eye Offset, and Hide Owner Mesh While Active.

2. Place the eye

The eye comes from a mesh socket when Eye Socket Name is set, and from the pawn's view pivot otherwise. Both are then nudged by Eye Offset, which is in view space - X forward, Y right, Z up - so a forward nudge stays forward however the player is looking.

SettingEffect
Eye Socket Name = a bone/socket (e.g. head)The eye rides the animated skeleton, so you get head movement from the animation for free. Resolved against the Character's mesh, else the first skeletal mesh on the target actor.
Eye Socket Name = None (default)The eye sits at the pawn's view pivot - the eye height its capsule and BaseEyeHeight describe. Steadier: no bob from the walk cycle.
Eye OffsetView-space nudge. A small +X pushes the camera out past the face so it does not clip; a negative Z drops the eye when the socket sits high on the skull.
A missing socket is not fatal
If Eye Socket Name does not exist on the mesh the mode falls back to the view pivot and logs one warning to LogCrimsonCamera (once per mode instance, not once per frame). Check the Output Log if the eye is not where you expect.
Need something else entirely?
Get Eye Location is a BlueprintNativeEvent. Override it to drive the eye from a dedicated first-person mesh, a vehicle seat, or a camera bone on the equipped weapon.

3. Hide the body (optional)

Tick Hide Owner Mesh While Active and the mode hides the pawn's mesh from the owning player when it activates, restoring it on deactivation. It is owner-only - every other client still sees the body, so this costs you nothing in multiplayer.

It restores what it found
Activation remembers the mesh's authored bOwnerNoSee and deactivation puts that value back, so a project that already hides the body is not un-hidden when the player leaves first person. Leave the option off if you manage a separate first-person arms mesh yourself - the camera has no business touching your rendering in that case.

4. Body rotation is already handled

Nothing to configure. This mode ships with Declared Pawn Facing (in the Facing category) already set to FaceControlRotation, so the body turns with the view and strafing steps sideways instead of rotating the pawn. It is the only shipped mode that declares a facing - there is no first-person game where the body should orient to its velocity independently of the view, so leaving it as 'no opinion' would only look right when the project default happened to agree.

How this interacts with your project default
Every other shipped mode declares Unchanged, so CrimsonCamera writes no movement flag until you opt in. The moment any source has an opinion, UCrimsonCameraComponent becomes the sole owner of bUseControllerRotationYaw / bOrientRotationToMovement / bUseControllerDesiredRotation - which means ticking bUseControllerRotationYaw on your Character Blueprint will not work, the component overwrites it. A mode's declaration is priority 50 and UCrimsonCameraSettings::DefaultPawnFacing sits below it, so a project set to OrientToMovement still gets a correctly-turning body in first person and orient-to-movement everywhere else. Set this mode back to Unchanged if you want the project default to decide. See How-To: Face the Lock-On Target for the full resolution order.

5. Push it

Activate it like any mode - push it on BeginPlay for a first-person game, or push it as a tag-keyed override to drop into first person for a section (a scope, a ladder, a cutscene).

BeginPlay -> get the Crimson Camera Component -> Push Camera Mode (Camera Mode Class = your first-person mode, Owner Tag = e.g. Camera.Mode.FirstPerson).
Verify
Press Play - the view sits at eye height and mouse / right stick looks around normally. Switching back to a third-person mode restores the body if you enabled the mesh hide.
Switching perspective is always safe
The top-down and side-scroller modes declare bSyncControlRotation = false because they own their view rotation. The camera component resolves that flag from whichever mode is active every frame rather than latching it, so this mode's default of true takes effect the moment it is pushed - no mode ever has to undo another mode's choice.

See also

  • How-To: Switch Camera Modes - swap between first-person and third-person at runtime.
  • How-To: Face the Lock-On Target - the full pawn-facing resolution order.
  • Concept: The Mode Stack - how this mode blends in over its Blend Time.