Files
opendance-web/deploy/.env.example
T
opendance eebccd55b4 fix(models): MMD 材质对齐——补回双面标志、规范化 PBR 参数、可选 unlit 着色
背景(用户反馈 + 本地用真 Assimp 6.0.4 复现):
PMX 的着色模型(卡通阶梯 + 球面贴图 + 平坦环境光)与 glTF PBR 不是一回事,
Assimp 转换会丢掉其中一部分。实测样本【奥黛塔】_by_原神.zip(39 个材质):

1. 主因:PMX 里 36 个材质带 drawFlag bit0(不剔除背面),而导出的 GLB 里
   doubleSided 一个都没有 -> 头发/裙摆/睫毛这类薄片被单面剔除,
   看起来就是颜色/贴图不对;
2. PMX 的 shininess/specular/ambient 与 PBR 无映射;Assimp 还会带上
   KHR_materials_specular / KHR_materials_volume 等与 MMD 无关的扩展;
3. Assimp 把 accessor.min/max 写坏(实测 min = 2.2250738585072014e-308),
   Godot 等客户端用它算包围盒。

修复:
1. 新增 src/models/pmx-materials.ts:只读 PMX 材质段(布局与权威库 mmd-parser
   一致,注意贴图索引宽度是 1 字节),拿到 name/diffuse/specular/shininess/
   ambient/drawFlag/球面贴图/toon/faceCount;
2. 新增 src/models/glb-materials.ts:转换后按索引把 PMX 参数补回 GLB ——
   doubleSided、metallicFactor=0、roughnessFactor=clamp(1-shininess/100,0.5,1)、
   baseColorFactor x diffuse(含 alpha);清掉与 MMD 无关的扩展;
   修正全部浮点 accessor 的 min/max;支持 KHR_materials_unlit(MODEL_SHADING);
3. 抽出 src/common/glb-chunks.ts(JSON/BIN chunk 读写),vrm-writer 改为复用;
4. 能力边界写清楚:PMX 的球面贴图(该模型 15 项)与 toon 阶梯在 glTF core 里
   没有对应槽位,任何转换器都无法保留,数量写进 conversion_note 供审核查看;
5. 新增 test/mmd-materials.spec.ts 9 项;规模 15 文件 / 220 项;
6. 新增 MODEL_SHADING 配置(默认 pbr,可选 unlit),文档同步(README.md/.txt、DSH.md、.env.example)。
2026-09-16 18:55:25 +08:00

71 lines
3.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================================
# OpenDance Studio Web 服务端 -- Linux 原生部署环境变量
#
# 复制为 deploy/.env 后填写;.env 已被 .gitignore 忽略,禁止提交。
# 该文件由 systemd 通过 EnvironmentFile 注入 Node 进程。
# ============================================================
# ---- 服务 ----
NODE_ENV=production
# 软件 API 端口:Windows/Godot 客户端与 Android App 调用它
# (提供 /api、/health、/static、/contracts,**不提供管理页面**)
PORT=3000
# 管理端端口:浏览器访问管理界面(页面 + 上面全部接口)
# 不设置时默认 = PORT + 1(即 3001);设为与 PORT 相同即为单端口兼容模式
ADMIN_PORT=3001
# 监听地址:
# 反代与后端同机 -> 127.0.0.1(后端不直接对外暴露,推荐)
# 反代在别的机器 -> 0.0.0.0,并用防火墙把该端口限制为仅反代来源可访问
HOST=0.0.0.0
# 管理端单独绑定地址(可选)。只想让管理端暴露在内网时,例如 127.0.0.1 或内网网卡地址
# ADMIN_HOST=127.0.0.1
# 管理端静态站点目录(本服务自带管理端页面,反代只需整体转发到管理端端口)
ADMIN_DIR=/opt/opendance/admin
# ---- 现有 MySQL / MariaDB 实例(本项目不安装、不管理数据库)----
DB_HOST='<existing-mysql-host>'
DB_PORT=3306
DB_USER=opendance_app
DB_PASS='<数据库口令>'
DB_NAME=opendance
# 生产环境必须为 false,表结构一律走 TypeORM migration
DB_SYNCHRONIZE=false
DB_LOGGING=false
# ---- 文件存储 ----
# 需与 install.sh 的 STORAGE_DIR 一致,且服务用户可写
STORAGE_DIR=/var/lib/opendance/storage
# 单文件上传上限(字节),默认 512 MiB。
# ★ 反向代理层的同名限制必须不小于此值(nginx client_max_body_size /
# IIS requestLimits),否则大模型上传会在代理层被拒(413)。
UPLOAD_MAX_BYTES=536870912
# ---- 可选的 Assimp(FBX/glTF 动作预处理;也用于压缩包模型的转换)----
# 上传 .zip(内含 .pmx 的 MMD 模型包)时必须能调用到它,否则转换会失败
ASSIMP_BIN=assimp
# 需要转换的模型(PMX / FBX)交付格式:glb(默认,两个客户端都原生加载)| vrm
# glb:通用,客户端直接加载
# vrm:在 GLB 之上补 VRMC_vrm 扩展(humanoid 骨骼 / 表情语义);
# humanoid 骨骼名映射不全时会自动回退交付 GLB 并写进 conversion_note
MODEL_CONVERT_FORMAT=glb
# 压缩包里优先选用的 PMX 文件名(大小写不敏感);找不到时按"格式优先级 -> 目录最浅 -> 文件最大"挑
# 值里含空格或 shell 元字符时必须用引号包起来(install.sh 会用
# `set -a; . deploy/.env` 真的执行本文件;不加引号会把 "Miku.pmx" 当命令)
MODEL_CONVERT_PMX="Hatsune Miku.pmx"
# 单次转换超时(毫秒)
# 转换后模型的着色模式:pbr(默认,标准 PBR + 按 PMX 参数修正双面/粗糙度)
# | unlit(给材质写 KHR_materials_unlit:颜色 = 贴图 x baseColorFactor,
# 与场景光照无关,最接近 MMD 的平涂观感;three.js 与 Godot 都支持)
MODEL_SHADING=pbr
MODEL_CONVERT_TIMEOUT_MS=180000
# ---- 默认模型(可选)----
# 显式指定默认模型 id;不设置时按源码 src/config/default-model.ts 里的种子匹配,
# 再回落到契约 data-models.md 4.1 的 VRM 优先规则
# DEFAULT_MODEL_ID=1
# ---- 契约目录 ----
# 指向安装目录下的 contracts/,使 /health 与 /api/catalog/version 反映实时契约版本
CONTRACTS_DIR=/opt/opendance/contracts