Appearance
相机骨骼锁定
系统概览
相机骨骼锁定模块(ADR-148 阶段 3 续拆,2026-07-26)。从 camera.ts 抽出 orbit 模式下的骨骼锁逻辑:相机 target 每帧跟随指定骨骼的世界坐标,常用于"眼部追踪"或"上半身跟随"。
核心职责
setOrbitBoneLock(enabled, boneName?)— 启用/禁用骨骼锁;启用时记录骨骼名 + 模型 ID,启动每帧跟随;禁用时清空状态 + 停止 observergetOrbitBoneLock()— 查询当前骨骼锁状态({ enabled, boneName?, modelId? })setBoneLockDamping(v)— 设置阻尼系数(控制相机跟随的平滑度)getBoneLockDamping()— 查询阻尼系数getFocusedModelBoneNames()— 获取当前聚焦模型的骨骼名列表(供 UI 下拉选择)stopBoneLock()— 临时停止骨骼锁(dispose observer + 恢复 panning / inertia,保留_boneLockEnabled状态供切回 orbit 时恢复)restoreBoneLockIfEnabled()— 切回 orbit 时由 camera.ts switchCameraMode 调用:若_boneLockEnabled仍为 true,重启每帧跟随 observer
与其他子系统关系
- 依赖
camera-state.ts(getCurrentCamera/getCameraScene/focusedModelIdvia@/core/config) - 依赖
@/core/observer-handle(observe注册每帧回调) - 依赖
model-ops.ts(通过modelRegistry查询模型骨骼) - 被
camera.ts调用(switchCameraMode离开 orbit 时调用stopBoneLock) - 被
motion-camera-levels.ts调用(UI 提供骨骼选择 + 开关)
不变量
- 骨骼锁仅在 orbit 模式下生效,切换到其他模式时
switchCameraMode显式调用stopBoneLock - 启用时保存并禁用
panningSensibility(设为 0 完全禁用平移)+ 关闭inertia(避免与每帧 target 跟随冲突),停止时恢复 - 每帧通过 bone absolute position 计算 target,
cam.setTarget()跟随;阻尼系数控制平滑度 - 骨骼锁状态(
_boneLockEnabled/_boneLockBoneName/_boneLockModelId)通过 camera-state.ts 不持有,保留在本模块作为运行时状态(不参与序列化)