需求 1:系统确定以 GLB / VRM 为模型主力格式
- 服务端新增支持库:
- model-inspector.ts:解析 GLB/VRM 的面数、顶点、材质、贴图、形变目标、
**骨骼树(名称/层级/是否蒙皮/humanoid 映射/子节点数)**、humanoid 覆盖率与可驱动性
- model-thumbnail.ts:**纯 TS 软件光栅化**(z-buffer + Lambert + 完整蒙皮矩阵)
生成 512×512 PNG 缩略图,零原生依赖、不装 headless-gl
- vrm-writer.ts:GLB → VRM 1.0(写入 VRMC_vrm 扩展与 humanoid 映射)
- gltf-packer.ts:glTF(.gltf + .bin + 贴图)→ 单文件 GLB
- humanoid 候选表与 Godot 客户端 humanoid_map.gd **逐字对齐**,并有单测断言两边一致
(服务端判定的"可驱动" = 客户端实际能否驱动)
需求 2:模型管理
- .glb / .vrm / .gltf **直接导入**(不重编码,GLB 含 VRM 扩展会自动识别为 VRM)
- .pmx / .fbx 服务端转换:assimp → .glb →(失败)→ .gltf 后自行打包成 GLB
→(MODEL_CONVERT_FORMAT=vrm 时)补 VRMC_vrm 产出 VRM 1.0;每步 assimp info 回读校验
- .zip **自动搜索包内可用模型**:.vrm → .glb → .gltf(直接导入)优先,
其次 .pmx → .fbx(转换);同优先级内按"指名字 → 目录最浅 → 文件最大"
- 入库后自动分析(models.stats)与生成缩略图(models.thumbnail_asset_id),
失败均不阻断入库;管理端列表显示小缩略图、预览放开到 vrm/glb/gltf
需求 3:审核功能
- 上传的模型状态**一律 pending**(不再自动发布、不再自动设默认)
- 审核界面新增模型面板:体积、面数、顶点、材质、贴图、骨骼、形变目标等指标,
humanoid 覆盖进度、可驱动性结论(缺哪些必需骨骼)、warnings,以及
**骨骼详细预览**(层级缩进、蒙皮/Humanoid 徽章、子节点数、搜索保留祖先链、
仅看蒙皮、限高滚动 + 只渲染前 400 行)
- 审核通过可带 setPrimary=true 一并设为默认模型(此时才写源码种子);
POST /api/models/:id/primary 仅允许 published(否则 409)
- scripts/import-default-model.mjs 改为"上传 → 审核通过 + 设默认"流程
其它:
- models 新增 stats 列(迁移 AddModelStats1789460000000,已在真实库执行)
- 契约升至 rest-api/data-models/model-formats 0.4.0、database 0.3.0(另两库已同步)
- 版本号 0.1.0 → 0.2.0(package.json ×2 + lockfile + project.yaml)
- 文档:README.txt / DSH.md / project.yaml / tasks 005·007·010 全面更新;
顶层开发书更新为 v1.4
验证:168 项单测通过(10 文件);契约 6 项与 29 条路由一致;typecheck/build 通过;
真实端到端:MMD 压缩包 → GLB + 分析(面数 9071/骨骼 238/humanoid 0-22) + 缩略图(15KB PNG);
GLB 直接导入 sha256 与源文件一致;审核通过后 defaultModelId 由 VRM 变为该模型
73 lines
2.7 KiB
YAML
73 lines
2.7 KiB
YAML
project: opendance-web-server
|
||
version: 0.2.0
|
||
repository: opendance-web
|
||
default_branch: main
|
||
contracts_version: 0.4.0
|
||
|
||
# 契约变更流程(文档 §7.2):
|
||
# 任何跨端契约变更必须先在本项目修改 contracts/ 并提升版本,
|
||
# 再在 opendance-windows / opendance-android 创建适配任务。
|
||
|
||
database:
|
||
# 使用现有实例,本项目不部署、不管理 MySQL
|
||
managed_by: external
|
||
engine: MySQL 兼容(当前部署为 MariaDB 10.11.19)
|
||
name: dpendance
|
||
charset: utf8mb4
|
||
migrations: TypeORM migration
|
||
synchronize: forbidden
|
||
|
||
tasks:
|
||
- id: T-WEB-001
|
||
file: tasks/001-scaffold.md
|
||
scope: NestJS 骨架 + 连接现有 MySQL
|
||
status: done
|
||
- id: T-WEB-002
|
||
file: tasks/002-db-migration.md
|
||
scope: TypeORM 迁移生成 opendance 表结构
|
||
status: done
|
||
- id: T-WEB-003
|
||
file: tasks/003-song-crud.md
|
||
scope: /api/songs CRUD
|
||
status: done
|
||
- id: T-WEB-004
|
||
file: tasks/004-motion-upload.md
|
||
scope: 动作数据上传(BVH / VMD / FBX / glTF / keypoints)+ 来源字段
|
||
status: done
|
||
- id: T-WEB-005
|
||
file: tasks/005-model-upload.md
|
||
scope: 模型上传(GLB/VRM 直接导入 + PMX/FBX 转换 + .zip 自动搜索)+ 自动分析/缩略图 + 上传即待审
|
||
status: done
|
||
- id: T-WEB-006
|
||
file: tasks/006-keypoint-preprocess.md
|
||
scope: BVH / VMD / FBX → 关键点序列预处理
|
||
status: done
|
||
- id: T-WEB-007
|
||
file: tasks/007-upload-review.md
|
||
scope: 上传审核流程
|
||
status: done
|
||
- id: T-WEB-008
|
||
file: tasks/008-admin-ui-songs.md
|
||
scope: 歌曲管理界面
|
||
status: done
|
||
- id: T-WEB-009
|
||
file: tasks/009-admin-ui-models.md
|
||
scope: 模型管理界面 + 来源展示
|
||
status: done
|
||
- id: T-WEB-010
|
||
file: tasks/010-deploy.md
|
||
scope: 部署脚本(双端口:软件 API 3000 + 管理端 3001,不部署 MySQL)+ deploy/.env 初始化引导(init-env.sh,HOST 默认 0.0.0.0)
|
||
status: done
|
||
|
||
deliverable:
|
||
artifact: opendance-web-v0.2.0.tar.gz
|
||
packaging: Linux 业务服务(系统服务托管,双端口:软件 API + 管理端,不含 MySQL、不含反向代理、不使用 Docker)
|
||
includes:
|
||
- web-server/ # NestJS 源码 + 构建产物(含 BVH / VMD 内置解析、ZIP 读取与模型压缩包转换)
|
||
- admin/ # React 管理端构建产物
|
||
- deploy/ # install.sh / init-env.sh / systemd / openrc / initd / ctl.sh / .env.example(PORT、ADMIN_PORT、HOST)
|
||
- deploy/proxy/ # 反向代理说明(nginx / IIS,仅供参考不部署)
|
||
- contracts/ # 当前版本契约快照(0.4.0)
|
||
- THIRD_PARTY.md # 开源声明
|
||
- README.txt # 使用说明
|