• v0.2.4 ae8a68e98f

    zijunchiang released this 2026-09-16 04:02:35 +08:00 | 23 commits to main since this release

    OpenDance Studio -- Web 管理服务端 v0.2.4

    修复「导入 PMX 后模型显示为白模、脸部颜色丢失」。 契约与 v0.2.3 相同
    (rest-api / data-models / model-formats 0.4.0、database 0.3.0)。

    定位结论:GLB 数据没问题,问题在缩略图渲染器

    本地装真 Assimp 6.0.4 完整复现该模型(【奥黛塔】_by_原神.zip)后逐层核对:

    检查项 结论
    转换 正常: 23.7 MB GLB、643 骨骼、93,350 面、1.2 s
    贴图内嵌 18 张贴图与压缩包原图逐字节一致
    材质 -> 贴图对应 用权威 PMX 解析器比对, 39 个材质完全一致(不是映射错)
    UV 采样 正确: 脸部材质取到的就是皮肤色 (246,221,216)
    缩略图渲染器 它刻意不解码 baseColorTexture, 只用 baseColorFactor 上色; 而 MMD 模型的 baseColorFactor 基本都是白色 -> 缩略图必然全白

    管理端 3D 预览(three.js)本来就有贴图, 白模只出现在列表页与审核面板的缩略图。

    本次改动

    1. model-thumbnail.ts 内置极简 PNG 解码器(zlib inflate + 逐行反滤波, 8 位非隔行,
      colorType 0/2/3/4/6), 按 baseColorFactor x 贴图 逐像素采样(透视校正 UV);
      解码失败 / 非 PNG / 隔行扫描时回退纯色, 绝不抛错;
    2. 按 alphaMode 处理透明度: OPAQUE 忽略贴图 alpha(MMD 语义)、MASK 按
      alphaCutoff 丢弃、BLEND 做 source-over;
    3. 取景收紧(FRAMING 1.6 -> 1.3), 40px 列表缩略图主体更清楚;
    4. 新增 6 项测试(含"白模"回归: baseColorFactor 全白 + 红贴图必须输出偏红);
      测试规模 14 文件 / 211 项。

    关于"要不要默认转 VRM"

    不必, 也解决不了这个问题:VRM 就是 GLB + humanoid 元数据, 材质管线与 GLB
    完全相同(同样只有 baseColorTexture, 没有 MMD 的球面/卡通贴图槽位);
    而该模型 humanoid 映射为 0/22, 转 VRM 也会按设计回退交付 GLB。
    真正让贴图显示出来的是本次对渲染端的修复。这个模型本来也不用球面贴图
    (diffuse 全白、无 sphere), 所以核心 GLB 没有"丢贴图"。

    升级后请重新生成缩略图

    已有模型的缩略图是旧渲染器生成的, 升级后执行一次(v0.2.3 起服务端已带该脚本):

    cd /opt/opendance/web-server
    node scripts/reanalyze-models.mjs --url http://127.0.0.1:3000 --force
    

    只重算单个: --model-id 22; 先看清单: --dry-run。

    校验

    opendance-web-v0.2.4.tar.gz sha256: 138f31220afe5455cda187ca64c6b45624b35e4865eecf6af4d86e0f3284399c

    Downloads