Appearance
相机 VMD 动画
系统概览
VMD 相机动画模块(ADR-148 阶段 3 续拆,2026-07-26)。从 camera.ts 抽出 VMD 相机相关逻辑:加载 VMD 文件 → 创建 MmdCamera → 启动动画 → 清除(含 dispose 释放)。
核心职责
loadCameraVmd(mmdAnimation, vmdPath, vmdName)— 绑定已解析的MmdAnimation并切换到 vmd 模式(scene 从camera-state.getCameraScene()取,不经参数传入)clearCameraVmd()— 清除 VMD 相机(vmd 模式经注入回调切回 orbit,由switchCameraMode释放;否则本函数自行释放,详见「不变量」)animateCameraVmd(frameTime)— 按帧时间驱动 VMD 相机动画(每帧调用,非一次性启动)createVmdCamera()— 创建 MmdCamera 实例(Babylon + babylon-mmd 集成),scene 同样由camera-state提供hasCameraAnimationHandle()— 查询当前是否有 VMD 动画句柄(switchCameraMode 拒绝空 VMD 切换的前置检查)setSwitchCameraModeCallback(cb)— camera.ts 在initCameraSystem时注入switchCameraMode回调,破除循环依赖
与其他子系统关系
- 依赖
camera-state.ts(getCameraScene/getCameraMode/setCameraVmdState/clearCameraVmdState/getCameraVmdName/getCameraVmdPath) - 被
camera.ts调用(switchCameraMode在 case 'vmd' 分支调用createVmdCamera/hasCameraAnimationHandle) - 被
scene.ts/vmd-loader.ts/playback.ts间接调用(通过 camera.ts barrel re-export)
不变量
- VMD 相机使用 babylon-mmd 的 MmdCamera,独立于 orbit/freefly 行为轴
- 清除 VMD 时若当前模式为 vmd,通过注入的 switchCameraMode 回调切回 orbit(不能直接调用 camera.ts 的 switchCameraMode,否则循环依赖)
clearCameraVmd的 MmdCamera 释放二选一且互斥,任何一侧都不得重复 dispose:- vmd 模式(
getCameraMode() === 'vmd'且回调已注入)— 只调_switchModeCallback('orbit'),detachControl+removeCamera+dispose全部由switchCameraMode内部完成,本函数不得再释放第二次 - 非 vmd 模式(如 orbit 下预载 VMD 后清除,回调不会处理该相机)— 本函数手动
scene.removeCamera+dispose
- vmd 模式(
- 两条分支之后统一置空
_mmdCamera/_cameraAnimationHandle并调用clearCameraVmdState(),避免卸载泄漏