1.本系列教程的MMD动画制作流程:
①准备资产 ②K帧 ③烘焙物理 ④渲染 ⑤后期处理。
准备资产阶段:
| 模型(你在这里)| 场景与道具 | 特效 | 天空 |
2.对模型的错误操作可能会导致不可逆后果,所以请多多备份。
3.一定要养成经常保存的习惯,指不定Blender什么时候就崩了。
4.本系列教程的重心偏向制作剧情向动画。
全局设置
1.渲染引擎:Blender自带两个渲染引擎:Eevee和Cycles,其中Eevee偏向卡通渲染,Cycles偏向写实渲染,由于我们是制作二次元动画,所以通常选择Eevee效果更佳。高版本Blender中Eevee功能更多,因此我推荐使用高版本。但由于我的资产都在3.6版本,所以我将继续使用3.6版作演示。
2.色彩管理:视需求而定。“标准”模式的对比度更高,但细节较少。“filmic”模式会蒙上一层灰,个人不喜欢。4.0以上版本有“AgX”模式,另外也推荐使用ACES(需额外安装)。我将使用“标准”模式进行演示,其他参数默认。
插件
请准备好MMD Tools和MMR,我使用的MMR为 BV1eMz9YyEEi 中的MMR修复版。
① 将下载好的模型文件放置在合适的文件夹中,随后就不要随意移动模型文件了。否则会导致Blneder中模型丢失贴图(除非进行打包)。
②将模型导入至单独的集合中,在预处理模型后保存blender文件。随后在制作动画需要导入模型时只需要追加blender中的集合即可。

如果不把模型放在单独的集合中,就无法快速追加模型。
追加模型后,模型原先隐藏的物体均会显示(如刚体和Joint),此时点击MMD Tools的“可见性重置”即可。

如果想要移动模型至另一个集合,则需要选中所有物体(包括隐藏的物体)后再进行拖动。具体方法为:shift+左键点击joints空物体右侧的小眼睛(显示该物体及其所有子级),shift+左键点击rigidbodies空物体右侧的小眼睛(同理),此时所有物体均显示,随后选中模型的根物体(即所有物体的父级),右键后选择“选择层级”,此时除joints空物体和rigidbodies空物体外其余物体均被选中。此时再ctrl+左键加选这两个物体,然后就可以拖动至另一个集合了。拖动完成后记得重置可见性。


许多使用Blender制作MMD的新人经常会犯的一个错误,便是完全没有处理材质,使得模型如同蜡像一般僵硬。就如同在MMD软件中使用各种MME预设一样,在Blender中也需要对模型材质进行处理。
材质处理有许多种方向,可以是真实材质,也可以是卡通材质等等。由于本系列教程的主要内容是制作剧情向动画,因此选择使用卡通材质。对于剧情向动画来说,不必追求过高的材质效果。
1.3.2.1 构建卡通着色器
常见的两种渲染风格:PBR和NPR,其中PBR即真实渲染,追求写实。NPR为非真实渲染,更偏向二次元风格。由于我们追求二次元风格,所以应选用NPR渲染。所谓的卡通渲染或三渲二就属于NPR。接下来将讲解最基本的卡通着色器节点是如何构建的。当然,你也可以去寻找现成的卡通渲染插件以便于快速完成这一步。(如Miaobox的一键卡渲插件)
① 核心节点:Shader转RGB
该节点为Eevee渲染器专有节点
该节点可以将着色器的结果转换为RGB,配合颜色渐变节点就可以做到亮面和暗面分开。

你也可以让亮面和暗面间稍微带点渐变:

添加混合颜色节点,我们便可以指定亮面和暗面的颜色。

②阴影色
阴影色取决于其亮面颜色,通过将亮面颜色叠加黑色就可以得到阴影色,这可以通过“正片叠底”混合颜色节点实现。通过调整“正片叠底”的系数来决定阴影强度。

阴影色可进行冷色和暖色调整,如在阳光充足的地方阴影色偏暖色,在月光下阴影色偏冷色。只需要将叠加色调整为暗红色或暗蓝色即可。(当然也不局限于这两种颜色)


