4.2 KiB
4.2 KiB
CameraComponent
命名空间: XCEngine::Components
类型: class
头文件: XCEngine/Components/CameraComponent.h
描述: 保存相机投影、裁剪面、深度和清屏颜色等参数,供渲染场景提取阶段构建真正的相机数据。
角色概述
CameraComponent 是当前渲染管线里的相机配置组件。它本身不持有 view/projection 矩阵,也不直接执行渲染;真正的消费方是 RenderSceneExtractor。
从职责上看,它更像 Unity 里“挂在对象上的 Camera 配置数据”,而不是一个自带完整渲染流程的重型对象。
当前实现行为
1. 这是一个纯数据组件
当前 public API 和 .cpp 实现只做三件事:
- 保存投影类型、FOV、正交尺寸、裁剪面、深度、主相机标记和清屏颜色
- 对关键数值做基础 clamp
- 提供
Serialize()/Deserialize()支持
组件自身没有 Update(),也没有直接向 GPU 或渲染线程提交命令的逻辑。
2. 数值约束是强制执行的
按 engine/src/Components/CameraComponent.cpp 当前实现:
SetFieldOfView()会把值限制到1.0f ~ 179.0fSetOrthographicSize()会限制到>= 0.001fSetNearClipPlane()会限制到>= 0.001fSetFarClipPlane()会限制到>= near + 0.001f
这些行为已被 tests/Components/test_camera_light_component.cpp 覆盖。
3. 相机选择规则由渲染场景提取器决定
当前 RenderSceneExtractor 的选择顺序是:
- 先用可用的 override camera
- 否则在所有可用主相机里挑
Depth最大的那个 - 如果没有主相机,则退回到第一个可用相机
“可用”的定义还要求:
- 组件存在
- 组件已启用
- 宿主
GameObject存在 - 宿主对象
IsActiveInHierarchy() == true
因此,IsPrimary 和 Depth 的价值并不是抽象概念,而是直接决定当前默认渲染相机选择。
与 Transform 的关系
CameraComponent 不保存自己的位置和朝向。渲染时使用的是宿主对象的 TransformComponent:
- 世界位置来自
camera.transform().GetPosition() - 视图矩阵来自
camera.transform().GetWorldToLocalMatrix()
这也是为什么把相机做成 GameObject 上的一个组件,比单独创建一个完全独立的相机对象更符合当前引擎设计。
序列化语义
当前会序列化以下字段:
projectionfovorthoSizenearfardepthprimaryclearColor
因此,CameraComponent 已经属于当前场景系统中“可完整保存和恢复的基础组件”。
线程语义
- 当前实现没有内部加锁。
- 应默认在主线程场景配置路径上读写。
- 文档和代码都没有提供渲染线程并发修改
CameraComponent的安全保证。
当前实现限制
- 组件只描述相机参数,不负责 viewport、后处理、剔除掩码或多相机栈管理。
Depth和IsPrimary的消费点目前主要是RenderSceneExtractor,能力范围仍然比较基础。- 没有看到额外的测试覆盖相机切换策略;这部分行为主要来自源码调用点分析。
相关方法
- GetProjectionType
- SetProjectionType
- GetFieldOfView
- SetFieldOfView
- GetOrthographicSize
- SetOrthographicSize
- GetNearClipPlane
- SetNearClipPlane
- GetFarClipPlane
- SetFarClipPlane
- GetDepth
- SetDepth
- IsPrimary
- SetPrimary
- GetClearColor
- SetClearColor
- Serialize
- Deserialize