feat(canvas): 3D 导演台 - 补齐非 P0 分层交互与回归保护 (#333)

* feat(canvas): 3D 导演台 - 补齐分层交互与回归保护

* fix(canvas): 3D 导演台 - 过滤非法轨迹关键帧

* chore(canvas): 3D 导演台 - 对齐前端格式规范

* fix(canvas): 3D 导演台 - 保证故障重试入口可点击

* test(canvas): 3D 导演台 - 稳定真实点击验证
This commit is contained in:
echoD886
2026-08-27 20:47:10 +08:00
committed by GitHub
parent c76f378811
commit 0e33cc805e
34 changed files with 5049 additions and 141 deletions

View File

@@ -124,3 +124,90 @@ description: 影策已实现功能的手工验证清单与未确认边界
- [x] Outbox Worker 本地文件删除、对象不存在幂等成功和失败退避测试通过。
- [ ] 使用真实 OSS 配置验证对象删除成功、权限失败后的退避重试和多实例租约接管。
- [ ] 浏览器真实环境验证登录快照慢响应期间工作区保持不可写,以及删除后立即刷新不复活素材。
## 3D 导演台时间轴关键帧删除与快捷键
关键帧删除入口、全局快捷键和交互控件守卫已接入,以下场景仍需要在浏览器中由用户确认:
- [x] `web` TypeScript 检查、导演台专项测试与全量前端测试通过。
- [x] 关键帧删除覆盖对象 transform、对象骨骼和摄影机三类轨道;未命中时返回同一场景引用,不记历史、不产生修订。
- [x] 时间轴关键帧为可 Tab 聚焦的真实 button;点击或 Enter/Space 只选择并定位播放头,Delete/Backspace 或顶栏删除按钮才删除,避免普通点击误删。
- [x] 所选关键帧可切换保持、线性、平滑缓动;缓动同时作用于对象/摄影机 Transform 与骨骼旋转插值,旧数据默认线性。
- [x] 切换镜头/摄影机或外部删除关键帧后会清除陈旧选择,顶栏缓动和删除控件不会继续修改不可见轨道。
- [x] 全局快捷键在输入框、按钮、链接、role 型控件、可编辑区域及其子元素内一律不解析;仅在动作真正执行时 `preventDefault`。
- [x] 鼠标点选场景对象、dock 工具、模式按钮、快速添加和顶栏图标按钮后会释放焦点,全局快捷键立刻可用;键盘激活(Enter/Space)保留焦点,Tab 序列不断。
- [ ] 在真实画布中记录多个关键帧后逐个删除,确认删除的是目标帧、其余帧顺序不变,且「撤销」能恢复。
- [ ] 折叠对象轨道后仅通过汇总轨删除关键帧,确认收起状态下仍可删除。
- [ ] 用键盘 Tab 走到关键帧上按 Enter/Space,确认只选择并把播放头定位到该帧;再按 Delete,确认删除的是该关键帧而不是整个对象。
- [ ] 对同一段动画依次选择保持、线性、平滑缓动,确认播放结果明显不同,撤销可恢复上一个缓动设置。
- [ ] 选中摄影机关键帧后切换到使用另一台摄影机的镜头,确认旧选择和顶栏缓动/删除控件立即消失。
- [ ] 确认浅色/深色主题下关键帧的悬停环与焦点环可见,命中区易于点中。
- [ ] 逐个验证 W/E/R、Delete/Backspace、H、Escape、Ctrl/Cmd+Z、Ctrl/Cmd+Shift+Z、Ctrl/Cmd+Y 和空格;确认在标题输入框内输入这些字符不会触发快捷键。
- [ ] 在场景列表点选一个对象后直接按 Delete,确认删除的是该对象;再点 dock 的「旋转」后按 W,确认能切回移动。
- [ ] 用键盘 Tab 走到场景对象行按 Enter 选中,确认焦点仍停在该行、可继续 Tab 到下一项。
## 3D 导演台场景模板与四模式骨架
新建场景模板和摆场/姿态/动画/摄影机四个一级模式已接入,以下场景仍需要在浏览器中由用户确认:
- [x] `web` TypeScript 检查、导演台专项测试与全量前端测试通过。
- [x] 导演台 P0 Chrome E2E 全部通过;场景 A 已同步为「默认摆场不显示时间轴与 AutoKey,切到动画模式后 AutoKey 默认关闭」。
- [x] 五个模板结构确定、每次实例 id 独立、对象 XZ 占位两两不相交,判据与 `resolveDirectorPlacement` 一致。
- [x] 空场景不含任何演员;未知模板 id 回落到空场景。
- [x] 模板不改动 `DirectorScene` 结构与 `version`;`mode` 只存在于工作台 store,不写入场景。
- [x] 离开动画模式会停止播放并关闭 Auto Key,并把渲染视图夹回当前模式允许的集合。
- [x] 动画模式会根据 Transform 关键帧绘制可见演员与摄影机的空间轨迹,包含起终点、方向和当前播放进度;隐藏演员及零长度轨迹不显示。
- [x] 播放头按镜头 FPS 而非固定 60 次/秒更新,跨过镜头末尾时保留余量;轨迹长度只在对象/摄影机内容变化时重算。
- [x] 「按运镜生成轨迹」只更新首尾关键帧,保留手工中间帧、关键帧 ID 与 easing,并提示切到动画模式继续编辑。
- [x] 截图/录制绑定开始时的场景快照;上传完成后重新核验节点与镜头,并只把预览引用合入最新场景,不用旧快照覆盖并发编辑。
- [ ] 从工具栏和画布右键菜单分别新建镜头,确认都会先弹出模板选择,且右键位置会作为新节点位置。
- [ ] 逐个使用五个模板新建镜头,确认空场景没有演员,单人/双人/走位演员数量正确,产品镜头含产品主体、背景板和侧面道具且没有演员。
- [ ] 确认双人对话两名演员面对面、走位三名演员互不重叠、产品镜头道具不穿模。
- [ ] 打开一个已保存的镜头,确认不弹模板选择、场景内容未被改写。
- [ ] 在摆场模式确认时间轴、Auto Key、记录关键帧、骨骼与姿势预设、深度/法线视图都不可见。
- [ ] 在姿态模式选中演员,确认骨骼与姿势入口出现;未选中演员时不出现;确认不会自动产生关键帧。
- [ ] 在动画模式开启 Auto Key 并开始播放,再切到其他模式,确认播放停止、Auto Key 关闭,且场景没有被继续写入关键帧。
- [ ] 在动画模式为演员和摄影机分别记录至少两枚位置不同的 Transform 关键帧,确认轨迹、起终点、方向锥和当前进度点可见;隐藏演员后其轨迹同步消失,离开动画模式后全部轨迹消失。
- [ ] 在摄影机模式确认右栏固定显示镜头/摄影机检查器,对齐视图与运镜可用,深度/法线视图可选。
- [ ] 在摄影机已有关键帧且播放头不在 0 秒时执行「摄影机对齐当前视图」,确认当前帧立即保持新机位,旧关键帧仍在且撤销可恢复。
- [ ] 在摄影机已有首尾帧和至少一枚带缓动的手工中间帧时执行「按运镜生成轨迹」,确认只更新首尾位置,中间帧、缓动与撤销历史都保留。
- [ ] 开始截图或白膜录制后切换活动镜头、删除源节点或继续编辑场景,确认旧输出被拒绝或安全合并,不写进另一项目、不复活节点、不覆盖新编辑。
- [ ] 确认模式切换不丢失草稿、撤销历史和保存状态,切换后标题与保存指示器仍正确。
- [ ] 确认浅色/深色主题下模式按钮的选中态、悬停态与焦点环可见,选中态不是主操作色。
- [ ] 在窄窗口(小于 lg 断点)确认模式切换仍可见可点击。
用户确认上述场景后,再将对应条目移动到功能文档的已验证范围。
## 3D 导演台取景模式(3D/CAM/五个正交视图)
新增 `viewMode`(自由/机位/顶前后左右五个正交轴向)取景切换,独立于摆场/姿态/动画/摄影机四个一级模式;以下场景仍需要在浏览器中由用户确认:
- [x] `web` TypeScript 检查通过;`director-view-modes.test.ts`、`director-modes.test.ts`、`director-template-mode-wiring.test.ts` 专项测试通过。
- [x] 三台相机对象(自由观察、机位、正交)互相独立持有,切换 `viewMode` 只挪动视口的活动相机指针,源码层面确认不共享可变状态。
- [x] 正交轴向使用真正的 `THREE.OrthographicCamera`,取景来自场景内容包围盒,而非把透视相机换个角度伪装;取景解算与视口接线均有专项测试覆盖退化场景(空场景、非法数值)。
- [ ] 逐个切换 3D/CAM/顶视/前视/后视/左视/右视,确认画面确实是对应视角,正交视图没有透视畸变。
- [ ] 放入大比例背景板和旋转后的长道具,逐个切换正交视图,确认对象完整进入画面,不再因只按对象中心构图而裁切。
- [ ] 在自由视角环绕后切到机位或任一正交视图,再切回自由视角,确认之前的环绕位置原样恢复,没有被拉回默认机位。
- [ ] 在机位视图播放/拖动时间轴,确认摄影机运镜正确预览;切到正交视图确认环绕已锁定、拖拽无效。
- [ ] 确认取景切换器(3D/CAM/TOP/FRONT/BACK/LEFT/RIGHT 七个按钮)可键盘 Tab 到达、Enter/Space 激活,`aria-pressed` 状态正确朗读。
- [ ] 确认切换取景模式不产生新的撤销历史记录,也不触发保存/未保存提示。
- [ ] 在机位或正交视图下点击「导出预览图」「录制白膜视频」,确认导出流程仍正常完成(不因当前相机是正交投影而失败)。
- [ ] 确认浅色/深色主题下取景切换器的选中态、悬停态与焦点环可见。
- [ ] 在窄窗口(小于 lg 断点)确认取景切换器仍可见可点击,不与其他浮层重叠遮挡。
用户确认上述场景后,再将对应条目移动到功能文档的已验证范围。
## 3D 导演台首次引导与窄屏属性面板
首次引导已接入真实登录用户 scope,并按 Issue #305 改为“添加演员 → 移动 → 调姿 → 轨迹 → CAM → 应用”六步;以下场景仍需要浏览器确认:
- [x] 引导进度按认证用户 ID 隔离,不回落 guest;重启入口在加载期间也可用,重置失败会重新读取原进度。
- [x] 已跳过或已结束的引导可从标题栏重新开始;最后一步使用“结束引导”中性文案,不宣称用户已经完成实际任务。
- [x] 小于 `lg` 断点时右侧属性区移动到工作区下方且可滚动,不再直接隐藏姿势与骨骼控制。
- [x] `director-onboarding.test.ts` 专项测试与 `web` TypeScript 检查通过。
- [ ] 使用两个真实账号分别推进、跳过和重启引导,确认进度互不串号;切换账号时旧读取结果不会闪现。
- [ ] 从新账号首次打开导演台,逐步完成添加演员、移动、姿态、两枚 Transform 关键帧、CAM 构图与应用,确认六步文案都指向真实可见入口。
- [ ] 在引导加载期间连续点击“重新开始引导”,再模拟 IndexedDB 写入失败与恢复,确认界面不会永久隐藏或假装推进。
- [ ] 在窄窗口检查摆场、姿态、动画、摄影机四种模式:标题栏可横向到达,底部属性面板可滚动,时间轴与引导不互相遮挡。
用户确认上述场景后,再将对应条目移动到功能文档的已验证范围。