③ 在末尾添加自发光着色器,可以控制材质的整体发光效果。若需要辉光效果则需先在右侧“渲染”选项卡中启用“辉光”。

④环境光遮蔽(AO)
在使用环境光遮蔽节点前,需先在右侧“渲染”选项卡中启用环境光遮蔽。

使用环境光遮蔽节点和颜色渐变可实现环境光遮蔽效果,此时相互靠近的面便会产生阴影。通过调整“距离”参数可以改变环境光遮蔽的范围。将环境光遮蔽节点连接到混合着色器,即可在原先的基础上生成环境光遮蔽。

此时环境光遮蔽的颜色为黑色,将之前的阴影色通过自发光着色器连接到混合着色器上,即可让环境光遮蔽颜色为阴影色。

⑤ 混合漫射BSDF着色器。保留一部分漫射效果,避免模型过于扁平化。

⑥ 为着色器添加alpha通道,使用透明BSDF着色器混合即可,注意混合着色器的端口连接顺序。

⑦ 将所有节点打包为节点组,设置组输入参数(注意调整参数的默认值和上下限)。

⑧ 对于环境光遮蔽节点,添加映射范围节点控制其范围和大小。

⑨ 给节点组命名,同时勾选伪用户。当一个节点组没有出现在任何节点中时,这个节点组会成为孤立的数据,此时关闭Blender或者清理数据会导致该节点组被删除,勾选伪用户可以防止这一点。

1.3.2.2 为材质替换着色器
上一节我们构建了卡通着色器,接下来我们需要给模型的所有材质着色。
现在我们将着色器添加进材质节点中。默认的MMD shader提供了颜色输出接口,将该接口连入卡通着色器中即可,同时还需要将MMD shader的Alpha输出接口连到NPR着色器的Alpha接口。这样我们就给其中一个材质就调整好了。

然而,一个模型动辄拥有几十个材质,我们需要对每个材质都添加一遍节点,手动添加节点过于麻烦,因此接下来将讲解如何通过脚本批量添加节点。(需要python基础)
如果对python一窍不通的话,只需要记住修改参数的地方,剩下的不动即可。如果无法输入汉字的话,可以从外部记事本中复制过来。代码文件在教程末尾的链接中。

总体思路就是遍历每个材质,添加卡通节点,连线,详细的注释已经标在代码上了。
使用方法:
① 切换到Scripting界面,读取下载的auto add nodes.py文件,读取成功后界面应为上图所示。
② 在下图的位置修改参数。

一共要修改3个参数,分别是:
node_name:将双引号内的文字改为要批量添加的NPR着色器节点的名字
color_index:将后面的数字改为卡通着色器节点中的颜色输入端口的序号(从0开始数)
Alpha_index:将后面的数字改为卡通着色器节点中的输入Alpha端口的序号(从0开始数)
如果不清楚具体要填什么的话,可以参考下图:

对于图中的节点,其节点名称为“卡通着色器”,颜色输入端口序号为0,Alpha输入端口序号为7。
③ 点击最上面的播放小三角运行脚本:

④ 确保节点组已经追加到Blender中,选中要批量添加节点的模型网格(可选择多个模型的网格),按下F3,搜索“add nodes”,点击运行指令即可。

效果(左侧修改前,右侧修改后):

注意事项:
① 执行一次脚本后,就可以一直使用指令了。每次修改脚本参数后,需要重新执行一次脚本来更新指令。每次重新打开Blender需要重新执行脚本。如果不想每次打开都要重新导入脚本的话就需要制作插件。插件的制作过于困难,教程不做演示,感兴趣的朋友可以自行学习,up也制作了插件,但目前插件功能尚在完善中。
② 执行脚本命令后,新增的节点组的参数均为默认参数,因此需要提前调整好默认参数。
③ 如果不希望每次新建Blender文件就需要重新追加节点组的话,可以将节点组追加后保存启动文件。
1.3.2.3 调节材质参数
有时候即使添加了卡通着色器节点,模型的材质仍然不尽人意(如反光过高、颜色不满意、有噪点等),此时需要调节材质参数。下面将使用雪萱式斯塔萨菲雅举例:

