CD Code Digest Hub /GTA V

摄像机、导演与视口

范围:camera/。总入口:Summary。

6 分钟阅读 7 个章节 1 张图

1. 三层控制结构#

摄像机模块将镜头计算、场景级选择和最终视口分开:具体 camera 产生镜头状态,director 选择或组合当前模式,camManager 协调各 director 并输出最终 frame,viewport 再将它用于绘制。camInterface 为其他游戏模块提供统一入口。

目录包含 gameplay、cinematic、scripted、cutscene、switch、syncedscene、animscene、replay、marketing 和 debug。这些不是同一个跟随相机的若干参数,而是不同控制来源,需要处理接管、混合和释放。

2. 数据关系#

camBaseDirector 保存基础 frame 和 post-effect frame,提供 Render/StopRendering、插值持续时间、是否锁定来源 frame、BaseUpdate、PostUpdate 和 frame shaker。镜头位置、混合与震动不全在同一个计算步骤内。

3. 多 Director 的混合不是简单选最高优先级#

camManager::UpdateInternal 遍历 director 并调用 BaseUpdate;对有贡献的 director,取其 interpolation blend level,将已有贡献乘以 1 - 新权重,再加入当前对象。对 camera 自身的插值来源链,也按 destination/source blend 分解贡献。

因此最终画面在过渡期间可能由多个 director、多个 camera 共同贡献。一个镜头“正在渲染”并不一定独占画面;当前 dominant camera 也不代表其他镜头权重为零。

实现最后移除已完全混出的对象,计算 dominant director/camera,更新 cut flags,然后更新 Ped 和 Vehicle visibility。镜头变化因此会反向影响角色和载具可见性,例如近距离/第一人称相关显示;相机不仅提供 view matrix。

遍历顺序影响组合结果。新增 director 时应检查 metadata 列表、创建顺序和 render state,而不是只增加一个相机类就假设它能正常接管。

4. 相机时间与目标生命周期#

camBaseDirector::GetTimeInMilliseconds 使用 fwTimer::GetCamTimeInMilliseconds,说明镜头有专门的时间访问语义。暂停、慢动作和过渡时,应查相机时间而不是任意套用普通游戏时间。

接口允许锁定 interpolation source frame,用于决定过渡源是固定快照还是继续变化。不同选择会影响载具快速移动、切换角色或过场退出时的轨迹,不能只用一个 lerp 公式表达所有情况。

管理器和相关类型使用注册引用维护 director/camera 身份。相机跟随实体被删除、切换角色或任务提前结束时,应同步更新引用和激活状态,避免仍向旧目标求解镜头。

5. 跟随、碰撞和第一人称#

gameplay 目录中的具体 camera/helper 负责跟随目标、输入、瞄准与模式差异,空间探测与 WorldProbe 协作。镜头碰撞通常需要考虑体积、目标遮挡和可接受距离;渲染 near clip 并不能替代镜头避障。

第一人称又涉及 Ped/Vehicle 可见性、骨骼或道具、瞄准来源和过渡闪光。过场模块甚至提供等待最新 gameplay camera 后才恢复玩家控制的选项,说明模式切换的正确性依赖跨模块更新顺序。

具体避障算法、阻尼和转向曲线因相机子类不同而不同;本报告基于 manager/director 核心实现,不将任一子类算法推为全模块统一策略。

6. 对开放世界的反馈#

CGame 在摄像机后推进 TimeCycle、世界后相机处理和最终 render phase 列表。CGameScan 还根据视图构造不同 streaming cull shape。因此切换镜头会改变视野、资源需求、LOD、局部视觉参数和可见性任务。

脚本飞跃到远处相机时,镜头数学可以立即完成,但世界资源未必已就绪。任务应与预加载/LoadScene 协调;仅延长插值时间不能保证模型和碰撞都加载完成。

7. 维护与源码依据#

诊断镜头异常应记录:激活 director、所有混合贡献、dominant camera、source frame 锁定方式、target entity、相机时间、collision 结果和最终 viewport。优先检查混合中再次切镜、目标删除、第一人称进出、过场跳过和回放跳转。本文未执行游戏镜头测试。

源码重点
CameraManager.hmanager、rendered objects 与 Update
CameraManager.cppmetadata 创建;371 行起混合及可见性更新
BaseDirector.hframe、插值、震动、时间与激活
BaseCamera.h具体 camera 基类
CamInterface.h游戏侧统一接口

关联:渲染、流式加载、过场。