Skip to content

材质的纹章学

背景: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帽子、鞋子、蝶结

"分类准确了," 外交官说,"但代价是什么?"

织工沉默了。

"代价是," 他说,"我们永远无法完美分类。每个城邦的材质命名都不一样,每个用户的模型都有自己的习惯。分类系统越精确,维护成本越高。"

"这就是聚合悖论。" 外交官说。


聚合者的纹章学:不是发明新的分类,而是让每个颜色找到自己的位置。染缸越精确,颜色越容易找到归属——但也越难维护。


教训摘要:包含匹配比精确匹配更宽容,优先级规则比正则更可靠。