Files
XCEngine/docs/api/XCEngine/Components/CameraComponent/CameraComponent.md

4.2 KiB
Raw Blame History

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.0f
  • SetOrthographicSize() 会限制到 >= 0.001f
  • SetNearClipPlane() 会限制到 >= 0.001f
  • SetFarClipPlane() 会限制到 >= near + 0.001f

这些行为已被 tests/Components/test_camera_light_component.cpp 覆盖。

3. 相机选择规则由渲染场景提取器决定

当前 RenderSceneExtractor 的选择顺序是:

  1. 先用可用的 override camera
  2. 否则在所有可用主相机里挑 Depth 最大的那个
  3. 如果没有主相机,则退回到第一个可用相机

“可用”的定义还要求:

  • 组件存在
  • 组件已启用
  • 宿主 GameObject 存在
  • 宿主对象 IsActiveInHierarchy() == true

因此,IsPrimaryDepth 的价值并不是抽象概念,而是直接决定当前默认渲染相机选择。

与 Transform 的关系

CameraComponent 不保存自己的位置和朝向。渲染时使用的是宿主对象的 TransformComponent

  • 世界位置来自 camera.transform().GetPosition()
  • 视图矩阵来自 camera.transform().GetWorldToLocalMatrix()

这也是为什么把相机做成 GameObject 上的一个组件,比单独创建一个完全独立的相机对象更符合当前引擎设计。

序列化语义

当前会序列化以下字段:

  • projection
  • fov
  • orthoSize
  • near
  • far
  • depth
  • primary
  • clearColor

因此,CameraComponent 已经属于当前场景系统中“可完整保存和恢复的基础组件”。

线程语义

  • 当前实现没有内部加锁。
  • 应默认在主线程场景配置路径上读写。
  • 文档和代码都没有提供渲染线程并发修改 CameraComponent 的安全保证。

当前实现限制

  • 组件只描述相机参数,不负责 viewport、后处理、剔除掩码或多相机栈管理。
  • DepthIsPrimary 的消费点目前主要是 RenderSceneExtractor,能力范围仍然比较基础。
  • 没有看到额外的测试覆盖相机切换策略;这部分行为主要来自源码调用点分析。

相关方法

相关文档