# camera-manager **Repository Path**: Wazzup_1714252828/camera-manager ## Basic Information - **Project Name**: camera-manager - **Description**: camera-manager - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-11 - **Last Updated**: 2026-04-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Camera Manager 简易舞台原型 + **摄像机调度系统(Camera Manager)** 练习工程,需求来自面试实战题:数字键切换 5 路机位,含自由相机、三固定机位与始终 LookAt 角色的特写机位。 **详细需求、验收清单与易错点**(硬性规定含 5 号后台追踪):请阅读 **[docs/INTERVIEW_SPEC.md](docs/INTERVIEW_SPEC.md)**。 实现过程中的场景树与脚本约定:**[docs/IMPLEMENTATION_NOTES.md](docs/IMPLEMENTATION_NOTES.md)**(随开发补充)。 --- ## 提交与审查(题目要求对照) 与面试题「提交与审查方式」一致,提交前请自检下面三块。 ### 1. 交付物 - **二选一**:**源代码仓库链接**(GitHub / Gitee)**或** **完整工程压缩包**(zip 等)。 - 打包时请包含 **`project.godot`**、**`main.tscn`**、全部 **`*.gd`** 与 **`docs/`**,勿漏 `.godot` 以外的资源。 - **本仓库(Gitee)**:[https://gitee.com/Wazzup_1714252828/camera-manager](https://gitee.com/Wazzup_1714252828/camera-manager)(`git clone https://gitee.com/Wazzup_1714252828/camera-manager.git`) ### 2. README / Quick Start(必须项核对) | 题目要求 | 本文档位置 | |----------|------------| | 傻瓜式、非技术也能跑通 | 下文 **Quick Start** | | 引擎及**具体版本号** | **Godot 4.6**(见 Quick Start 第 1 步与「工程信息」表) | | 如何打开工程 | Quick Start 第 2 步 | | **入口场景**路径 | **`res://main.tscn`**(Quick Start 第 3 步) | | **完整按键说明** | **操作说明**表格 | | **架构说明**(便于 Code Review) | **架构说明(Code Review)** | ### 3. 现场演示与 Code Review(准备清单) 线上面试时需**本机运行并屏幕共享**,建议演示前按顺序试一遍: 1. **F5 运行**,确认主场景为 `main.tscn`,画面为舞台 + 胶囊体角色。 2. **数字键 1~5** 切换机位:1 自由、2~4 固定、5 轨道 + 对准角色。 3. **硬性 §3.1**:在 **1~4** 号时观察几秒再按 **5**,确认 5 号**不会出现「切过去再扭头」**(逻辑 5 号在 `main.gd` 的 `_process` 里**每帧** `look_at`,与当前播出机位无关)。 4. **1 号**:WASD 水平移动,**Q 降 / E 升**,鼠标转动视角,Esc 释放鼠标。 5. (可选)在检查器中切换 **`smooth_blend_on_switch`**:关=硬切;开=1/5 跟逻辑机位插值;**切到 5 号当帧**仍会 **`copy` 一次** `CamOutput` 与逻辑 5 号,满足「立刻对准」再跟拍。 **可能被问到的实现点**:为何只有 **`CamOutput.current`**;状态模式如何减少 `_process` 里的分支;`PathFollow3D` 与 5 号 `look_at` 的分工;固定机位与 1/5 的混合策略。详见 `docs/INTERVIEW_SPEC.md` 与 `docs/IMPLEMENTATION_NOTES.md`。 --- ## Quick Start(傻瓜式运行) 1. **安装 Godot** - 下载与工程匹配的版本:**Godot 4.6**(与 `project.godot` 中 `config/features` 一致)。 - 本工程为 **GDScript**,下载 **Standard** 版即可(无需 .NET / C# 版)。 - 官网: 2. **打开工程** - 启动 Godot → **导入** → 选择本文件夹(包含 `project.godot` 的目录)→ 打开。 3. **运行游戏** - 菜单 **项目 → 项目设置 → 应用 → 运行** 中确认**主场景**为 **`res://main.tscn`**(与 `project.godot` 一致)。 - 按 **F5** 或点击编辑器右上角 **运行**。 4. **验证** - 对照 [docs/INTERVIEW_SPEC.md](docs/INTERVIEW_SPEC.md) 中的勾选清单逐项确认。 --- ## 操作说明(题目要求) > 本工程未配置 InputMap,直接读取物理键;详见 [docs/IMPLEMENTATION_NOTES.md](docs/IMPLEMENTATION_NOTES.md)。 | 输入 | 作用 | |------|------| | **1** | 切换到 **自由相机**(`Cam1_Free`);自动**捕获鼠标** | | **2** | 切换到 **固定机位** `Cam2_Fixed` | | **3** | 切换到 **固定机位** `Cam3_Fixed` | | **4** | 切换到 **固定机位** `Cam4_Fixed` | | **5** | 切换到 **特写 / LookAt** `Cam5_LookAt`(后台每帧对准角色;见 SPEC) | | **W A S D** | 仅 **1 号**生效:相对视角在 **水平面(XZ)** 上前后左右移动 | | **Q** | 仅 **1 号**生效:沿 **世界 Y** **下降** | | **E** | 仅 **1 号**生效:沿 **世界 Y** **上升** | | **鼠标移动** | 仅 **1 号**且**鼠标已捕获**时:偏航 / 俯仰(俯仰限制 ±80°) | | **Esc** | 仅 **1 号**时:**释放鼠标**(便于切出窗口) | | **鼠标左键** | 仅 **1 号**且鼠标已释放时:**再次捕获**,继续转视角 | 场上 **Actor**(胶囊体)由 `actor_figure8.gd` 驱动,在 XZ 平面走 **8 字轨迹**,便于观察 5 号追踪。 --- ## 工程信息 | 项 | 值 | |----|-----| | Godot | 4.6 | | 主场景 | `res://main.tscn` | | 渲染 | Forward Plus | | 物理(当前配置) | Jolt Physics | --- ## 架构说明(Code Review) - **`main.gd`**:唯一 **`CamOutput.current`**;每帧先对 **`Cam5_LookAt`** 做 **`look_at(Actor)`**,再调用当前 **`CameraRigState.process_frame`**。数字键触发 **`_switch_to`** → **`exit` / `enter`** 换状态;**切入 5 号**时在 **`enter` 之后立刻 `copy_camera_params(CamOutput, Cam5)` 一次**(满足题目「切到 5 立刻对准」),随后仍按状态里 **`smooth_blend_on_switch`** 跟拍。并 **`emit logical_camera_changed`**(示例里 `connect` 到打印;UI 可订阅)。 - **状态脚本**:`camera_rig_context.gd`、`camera_rig_state.gd`、`state_free_camera.gd`、`state_fixed_smooth_camera.gd`、`state_track_camera.gd`(PDF:**状态模式** + **信号**;GDScript 用基类多态代替 C# `interface`)。 - **平滑**:**`StateFixedSmoothCamera`**(逻辑 2~4)内 `interpolate_with`;**1 / 5** 在各自状态里按 **`smooth_blend_on_switch`** 选择插值或硬贴。检查器 **`camera_blend_speed`**、**`smooth_blend_on_switch`**。 - **`actor_figure8.gd`**:`Actor` 的 8 字轨迹。 - **未使用** Phantom Camera。 --- ## 许可证 如无单独声明,以仓库内 `LICENSE` 为准(若尚未添加,面试提交前请自行补充)。