更新 README:视频导出 MP4 快速路径与动作模块说明

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
LXX
2026-09-09 10:04:18 +08:00
parent 59e68e444a
commit db194aeb27

View File

@@ -13,8 +13,10 @@
- 机位拍摄、截图记录和基础镜头管理
- 视口比例框、九宫格、平移 / 旋转 / 缩放控制
- **关键帧动画**:物体位移 / 旋转 / 缩放 + 镜头运镜(机位、注视点、视野 FOV)关键帧,旋转使用四元数 slerp 保证平滑过渡
- **时间轴**:播放 / 暂停、指针拖动逐帧预览、时长调整、打帧 / 删除 / 清空
- **视频导出**:上帝视角或机位视角,把整段动画录制成 WebM 视频
- **时间轴**:播放 / 暂停、指针拖动逐帧预览、时长调整、打帧 / 删除 / 清空;面板高度可拖动调整(顶部手柄),关键帧轨道在面板内滚动
- **基础动作**:角色内置走路 / 跑步循环动作(真实步态曲线、左右对侧摆臂、跑步独立步频与屈膝曲线),支持速度 / 幅度调节与群体相位错开;动作之上可按关节叠加姿势偏移微调
- **姿势调节**:两级折叠分组(核心 / 左右臂 / 左右腿),20 种姿势预设一键应用
- **视频导出**:上帝视角或机位视角,WebCodecs 逐帧快速导出 MP4(固定分辨率、不随视口布局变形,导出速度远快于实时)
- 本地场景与关键帧状态持久化
## 界面截图
@@ -25,7 +27,7 @@
机位视角下的关键帧运镜与时间轴 scrub 预览:
![演示](./video/director-desk--1785225572148-ezgif.com-video-to-gif-converter.gif)
![演示](./video/8ef398c0-2967-4ce1-880d-02ae0af85d78.gif)
## 技术栈
@@ -53,15 +55,18 @@ src
└─ styles # 全局样式
```
时间轴与视频导出相关的核心文件:
时间轴、动作与视频导出相关的核心文件:
- `editor/schema/timeline.ts` — 时间轴数据模型与纯函数(物体 / 相机关键帧的插值、增删改)
- `editor/runtime/playbackStore.ts` — 播放状态(播放中、指针、时长、录制模式)
- `editor/runtime/PlaybackFrameDriver.tsx` — `useFrame` 推进指针
- `editor/runtime/ActiveCameraPlaybackSync.tsx` — 机位视角下用运镜轨道覆盖渲染相机
- `editor/canvas/PlaybackTransformSync.tsx` — 按指针把物体 / 相机线框的插值结果覆盖到场景对象
- `editor/runtime/playbackTransforms.ts` — 按 playhead 把关键帧插值与运镜应用到场景(预览与导出共用)
- `editor/canvas/PlaybackTransformSync.tsx` — 每帧调用上述共享逻辑驱动预览
- `editor/runtime/mannequin/motion.ts` — 走路 / 跑步关节曲线(纯函数,含速度 / 幅度 / 群体相位)
- `editor/panels/TimelinePanel.tsx` — 时间轴 UI(播放控制、关键帧编辑、视频导出按钮)
- `editor/io/videoExport.ts` — MediaRecorder 录制 canvas → WebM
- `editor/io/videoExport.ts` — WebCodecs 逐帧渲染 + H.264 编码导出 MP4(MediaRecorder 实时录制作兜底)
- `editor/io/videoExportBridge.ts` — 把 R3F 渲染三件套(renderer / scene / camera)暴露给导出逻辑
## 本地开发
@@ -106,12 +111,14 @@ http://127.0.0.1:4173/
- 左侧用于搜索、选择、分组查看场景对象,并支持可见性 / 锁定 / 删除
- 中央视口用于摆放场景、切换变换模式、添加角色和机位、导入资源与截图
- 右侧属性面板会根据当前选中对象自动切换为场景 / 角色 / 模型 / 摄像机编辑面板;选中摄像机时可直接编辑 位置 / 注视坐标 / FOV
- **角色动作与姿势**:角色面板「动作」标签用单选按钮切换 无 / 闲置 / 走路 / 跑步,可调速度与幅度;「姿势」标签按两级分组(核心 / 左右臂 / 左右腿)微调各关节,动作开启时滑杆显示「动作当前值 + 偏移」
- **底部时间轴**:
- 选中对象或相机 → 用 gizmo 或右侧面板摆好状态 → 指针移到某时刻 → 点「在指针处打关键帧」
- 拖动指针可逐帧预览所有对象在该时刻的姿态
- 点关键帧方块可选中(变橙)以便更新 / 删除;方块右上角的 × 可直接删除单帧
- 「清空全部」一键清除所有关键帧(可撤销)
- 「导出视频·上帝视角 / 机位视角」录制整段动画为 WebM
- 顶部手柄可上下拖动调整面板高度(会记住);删除对象时其关键帧轨道一并清理
- 「导出视频·上帝视角 / 机位视角」逐帧快速导出整段动画为 MP4
## 快捷键
@@ -125,7 +132,9 @@ http://127.0.0.1:4173/
- **物体关键帧**:记录位移 / 旋转 / 缩放,位移与缩放帧间线性插值,旋转使用四元数球面插值(slerp),确保转身等动作沿最短路径平滑过渡。
- **镜头运镜关键帧**:记录机位位置、注视点 target、视野 FOV;仅 `manual`(手动坐标)相机支持打运镜关键帧,锁定物体的相机(`targetMode = object`)不支持。
- **编辑与预览**:暂停态下用 gizmo 或右侧属性面板编辑对象(被拖对象不会被回放覆盖);拖指针 scrub 实时预览各时刻姿态(机位视角下镜头同步跟随);点播放看连续动画。
- **视频导出**:基于浏览器 `MediaRecorder` 录制 canvas 画面,优先 MP4(Chrome 120+ / Safari),不支持时回退 WebM(Chrome / Firefox)。导出范围 = 时间轴时长,从 0 播放到末尾自动下载。当前为 MVP:无音频、分辨率随画布尺寸。
- **视频导出(WebCodecs 快速路径)**:不实时录屏,而是按 30fps 逐帧推进时间轴离线渲染并编码为 H.264 MP4——导出 10 秒动画约 1~3 秒完成,逐帧时间精确、结尾不丢帧。导出分辨率固定(按画幅比例、短边 720),不随视口布局(如时间轴拖高)变形;导出完自动恢复视角与指针。
- **视频导出(兜底路径)**:浏览器不支持 WebCodecs 时回退 `MediaRecorder` 实时录制(优先 MP4,其次 WebM),耗时 = 视频时长。
- **动作与姿势分层**:基础动作(走路 / 跑步)为关节基础层,姿势滑杆写入的是叠加偏移;切换动作时姿势自动重置为站立基础态,删除对象时其时间轴轨道一并清理。
## 数据与嵌入
@@ -178,7 +187,7 @@ npm test
- `npm run build` 可通过
- 构建阶段会出现少量 Vite 警告:部分模型库缩略图 URL 会保留到运行时解析,同时主包体积超过默认 chunk 警告阈值
- `npm test` 新增了关键帧动画与视频导出相关用例(时间轴插值、播放状态与录制模式、store 关键帧 actions、时间轴面板交互等);剩余 `8` 个既有失败用例(模型库面板、视口画幅/轴向命中区、个别姿势预设、样式断言)保持不变,未引入回归
- `npm test` 含时间轴插值、动作步态曲线、视频导出、姿势 / 动作面板交互等用例(397 个);剩余 `8` 个既有失败用例(模型库面板、视口画幅 / 轴向命中区、坐标输入拖柄、取景器缩放、个别姿势预设)保持不变,未引入回归
## 开源说明