From 1176c71f72f2281602e13b36f777e4f65d38f303 Mon Sep 17 00:00:00 2001 From: kdletters Date: Mon, 22 Jun 2026 20:49:51 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=8A=A8=E4=BD=9C=E7=B4=A0?= =?UTF-8?q?=E6=9D=90=E6=94=B9=E4=B8=BA=E5=BA=8F=E5=88=97=E5=B8=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将角色动作结果图层主类型改为 image-sequence,并持久化完整帧列表与预览视频来源 在画布中增加序列帧播放器,展示透明 PNG 帧而不是预览视频 将角色动作单素材下载和画布素材导出改为序列帧 ZIP/frames 目录 更新角色动作、导出方案和项目记忆文档,补齐相关前端测试 --- .../shared-memory/decision-log.md | 8 + docs/project-memory/shared-memory/pitfalls.md | 10 +- ...端架构】图片画布素材导出方案-2026-06-15.md | 13 +- ...辑器】画板角色形象生成入口设计-2026-06-15.md | 7 +- ...CanvasEditorGenerationIntegration.test.tsx | 576 ++++++++++-------- .../ImageCanvasEditorModel.test.ts | 27 +- .../image-editor/ImageCanvasEditorModel.ts | 63 +- .../image-editor/ImageCanvasEditorTypes.ts | 5 +- .../ImageCanvasExportModel.test.ts | 22 + .../image-editor/ImageCanvasExportModel.ts | 88 ++- .../ImageCanvasGenerationLayerModel.test.ts | 15 +- .../ImageCanvasGenerationLayerModel.ts | 6 +- .../ImageCanvasGenerationModel.test.ts | 6 +- .../ImageCanvasGenerationModel.ts | 13 +- .../ImageCanvasMetadataModalView.tsx | 2 + .../image-editor/ImageCanvasUploadModel.ts | 5 +- .../ImageCanvasWorldView.test.tsx | 54 ++ .../image-editor/ImageCanvasWorldView.tsx | 142 ++++- ...useImageCanvasAssetExportWorkflow.test.tsx | 126 +++- .../useImageCanvasAssetExportWorkflow.ts | 201 +++++- ...anvasGenerationSubmissionWorkflow.test.tsx | 17 +- src/index.css | 50 ++ 22 files changed, 1134 insertions(+), 322 deletions(-) diff --git a/docs/project-memory/shared-memory/decision-log.md b/docs/project-memory/shared-memory/decision-log.md index a139bf74e..07cbf2da2 100644 --- a/docs/project-memory/shared-memory/decision-log.md +++ b/docs/project-memory/shared-memory/decision-log.md @@ -16,6 +16,14 @@ --- +## 2026-06-22 图片画布角色动作主媒体改为透明序列帧 + +- 背景:角色动作生成后端已经在视频生成后抽取透明 PNG 帧并完成绿幕去背;画板继续把 `previewVideoPath` 当主媒体会让用户看到未扣绿幕视频,下载也拿不到可直接用于游戏素材的帧序列。 +- 决策:`/api/editor/character-animations/generations` 的上游预览视频继续保留为来源信息,但画板落层主类型固定为 `mediaType="image-sequence"`、`assetKind="character-animation"`;图层 `src` / `thumbnailSrc` 使用首帧,完整 `frames` 保存到 `imageSequenceFrames`,画布展示使用序列帧播放器循环播放。单图层下载生成序列帧 ZIP,画布素材 ZIP 中角色动作写入 `sequences/<编号-标题>/frames/`,不再把预览视频作为角色动作下载产物。 +- 影响范围:图片画布角色动作生成、画布图层快照、序列帧播放器、素材导出、角色动作设计文档和排障记忆。 +- 验证方式:运行角色动作图层工厂、画布展示、画布持久化、生成提交和素材导出相关前端测试,执行 `npm run typecheck`、`npm run check:encoding` 和 `git diff --check`。 +- 关联文档:`docs/【编辑器】画板角色形象生成入口设计-2026-06-15.md`。 + ## 2026-06-21 图片画布生成完成态由后端写入画布布局 - 背景:图片画布角色形象等长耗时生成在服务端完成后,如果浏览器已刷新或原 HTTP 回调丢失,前端无法再把生成结果图层和 `generation-dialog` 完成态写回 `editor_canvas.layers_json`,用户会继续看到“生成中”卡片。 diff --git a/docs/project-memory/shared-memory/pitfalls.md b/docs/project-memory/shared-memory/pitfalls.md index b525f9585..38ac37a1c 100644 --- a/docs/project-memory/shared-memory/pitfalls.md +++ b/docs/project-memory/shared-memory/pitfalls.md @@ -23,12 +23,12 @@ - 验证:运行 `npm run check:production-ops`、`npm run check:production-api-release` 和 `npm run check:production-api-deploy`,确认构建包、Jenkins 归档链路和 deploy fail-fast 检查口径一致。 - 关联:`jenkins/Jenkinsfile.production-api-build`、`jenkins/Jenkinsfile.production-api-deploy`、`scripts/deploy/production-api-deploy.sh`、`scripts/check-production-ops-guardrails.mjs`。 -## 图片画布角色动作结果不能把首帧当主媒体 +## 图片画布角色动作结果主类型是序列帧 -- 现象:画板里 `生成角色动作` 返回后显示成一张不可播放图片,点击下载或素材 ZIP 导出时拿到的也是 PNG,而不是动作视频。 -- 原因:后端已经生成 `previewVideoPath`,并继续执行抽帧、绿幕去背和帧素材 OSS 落盘;前端落层时却把 `frames[0].imageSrc` 当作图层主 `src`,且没有设置 `mediaType: "video"`,导致预览和导出都按图片处理。 -- 处理:角色动作结果图层主 `src` 必须使用 `previewVideoPath`,`mediaType` 固定为 `video`,`assetKind` 固定为 `character-animation`;首帧透明 PNG 只写入 `thumbnailSrc`,用于 `