Appearance
材质的纹章学
背景:41 种材质挤在 4 个分类中(头发/皮肤/眼睛/服装),精确匹配规则无法覆盖"刘海""碎髪"等变体。 过程:扩展为 6 类 + 包含匹配 + 优先级排序 + 用户自定义分类规则。
织工的染坊里,41种颜色挤在同一个染缸里。
"这不对。" 织工盯着材质列表,"头发、皮肤、眼睛、服装——四个染缸装不下41种颜色。"
他翻看材质名称:#02 頭1、#04 牙、#07 眼、#17 帽子、#25 外套、#33 刘海、#46 胖次...
"41种颜色,4个染缸。" 织工喃喃自语,"难怪大部分都被扔进'服装'染缸里。"
外交官走过来,看了一眼列表。
"你的分类规则是什么?" 他问。
"精确匹配。" 织工说,"/hair|髪/ 匹配头发,/eye|目/ 匹配眼睛。"
"那 刘海 呢?" 外交官指着第33号材质,"它不包含 'hair',也不包含 '髪'。"
织工沉默了。
第一本账
外交官翻出一份古老的卷轴——Blender MMD Tools 的文档。
"他们怎么做分类?" 他问。
"看骨骼。" 织工说,"材质关联到顶点,顶点关联到骨骼权重,按骨骼层级分组。头发材质关联到头骨,裙子材质关联到下半身骨骼。"
"但你没有骨骼权重数据。"
"对。" 织工说,"PMX 格式里,材质和骨骼是完全独立的数据块,没有直接关联字段。间接关联路径是:骨骼 → 顶点权重 → 顶点 → 面 → 材质。"
"那就看名字。" 外交官说。
"名字是混乱的。" 织工翻着列表,"日文、英文、罗马字、个人习惯,什么都有。#33 刘海、#34 碎髪、#35 碎髪1... '刘海'不包含'hair','碎髪'不包含'hair',但它们明明是头发。"
"精确匹配不行。" 外交官说,"得用包含匹配。"
第二本账
织工回到染坊,重新设计分类系统。
四个染缸变成六个:
- 皮肤(嘴巴、牙齿、身体)
- 头发(发、髪、頭、刘海、呆毛)
- 眼睛(眼、目、泪、表情)
- 服装(裙、衣、服、外套、胖次)
- 配件(帽、鞋、蝶结、星星)
- 道具(武器)
"优先级怎么定?" 织工问。
"服装最高。" 外交官说,"确保裙-腰带不会被'带'字抢到配件染缸。"
织工测试分类规则:
| 材质名 | 匹配关键词 | 分类 |
|---|---|---|
| 頭1 | 頭 | 头发 |
| 牙 | 牙 | 皮肤 |
| 眼白 | 眼 | 眼睛 |
| 帽子-蝶结 | 帽 | 配件 |
| 裙-腰带 | 裙 | 服装 |
"41种颜色,现在都有了归属。" 织工说。
第三本账
"但如果内置规则不够用呢?" 外交官问,"如果用户的模型有特殊的材质命名?"
织工沉默了一会儿。
"那就让用户自己定义映射。" 他说。
他在设置页面添加了"材质分类映射"功能:用户可以添加正则模式→分类的映射,优先于内置规则。
"这样," 织工说,"每个用户都可以为自己的模型定制染缸。"
外交官点了点头。
"聚合者不发明分类学," 他说,"它只是让每个颜色找到自己的染缸。染缸越精确,颜色越容易找到归属。"
第四本账
织工继续检查材质列表。
"还有一个问题," 他说,"分组列表里的材质没有开关。用户想隐藏某个材质,得点进'逐材质'页面才能操作。"
"那就加一个。" 外交官说。
织工在分组列表的每个材质行上添加了色块开关。点击色块,材质就会显示或隐藏。
"41种颜色," 织工说,"现在每一种都有了自己的染缸,每一种都可以独立开关。"
外交官看着分类结果:
| 分类 | 数量 | 代表材质 |
|---|---|---|
| 头发 | 20 | 頭1、后发、刘海、碎髪 |
| 服装 | 11 | 外套、胖次、裙-袖饰 |
| 皮肤 | 10 | 舌、牙、体、臂、指 |
| 眼睛 | 7 | 眼白、高光、泪、表情 |
| 配件 | 11 | 帽子、鞋子、蝶结 |
"分类准确了," 外交官说,"但代价是什么?"
织工沉默了。
"代价是," 他说,"我们永远无法完美分类。每个城邦的材质命名都不一样,每个用户的模型都有自己的习惯。分类系统越精确,维护成本越高。"
"这就是聚合悖论。" 外交官说。
聚合者的纹章学:不是发明新的分类,而是让每个颜色找到自己的位置。染缸越精确,颜色越容易找到归属——但也越难维护。
教训摘要:包含匹配比精确匹配更宽容,优先级规则比正则更可靠。