上图的斯塔已经添加了卡通着色器节点,但模型材质还存在几个问题:
1.头发反光过高 2.衣服颜色过浅 3.翅膀有噪点
① 使用MMD Tools的“按材质分开”功能,可以使模型的网格按照材质分为多个网格,更方便选中。


② 降低MMD渲染器的球体纹理系数和反射系数。

③ 在MMD着色器和NPR着色器之间添加RGB曲线节点用来调节颜色。

④对于半透明材质,有噪点的原因是材质的混合模式为Alpha Hashed,如果不想要噪点可以改为Alpha Blend,如果出现问题可以尝试取消勾选“显示背面”。但请注意:Alpha Blend在处理多个半透明材质叠加时可能会出现叠加顺序错误的问题,另外Alpha Blend会导致环境光遮蔽失效,且Alpha Blend会导致Cryptomatte蒙版无法捕捉,需格外注意。如果必须使用Alpha Hashed模式,也可以将采样率调高来尽量减少噪点。

⑤ 在材质修改完毕后记得使用MMD Tools中的“合并”将多个网格还原为一个网格,便于后续进行形态键K帧。还原后网格的名称会变为材质名称,可以重命名为之前的名称。
注意事项:
请勿使用MMD Tools的“转换为Blender”功能,此功能会将模型所有材质的MMD着色器替换为原理化BSDF着色器,原先的阴影纹理和高光纹理失效。同时这一功能也会使所有的材质表情失效,因为材质表情的装配依赖于MMD着色器。
效果:

1.3.2.4 调节眼睛材质
眼白、眼珠和高光不适用于卡通着色器节点,需单独设置。一般用自发光着色器代替即可,自发光着色器本身不带有alpha通道,需要混合透明着色器。


仔细观察模型的面部,我们会发现面部阴影并不美观:

我们有2种常规方式来调整面部阴影——1.调整面部法线。2.制作SDF贴图。
1.3.3.1 调整面部法线
原理:阴影是根据法线与光线的夹角计算而来,法线可以简单理解为面的朝向。将球体的法线覆盖掉面部的法线,就可以让面部的阴影呈现球体的效果。
① 新建球形空物体,大小随意,添加复制位置约束,目标为模型的頭骨。这一步是为了让球形空物体跟随模型的头移动。

② 为模型网格添加新的顶点组,选中所有需要被球体覆盖法向的面,新增到顶点组中。这一步是设置法线编辑修改器的影响范围。
那么,如何选中该选的面呢?
首先,编辑模式选中面部的任何一块面,shift+G选择相似“材质”,这样就选中了所有与面部材质相同的面。
此时,根据模型的不同,有以下几种情况:
1.不包含耳朵和脖子和眼睫毛或眉毛,如なす天式因幡帝。不需要做任何处理便可直接添加进顶点组。

2.包含了耳朵或眼眉或眼睫毛。如雪萱式桑尼米尔克。如果这些上述物体没有和面部连接到一起,则可以选中面部任意一块面,然后连续按ctrl+加号扩选,直到所有面部均被选中,然后将这些面添加进顶点组即可。如果上述物体和面部连接到了一起,则需要手动将这些面去除。

3.包含了部分脖子,可以去除脖子的选中,也可选择保留,要观察哪一种的阴影更好看。
4.包含了整个身体。挺麻烦的,慢慢处理吧。
③ 选中模型的网格,添加法线编辑修改器,模式为“径向”,目标为之前创建的球体空物体,混合模式为“复制”,顶点组选中为之前创建的顶点组。

可以看到效果已经有了,但还需要处理一些小问题。

⑤ 修复问题
1.模型下颌部分面法向翻转:

这是因为球体空物体的位置太低,调高其复制位置约束的“头/尾”参数即可解决问题。

2.脖子与面部连接的地方出现异常阴影:

这种情况并没有通用的修复方法,需要尝试调整点法向或将其包含到面部阴影顶点组中。
此外,也可以使用半球加圆柱体进行法线传递。这种方法记得要将脖子纳入面部阴影顶点组中,这样就可以避免脖子处的异常阴影。(推荐使用这种)

这种情况下记得将视图显示调整为线框

