HOME / 第 5 部分 · 3D 游戏开发 / 第 48 课
MODULE 5 · 3D 游戏开发

第 48 课 · 3D 相机 Camera3D

⏱ 预计时长 30 分钟📊 难度 入门📚 模块 第 5 部分 · 3D 游戏开发

🎯 本课学习目标

相机决定玩家「看到什么」。本课掌握 3D 相机与跟随逻辑。

📖 详细教学步骤

添加 Camera3D搭建

  1. 3D 场景里添加子节点 Camera3D
  2. 选中相机,主视图出现「相机预览」(一个小窗口)
  3. 调整相机位置/旋转,看到合适视角
  4. 点顶部「预览」按钮可全屏预览相机画面

相机常用属性属性

  • 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 做震动特效。