麻辣土豆模型和动作提取:五、表情和口型

系列目录

* “土豆”指的是偶像大师百万现场剧场时光(ミリシタ/MLTD)

这篇文章里,我讲一下土豆的面部操控(表情和口型)。


在做土豆表情之前,我不知道土豆是用什么方法实现的。但是,MMD 的我知道啊。在 PMD/PMX 中,有一种东西叫做 morph,其中就包括 vertex morph。(当然还有其他的 material morph、UV morph 等等。)MMD 就是调整了每个 morph 的比重,来实现骨骼之外的模型变化。比如 vertex morph,存储的是一个列表,指定了受其影响的顶点在这个 morph 的比重达到1的时候,所加上的偏移。比如,在默认的姿势下位置在 的点,应用了比重0.5的偏移 ,就会移动到新坐标 。据此一个模型可以做出不同的表情和口型及它们的混合。

我怀疑 Unity 中也有类似的东西,但是我不知道叫什么。我觉得,模型的 asset bundle 里就应该包含这个信息。所以我启动调试器,逐个属性地查看读取的模型信息(当然,要看头而不是身体啦)。随后我发现,BlendShape 的数组不是空的,而且它们的名字看起来就是操控面部的预定义变化的。于是我去找了找,原来这是 Maya 里的技术,Unity 同样支持。在功能上,它就等价于 PMX 的 vertex morph。有了这个发现,之后的东西就简单了,因为就是两个等价的结构的互相转换。首先将这些 BlendShape 转换到 vertex morph,然后在 PMXEditor 中对它们进行测试,尽量找到对应的 MMD 常用面部控制名称,最后应用表情权重。

接下来就该看看是怎么动态控制的了。之前我探索过谱面所在的那个 scrobj_xxxxxx.unity3d,里面的 scenario 毫无疑问存放着表演数据。但是元素太多了,而且核心是个杂糅的结构体,经常出现字段共用。当时想,在无法看源代码的情况下,很难分离出不同类型的控制指令。这次我就对着 Blooming Star 的视频(因为只有一个人,干扰小,适合通过时间查找),先找出了控制口型的,然后是表情。其他我能肯定或者大概率是的一些类型也写在了代码中。口型还好办,对着歌词的时间看,就是直接设置为あ/い/う/え/お/ん或闭嘴。表情就麻烦一些,并不像 VMD 那样给出每个 morph 的权重,而是只有一个表情索引。也就是说,要先找出这个索引对应的是什么表情,然后再调出各个 morph 的权重,最后保存为表中的一个项。Blooming Star 还算简单,只有三种表情;其他的歌(和日常 commu)有更多的表情——至少有30种,而且受到 MV 摄像机限制,不是所有的都容易看到或者看清楚。不过这只是简单重复的工作,需要时间和耐心罢了。

表情的控制需要注意避免冲突。土豆的眨眼是和表情分离的,而有些表情需要闭眼(比如微笑)。所以一定要解决这个冲突,否则就要产生不合理的权重和诡异的表情了。(morph 的叠加只保证线性,权重归一化要自己保证。)口型也是如此,要注意口型变化的过渡时间。

分享到 评论