-
released this
2026-09-16 18:55:25 +08:00 | 22 commits to main since this releaseOpenDance Studio -- Web 管理服务端 v0.2.5
MMD 材质/着色对齐: 修复 PMX 转换后"颜色/贴图看起来不对"。契约不变
(rest-api / data-models / model-formats 0.4.0、database 0.3.0)。诊断(本地真 Assimp 6.0.4 + 样本逐项核对)
PMX 的着色模型(卡通阶梯 + 球面贴图 + 平坦环境光)与 glTF PBR 不是一回事。
样本【奥黛塔】_by_原神.zip(39 个材质)核对结果:项目 结论 双面(不剔除背面) PMX 里 36 个材质有该标志; 导出的 GLB 里 doubleSided一个都没有 -> 头发/裙摆/睫毛这类薄片被单面剔除, 这是"贴图/颜色不对"的主因specular / shininess PMX 为 (0,0,0)/1.0; Assimp 写出KHR_materials_specular(黑色)与KHR_materials_volume等与 MMD 无关的扩展环境光 / toon MMD 的平坦环境光与 toon 阶梯在 glTF core 里没有对应项 球面贴图(SPH/SPA) 该模型 15 项; glTF core 无槽位 accessor.min/maxAssimp 写坏(实测 min = 2.2250738585072014e-308), Godot 用它算包围盒本次改动
- 新增
models/pmx-materials.ts: 只读 PMX 材质段(布局与权威库 mmd-parser 一致,
注意贴图索引宽度是 1 字节), 拿到 diffuse / specular / shininess / ambient /
drawFlag / 球面贴图 / toon / faceCount; - 新增
models/glb-materials.ts: 转换后按索引把 PMX 参数补回 GLB ——
doubleSided(按 drawFlag bit0)、metallicFactor=0、
roughnessFactor=clamp(1-shininess/100, 0.5, 1)、baseColorFactor x diffuse(含 alpha);
清掉KHR_materials_specular/volume/transmission/ior/emissive_strength;
修正全部浮点 accessor 的 min/max; - 新增
MODEL_SHADING(默认pbr, 可选unlit):unlit给每个材质写
KHR_materials_unlit, 颜色 = 贴图 xbaseColorFactor、与场景光照无关,
最接近 MMD 的平涂观感(three.js 与 Godot 都支持); - 能力边界(不假装保留): 球面贴图与 toon 阶梯无法用 glTF core 表达, 数量写进
模型的conversion_note, 审核面板可见; - 新增 9 项测试; 测试规模 15 文件 / 220 项。
关于"增加支持的库进行转换"
换一个 PMX->glTF 转换器不能解决这件事: 球面贴图(matcap)与 toon 阶梯是
视点相关/光照相关的着色, 无法烘进 baseColorTexture; glTF 2.0 core 也没有这两个
槽位。行业做法只有三条: ①按 glTF 能力补齐(本次做的双面/PBR 规范化),
②交付KHR_materials_unlit的平涂颜色(本次的MODEL_SHADING=unlit),
③只在支持 MToon 的查看器里用 VRM(VRMC_materials_mtoon有 matcapTexture)——
但 Godot 客户端不认 MToon, 所以服务端仍以 GLB 为准。升级后需要重新导入模型
材质修正在转换时生效:
- 重新上传该 PMX 压缩包(或在管理端删除后重传);
reanalyze-models.mjs不会重转材质, 它只刷新分析与缩略图。
想用平涂颜色: 在
deploy/.env里加MODEL_SHADING=unlit后重跑deploy/install.sh
并重新导入模型。校验
opendance-web-v0.2.5.tar.gzsha256:c1988dd4e9fceff48c8ae368e50adc0d6ba1275aa7f7abe643d1bbab7ddb3c4fDownloads
- 新增