然而,通过法向传递处理得到的阴影效果的次表面散射会出现问题(如下图),可以通过调节次表面散射的参数来尽量减轻这种问题。(或者关闭面部的次表面散射效果)

1.3.3.2制作sdf贴图(很难,建议跳过)
1.3.3.2.1 展开sdf uv贴图
① 首先为模型添加一个新的UV贴图,这是因为sdf贴图需要新的uv映射关系。

选中模型的面部的一个面,ctrl+加号加选,选中所有面部的面,确保不包含脖子、耳朵、眉毛等部分。将其保存为顶点组以便于快速选中,效果如下图:

② 选中面部材质,新建一个图像纹理,大小自定(最好大点,防止出现锯齿),将其连接到输出端口。接下来我们将借助这张图来展UV和绘制标记线。

③ 选中面部与后脑勺交界的边,标记为缝合边。

④ 切换至UV视窗,确保左侧图像为之前创建的图像,确保在编辑模式下右侧UV贴图中选中了之前新建的UV贴图,右键点击“UV展开面”,点击“展开”,将后脑勺的UV移到图像外,将正脸的UV调整到图像的正中间。(记得切换回原先的UV贴图看一下操作是否正确)

1.3.3.2.2 绘制sdf贴图
① 切换至纹理绘制窗口,绘制标记线,分别在眼睛外侧、中间、内侧画出标记线,标记出鼻尖阴影。标记处脸颊阴影。

② 将图像另存,切换至UV编辑窗口,点击上方的UV按钮,点击“导出UV布局图”。


③ 打开PS,导入这两张图片。

选中样条线图层,用魔棒圈出黑色部分,新建图层,填充为黑色。

新建另一个图层,绘制一个白色矩形覆盖所有地方,调整图层顺序。

④ 新建鼻尖图层,将鼻尖部分填充为黑色。

新建图层,将脸颊区填充为白色,并复制1个图层,将复制后的图层适当缩小,然后再复制1个图层,再次缩小。这样我们获得了3个脸颊图层。

新建图层,将鼻尖区复制翻转到另一侧,填充为白色。复制一个图层,适当缩小,再复制一个图层,再适当缩小,这样我们获得了3个白色的鼻尖区图层。

⑤ 新建图层,沿左侧第一条线绘制出黑色部分。

如法炮制,每次新建一个图层,沿标记线绘制出黑色部分。





最后新建一个全黑图层。

新建图层,绘制过渡区(这个容易画不好,需要多找找感觉)

⑥ 接下来调整图层,导出。

在导出时注意要选择为较小文件(8位),这是因为sdf生成工具只支持8位深的图片。

调整图层,继续导出,共导出9张图,分别命名为“a” - “i”,,注意每张图片的位深度不能超过8,结果参考下图(也可以导出其他数量,不过命名和后续的参数要进行调整)

11 将这9张照片放到sdf生成工具的image文件夹中,右键“run.bat”,选择用记事本打开,在"g.png"后加上"h.png i.png"(这里根据制作的sdf数量来决定填写内容),如下图

12.运行run.bat,等待一阵后看到下图,代表sdf过渡图生成完成,在文件夹中找到sdf.png,这就是最终成果。


制作一个合适的sdf过渡图需要多加尝试,特别是伦勃朗光的阴影部分,如果实在弄不好也可以选择去掉伦勃朗光部分。
1.3.3.2.3 制作sdf着色器
① 回到blender,首先照之前的方法用法线编辑修改器修改面部法线,修复嘴唇部分的不自然阴影问题。

② 导入生成好的sdf过渡图,设置uv为之前创建的sdf的uv,添加“大于”运算节点,这样一个特定光照下的二分阴影就产生了。

③ 以前面制作的卡通着色器为基础进行修改,删去shader转RGB的部分,将“大于”运算节点连接到混合颜色节点,以取代原先的shader转RGB形成的阴影。

④ 接下来我们需要求出“大于”运算节点的数值与光照之间的关系。因此首先我们需要求得光照方向在水平面上的投影与角色之间的夹角。

选中模型,新建几何节点,将光源拖入,我们便获得了光源的旋转值。

