Quick answer: If your Camera3D is not a child of the player node, it will not automatically follow. Either make the camera a child of the player CharacterBody3D, use a RemoteTransform3D node, or write a script that updates the camera position in _physics_process.
Here is how to fix Godot Camera3D not following player. You set up a Camera3D in your Godot 4 scene, hit play, and the camera stays frozen at the origin while your player character walks off into the distance. The camera does not follow, does not rotate, and does not respond to player movement at all. This is one of the most common 3D setup mistakes in Godot, and there are three clean ways to fix it.
The Symptom
Your Camera3D renders the scene, but it stays at its initial position. The player moves normally, but the camera never updates to track the player. You may see the player walk out of frame entirely, or the camera may point at empty space. If you have multiple cameras, the wrong one might be active — but in most cases, the camera is simply not connected to the player's movement in any way.
What Causes This
Unlike some engines, Godot does not have a built-in "follow target" property on Camera3D. If your camera is a sibling node rather than a child of the player, it will not automatically follow. Common causes include:
- Camera is in the scene root — It sits at its initial position and never moves because nothing tells it to.
- Camera was reparented incorrectly — You moved it in the editor but the scene tree does not reflect the parent-child relationship you intended.
- Follow script updates in _process instead of _physics_process — If your character moves in
_physics_processbut your camera follows in_process, the camera may jitter or lag behind by a frame. - Camera script has an error — A null reference to the player node prevents the follow logic from running at all.
Fix 1: Make Camera3D a Child of the Player
The simplest approach is to drag the Camera3D node in the scene tree so it becomes a child of your CharacterBody3D (or whatever node represents your player). Set the camera's local position to your desired offset, such as (0, 5, 8) for a third-person view looking down.
# Scene tree structure:
# CharacterBody3D (Player)
# ├── MeshInstance3D
# ├── CollisionShape3D
# └── Camera3D <-- child of player
# The camera inherits the player's transform automatically.
# Set its local position in the inspector:
# Position: (0, 5, 8)
# Rotation: (-25, 0, 0) (angled down toward player)
This is instant and requires zero code. The camera moves and rotates with the player. The downside is that the camera also rotates when the player rotates, which may feel disorienting for some game styles.
Fix 2: Use RemoteTransform3D
If you want the camera to follow the player's position but not its rotation, use a RemoteTransform3D node. Add it as a child of the player, then point its Remote Path to the Camera3D in the scene root.
# Scene tree:
# Root
# ├── CharacterBody3D (Player)
# │ ├── MeshInstance3D
# │ ├── CollisionShape3D
# │ └── RemoteTransform3D (remote_path = ../Camera3D)
# └── Camera3D
# On RemoteTransform3D, configure:
# Update Position = true
# Update Rotation = false <-- camera won't spin with player
# Update Scale = false
Fix 3: Script-Based Smooth Follow
For the most control, attach a script to your Camera3D that smoothly interpolates toward the player each frame.
extends Camera3D
@export var target: Node3D
@export var offset := Vector3(0, 5, 8)
@export var smooth_speed := 5.0
func _physics_process(delta):
if target == null:
return
var desired_pos = target.global_position + offset
global_position = global_position.lerp(desired_pos, smooth_speed * delta)
look_at(target.global_position, Vector3.UP)
Set the target export variable in the inspector by dragging your player node into it. The smooth_speed value controls how quickly the camera catches up — higher values make it snappier, lower values add a cinematic lag.
"The camera is the player's window into your world. If it jitters, stutters, or does not follow, everything else you built feels broken."
Common Pitfalls
Using _process instead of _physics_process causes visible jitter when the character moves in physics frames but the camera updates in render frames. Always match your camera update function to your character movement function.
Forgetting to set the camera as Current means Godot uses the default viewport camera instead. Select your Camera3D and enable Current in the inspector, or call make_current() in your script.
Related Issues
If your 2D camera jitters, the cause is similar but the fix is slightly different. See Fix: Camera2D Jittering When Following Player.
If your camera follows correctly but physics objects jitter, check Fix: Godot _process vs _physics_process Jitter.
Child node, RemoteTransform, or lerp script. Three paths to a working camera.