继承标准Camera类封装相机控制,子类专注行为差异,父类提供矩阵计算等基础能力;通过重写方法、构造函数配置和业务逻辑封装实现高内聚低耦合。

直接用继承封装相机控制类,核心是让子类专注“行为差异”,父类统一“结构和基础能力”。不需要从零造轮子,而是站在成熟相机类基础上做增强。
选对父类:从标准 Camera 类派生
多数三维引擎都提供基 Camera 类(如 Three.js 的 PerspectiveCamera、CesiumJS 的 Camera、WPF 的 ProjectionCamera),它们已封装好矩阵计算、坐标系转换、视锥体逻辑等底层细节。你的封装不是绕开它,而是继承它——这样既能复用稳定能力,又能按需扩展。
- Three.js 中:class MyCamera extends THREE.PerspectiveCamera { ... }
- CesiumJS 中:class CesiumCamera extends Cesium.Camera { ... }(注意需配合 Viewer 或 Scene 使用)
- WPF 中:class OrbitCamera extends PerspectiveCamera { ... }(继承自 System.Windows.Media.Media3D.PerspectiveCamera)
在子类中集中处理“业务级”控制逻辑
父类管“怎么算”,你管“怎么用”。比如缩放中国区域、飞向某坐标、锁定模型旋转、适配移动端手势——这些都不是底层渲染必需的,但却是项目高频需求。把它们写成子类方法,调用时干净利落:
- zoomToChina():内部自动设置经纬度范围、高度、俯仰角,不暴露 viewMatrix 细节
- flyTo(position, options):封装 Cesium.Camera.flyTo 或 THREE.AnimationMixer 驱动的平滑移动
- lockOn(target):启用轨道控制(orbit control),并绑定 target 的 world matrix 更新
用构造函数接管初始化配置,屏蔽冗余参数
避免每次 new MyCamera() 还要传一堆 fov、aspect、near、far。把常用组合预设为选项对象,在子类构造中解析并调用父类构造器:
- 支持传入 { mode: 'street', height: 50 } 自动设为正交+低视角
- 传入 { mode: 'global', projection: 'geographic' } 则初始化为地理投影适配模式
- 内部仍调用 super(fov, aspect, near, far),只是参数由配置推导而来
重写关键方法,实现行为拦截与增强
继承不只是加功能,更是改行为。例如:
- 重写 updateProjectionMatrix():在父类计算完后,再叠加自定义畸变校正或 FOV 动态缩放
- 重写 getWorldDirection():返回归一化方向前,先应用当前镜头偏移或抖动效果
- 覆盖 onBeforeRender()(Three.js)或 viewMatrixChanged 事件(Cesium):注入性能监控或日志埋点
不复杂但容易忽略:继承封装的价值不在代码量减少,而在于把“谁该负责什么”划清楚——渲染引擎管数学,你管交互意图。

