⑤ 然而,我们需要朝向光线照射方向的矢量,因此我们先创建一个(0,0,-1)的矢量,这个矢量的方向正好是光源默认变换下的方向(即正朝下),对这个矢量进行矢量旋转,输入光源的旋转值,我们便获得了朝向光线照射方向的矢量。

通过分离xyz节点将z分量设为0,这样就获得了光线矢量在水平面上的投影。

由于模型的默认朝向是-y轴,因此我们要对(0,1,0)进行点乘,在点乘前需要先进行归一化,这样点乘的结果就在-1到1之间。此时当光线朝向y轴时,值为1,朝向-y轴时,值为-1,朝向x轴时,值为0。

然而,这样得出的结果从-1到1并不是线性的,这是因为点乘运算含有cos运算,而cos函数并不是线性的,因此我们需要进行反余弦运算求出角度,求出的角度单位是弧度。

然后添加映射范围节点,取0到π/2的值(这段值对应着光线照向皮肤)映射为0到1。

⑥ 添加存储已命名属性,这样就可以把属性传递到材质节点中。

在材质节点中添加属性节点,连接到“大于”运算节点上。这样sdf阴影就可以跟随光线方向转动。

⑦ 由于sdf贴图只处理了光线从一侧打过来的情况,当光线从另一侧打过来时,我们需要翻转sdf贴图。那么首先我们需要判断光线是从人物的左面照射过来还是右面,这一点可以通过点乘(1,0,0)矢量解决。

通过比较节点和切换节点,使得小于0的部分输出-1,大于0的部分输出1,同样存储为已命名属性。

在材质节点中读取该属性,连接到合并xyz节点中,再连接到映射节点的缩放中,这样sdf的映射部分就解决了。

⑧ 但模型的头部会发生旋转,当头部旋转时,我们需要捕捉这个旋转值,并修正面部阴影。一种方法是使用空物体作为頭骨的子级,将几何节点读取空物体的旋转值。

读取头部的旋转值后,将之前的两个矢量(0,1,0)和(1,0,0)分别进行矢量旋转即可修正头部水平旋转时的sdf阴影映射。

但头部还可以上下旋转,当头部的朝向不再水平时,(0,1,0))和(1,0,0)两个矢量经过矢量旋转后便不再水平,因此我们需要将其z分量调为0,调为0后矢量长度不再为1,因此还要进行归一化处理。这样就修正了头部上下旋转时的sdf映射。

最后封装节点,勾选伪用户。

1.3.3.2.4 处理材质的非面部部分
注意到面部材质也包括了耳朵和眉毛和特殊瞳孔表情,由于使用了sdf专用的uv贴图,耳朵也需要在sdf的uv贴图中重新展开。一种偷懒的方法便是把这些地方挪到sdf贴图中的黑色区域。

补充:同一个作者制作的模型的头部基本都相似,可以共用同一个sdf。
MMD的原生骨骼很难操控,这主要是因为手部没有IK,因此我们可以借助MMR插件使用rigify骨骼控制MMD骨骼。
使用方法:选中模型的骨骼,然后点击MMR插件中的生成控制器即可。

注意事项:
1. 生成后一定要检查手部ik是否翻折,如果翻折,则需要先点击“美化MMD骨骼”,或者将ひじ骨稍微向内侧旋转一点(注意两侧的ひじ骨旋转度数要相同,否则生成控制器后两边的骨骼会不对称),然后再重新生成控制器。


2.装配控制器后,模型原生的骨架的大部分骨骼便会绑定到控制器上,此时模型的根物体便无法再控制这些被绑定的骨骼的位置。不过一般情况下模型的根物体也不会发生改变,所以不需要太过注意。如果实在需要移动根物体,可以同时选中根物体和控制器,一同移动。
到此,模型的预处理便基本完成。你也可以顺便把表情也装配上,不过个人习惯将表情装配放在K帧结束后。

恭喜你完成了流程里的第一步,可喜可贺!下一篇教程将讲述场景和道具的准备。
本次教程相关的节点和脚本下载链接:https://pan.baidu.com/s/1DojBsNhWviyl_pBrMld0mw?pwd=u2zf 提取码: u2zf