Camera3D
2026/4/14大约 6 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — Camera3D
Camera3D
节点继承关系
继承自 Node3D
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Position | 本地位置(X / Y / Z) |
| 属性 | GlobalPosition | 全局位置 |
| 属性 | Rotation | 旋转角度(欧拉角,弧度) |
| 属性 | Scale | 缩放比例 |
| 属性 | TopLevel | 是否脱离父节点的变换 |
| 方法 | LookAt() | 朝向目标点 |
| 方法 | ToGlobal() | 本地坐标转全局坐标 |
| 方法 | ToLocal() | 全局坐标转本地坐标 |
| 方法 | RotateX/Y/Z() | 绕指定轴旋转 |
继承自 Node
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Name | 节点名称 |
| 属性 | ProcessMode | 处理模式(始终 / 暂停时 / 仅编辑器) |
| 属性 | ProcessPriority | 处理优先级,数字越小越先执行 |
| 信号 | ready | 节点进入场景树并准备就绪 |
| 信号 | tree_entered | 节点进入场景树 |
| 信号 | tree_exited | 节点完全离开场景树 |
| 方法 | GetNode<T>() | 按路径获取子节点 |
| 方法 | AddChild() | 添加子节点 |
| 方法 | RemoveChild() | 移除子节点 |
| 方法 | QueueFree() | 帧结束后释放节点 |
| 方法 | GetParent() | 获取父节点 |
定义
3D 摄像机,决定玩家在 3D 游戏中从什么角度、以什么方式看到 3D 场景。
Camera3D 像一台真正的电影摄影机。你可以选择用"普通镜头"(透视投影,近大远小)还是"特殊镜头"(正交投影,远近一样大)。你还能调节镜头的视野范围(FOV),就像调节相机的焦距。
使用频率:★★★★ 维度专用常用——几乎每个 3D 游戏都会用到。
节点用途
- 为 3D 场景提供观察视角
- 支持透视投影(近大远小,真实感)和正交投影(远近一样大,适合策略游戏)
- 跟随角色移动,实现第三人称/第一人称视角
- 控制视野范围(FOV),调节画面宽广度
- 设置近远裁剪面,控制渲染范围
使用场景
典型场景
- FPS 第一人称射击:摄像机放在角色头部,透视投影,FOV 70~90
- 第三人称 RPG:摄像机跟在角色身后,透视投影,FOV 60~75
- RTS 即时战略:俯视全局,正交投影,用
size控制视野 - 小地图/俯视视角:切换为正交投影
不适用场景
- 2D 游戏中观察画面 → 使用 Camera2D
常用节点搭配
| 搭配节点 | 用途 | 必需? |
|---|---|---|
| SpringArm3D | 弹簧臂,实现第三人称摄像机跟随,避免穿墙 | 推荐 |
| CharacterBody3D | 玩家角色,摄像机跟随其移动 | 推荐 |
| WorldEnvironment | 全局环境设置(天空、雾气),配合摄像机观察效果 | 推荐 |
典型节点树(第三人称):
Player (CharacterBody3D)
├── SpringArm3D
│ └── Camera3D ← 挂在弹簧臂下面,自动跟随并避免穿墙
├── MeshInstance3D
└── CollisionShape3D典型节点树(第一人称):
Player (CharacterBody3D)
├── Camera3D ← 直接放在角色头部
└── CollisionShape3D生效必备素材/资源
| 资源 | 类型 | 说明 |
|---|---|---|
| Environment 资源 | Environment | 赋给 WorldEnvironment 节点,设置天空盒、雾气等环境效果 |
节点属性与信号
投影模式
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
projection | 枚举 | Perspective | — | 投影模式。Perspective(透视,近大远小)或 Orthogonal(正交,远近一样大) |
fov | float | 75.0 | — | 透视模式下的视野角度(度数)。越大看得越广,类似鱼眼;越小看得越窄,类似望远镜 |
size | float | 1.0 | — | 正交模式下的视野大小。数值越大看到的范围越大 |
keep_aspect | 枚举 | KeepHeight | — | 宽高比保持方式。是保持高度不变还是宽度不变 |
裁剪面
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
near | float | 0.05 | — | 近裁剪面。比这个距离更近的东西不会被渲染 |
far | float | 4000.0 | — | 远裁剪面。比这个距离更远的东西不会被渲染 |
激活控制
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
current | bool | false | — | 是否是当前激活的摄像机。一个场景里只能有一个 current 摄像机 |
cull_mask | int | 1048575 | — | 可见层掩码,控制摄像机能看到哪些层上的物体 |
环境与特效
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
environment | Environment | null | — | 覆盖全局环境设置(天空、雾气、色调映射等) |
信号
| 信号 | 触发时机 | 继承自 | 说明 |
|---|---|---|---|
| 无自有信号 | — | — | Camera3D 自身不发出信号 |
两种投影模式对比
| 特性 | 透视投影(Perspective) | 正交投影(Orthogonal) |
|---|---|---|
| 近大远小 | 有 | 没有,远近一样大 |
| 典型用途 | FPS、RPG、动作游戏 | 策略游戏、城市模拟、2.5D |
| 调节视野 | FOV(角度) | Size(范围) |
| 视觉效果 | 更真实、更有纵深感 | 更像平面图、更清晰 |
常用方法
| 方法 | 返回值 | 说明 |
|---|---|---|
LookAt(target, up) | void | 让摄像机看向目标位置 |
GetCameraTransform() | Transform3D | 获取摄像机的变换矩阵 |
GetCameraProjection() | Projection | 获取摄像机的投影矩阵 |
GetCameraRid() | RID | 获取摄像机内部渲染资源 ID |
IsPositionBehind(position) | bool | 判断一个世界坐标是否在摄像机后面 |
ProjectPosition(screenPoint, depth) | Vector3 | 将屏幕坐标投影到 3D 空间 |
UnprojectPosition(worldPoint) | Vector3 | 将 3D 世界坐标转换为屏幕坐标 |
MakeCurrent() | void | 将此摄像机设为当前激活的摄像机 |
GetFrustum() | Plane[] | 获取视锥体的 6 个裁剪平面 |
SetCullMaskValue(mask) | void | 设置可见层掩码的值 |
代码示例
C
using Godot;
public partial class GameCamera : Camera3D
{
[Export] public NodePath TargetPath;
[Export] public float ExFollowSpeed = 5.0f;
[Export] public Vector3 ExFollowOffset = new(0, 5, 8);
private Node3D _target;
public override void _Ready()
{
// 设置为透视投影
Projection = ProjectionType.Perspective;
// 设置 FOV(视野角度)
// 75 是默认值,适合大多数游戏
// 60 适合偏写实的游戏,90+ 适合快节奏游戏
Fov = 75.0f;
// 设置近远裁剪面
Near = 0.1f;
Far = 1000.0f;
// 设为当前摄像机
Current = true;
// 获取跟随目标
if (TargetPath != null)
{
_target = GetNode<Node3D>(TargetPath);
}
}
public override void _Process(double delta)
{
if (_target == null) return;
// 平滑跟随目标位置 + 偏移
var targetPos = _target.GlobalPosition + ExFollowOffset;
GlobalPosition = GlobalPosition.Lerp(targetPos, (float)(ExFollowSpeed * delta));
// 始终看向目标
LookAt(_target.GlobalPosition, Vector3.Up);
}
// 切换为正交投影(比如小地图)
public void SwitchToOrthogonal()
{
Projection = ProjectionType.Orthogonal;
Size = 15.0f; // 正交视野范围
}
// 切换回透视投影
public void SwitchToPerspective()
{
Projection = ProjectionType.Perspective;
Fov = 75.0f;
}
}GDScript
extends Camera3D
@export var target_path: NodePath
@export var follow_speed: float = 5.0
@export var follow_offset: Vector3 = Vector3(0, 5, 8)
var _target: Node3D
func _ready():
# 设置为透视投影
projection = Camera3D.PROJECTION_PERSPECTIVE
# 设置 FOV(视野角度)
# 75 是默认值,适合大多数游戏
# 60 适合偏写实的游戏,90+ 适合快节奏游戏
fov = 75.0
# 设置近远裁剪面
near = 0.1
far = 1000.0
# 设为当前摄像机
current = true
# 获取跟随目标
if target_path:
_target = get_node(target_path)
func _process(delta):
if _target == null:
return
# 平滑跟随目标位置 + 偏移
var target_pos = _target.global_position + follow_offset
global_position = global_position.lerp(target_pos, follow_speed * delta)
# 始终看向目标
look_at(_target.global_position, Vector3.UP)
# 切换为正交投影(比如小地图)
func switch_to_orthogonal():
projection = Camera3D.PROJECTION_ORTHOGONAL
size = 15.0 # 正交视野范围
# 切换回透视投影
func switch_to_perspective():
projection = Camera3D.PROJECTION_PERSPECTIVE
fov = 75.0注意
一个场景中只能有一个 Camera3D 的 current 属性为 true。如果你同时启用多个摄像机,只有最后一个被设为 current 的会生效。做摄像机切换时,记得先把旧的设为 false,再设新的为 true。
