HOME / 第 5 部分 · 3D 游戏开发 / 第 48 课
MODULE 5 · 3D 游戏开发
第 48 课 · 3D 相机 Camera3D
🎯 本课学习目标
- 添加并配置 Camera3D
- 理解视野(FOV)与裁剪面
- 实现相机跟随角色
相机决定玩家「看到什么」。本课掌握 3D 相机与跟随逻辑。
📖 详细教学步骤
添加 Camera3D搭建
- 3D 场景里添加子节点
Camera3D - 选中相机,主视图出现「相机预览」(一个小窗口)
- 调整相机位置/旋转,看到合适视角
- 点顶部「预览」按钮可全屏预览相机画面
相机常用属性属性
- Fov:视野角度(越大看到越广、边缘拉伸越明显),默认 75
- Near/Far:近/远裁剪面(太近太远都看不到)
- Current:是否是当前活跃相机(true 表示用它渲染画面)
- Environment:背景天空/雾(第 53 课)
相机跟随角色代码
最常用做法:相机作为角色的子节点(像戴在头上),或脚本跟随:
GDSCRIPTextends Camera3D
@export var target_path: NodePath
@onready var target: Node3D = get_node(target_path)
@export var offset: Vector3 = Vector3(0, 2, 5) # 在角色后上方
func _physics_process(delta):
if target:
# 平滑跟随(lerp 插值)
global_position = global_position.lerp(
target.global_position + offset, 5.0 * delta)
look_at(target.global_position, Vector3.UP)
第一人称 vs 第三人称概念
- 第一人称:相机放在角色「眼睛」位置(第 51 课)
- 第三人称:相机在角色后上方(本课示例)
- FPS 游戏用第一人称,动作/冒险常用第三人称
相机的 Current 切换实操
多个相机时切换当前相机:
GDSCRIPTfunc _ready():
# 相机 A 负责主视角,相机 B 负责小地图
camera_a.current = true
camera_b.current = false
func switch_to_b():
camera_a.current = false
camera_b.current = true
相机抖动与震动进阶
受击/爆炸时相机抖动(复用第 23 课思路):
GDSCRIPTfunc shake(intensity: float, duration: float = 0.2):
var tween = create_tween()
var base = global_position
for i in range(6):
tween.tween_property(self, "global_position",
base + Vector3(randf_range(-1,1), randf_range(-1,1), 0) * intensity, 0.03)
tween.tween_property(self, "global_position", base, 0.05)
⚠️
运行后画面是黑的?
相机可能没设置 Current(只认 Current=true 的相机)。或没加灯光。
⚠️
物体突然消失?
物体超出相机 Near/Far 裁剪范围。把 Far 调大(如 1000)或调整相机位置。
🧪 动手试一试
🏋️ 课后练习
做一个第三人称跟随:相机在角色后上方 (0,2,5),平滑跟随并 look_at 角色,爆炸时抖动。
global_position.lerp + look_at + shake tween。
💡
Fov 调小(50-60)适合竞速(少畸变),调大(80-100)适合 FPS 广角。
💡
相机是角色的子节点时,角色转身相机会跟着转,灵活安排。
🎓 本课小结
Camera3D 是画面来源,Current 决定活跃相机,Fov/Near/Far 控制视野;跟随用 lerp 平滑 + look_at;shake 做震动特效。