您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 荣哥哥哥 于 2019-12-9 17:14 编辑
作者博客:http://blog.163.com/shininglore@126/
这是一套项目流程式教程,每个高手都是从一点一滴做起,逐渐累积经验,希望这套教程能给那些在项目中拼搏的战友带来一些帮助和启示。
前言
曾经完成了一些人物设定,打算制作一个原创小动画,只可惜由于各种原因(生存是最主要的),计划一直搁浅,现在只能当是一次流程的练习来完成 了。这里我就发下牢骚:在这个轻能力而重关系的社会环境,我们诞生不了什么科技创新或者艺术大师,那是十分的正常。
言归正传,既然是自己一个未完成的作品,也就无畏什么批评意见了。工程包括的流程有:设定,模型,材质,灯光,骨骼绑定,表情控制,动力学绑定(布料,头发),后期合成等。我将逐一整理出来,作为经验的总结。
教程思路
1.原画设定。 2.三维建模。 3.比例设定。 4.模型完成。 5.贴图烘焙。 6.贴图绘制。 7.视图观察。 8.卡通材质。 9.卡通线条。 10.渲染器使用。 11.Hair的渲染。 12.最终效果。
1.原画设定
有朋友说过,一看我的设定就觉得是中国风格的,这多少带有一点贬义:中国风格,其实也就是没有风格(当然这不是说传统的水墨画和剪纸)。因为我不是很喜欢欧美的小关节肌肉男或者裸女野兽派,也不太热衷于日式的“萌系”造型,所以会按自己的一种审美角度来创作。
#p#e#
2.三维建模
草草绘制了一个人物的正侧面设定图,导入maya中进行参考。
#p#e#
3.比例设定
尽管已经熟透maya的建模命令,但很久没接触角色建模,花了两天的时间才完成卡通角色的基本造型。我通常都是按模型:实物=1:10进行,也就是现实1.7米高的角色,在maya中模型高度是17厘米。
4.模型完成
角色模型完成后,平展UV,然后是给人物穿衣服—在人体模型的基础上建模。人物发型的制作我一直犹豫不定,考虑到使用模型块来制作面片头发很难表现发丝细节,因此最后采用的是maya的hair动力学系统。
#p#e#
5.贴图烘焙
尽管是卡通角色,但也不能随便用个ramp材质填充纯色来凑数,认真的绘制一些细节还是很有必要的。我首先将模型进行二级圆滑,将环境闭塞OCC贴图烘焙出来。
选择模型,按键盘上的3键,然后执行Modify->Convert->SmoothMeshPreview to Polygons。这个结果就相当于通常smooth的二级细分,只是它会自动关闭保持边界边(keepBorder为Off),尽量使模型所有部分得到圆滑。
其实不单是OCC贴图,很多灯光贴图都可以通过MentalRay渲染器进行烘焙,maya自己的softWare烘焙方式已近乎淘汰了,因为它实在存在太多问题。烘焙好的OCC因为计算了物体间的影响,一些容易暴露在光线照明中的部位会显得很奇怪,尤其是会发生动画的部分,因此往往都需要对烘焙的贴图进行一些修改,除非你只是制作静帧效果或者用于游戏。
如果不在贴图中使用OCC效果,也可以通过分层渲染而在后期合成中使用。当然,后期的方法效果更好,但花费的渲染时间也就更多。
6.贴图绘制
将二次圆滑后的模型导出为FBX格式,然后使用C4D打开。之前烘焙好的OCC贴图,经过photoshop的修改后(滤镜模糊化),导入到C4D材质中作为贴图参考。C4D绘制模型贴图很方便,它的即时显示速度也很快。C4D绘制贴图的功能集中于Bodypaint模块中,它的一些软件操作和maya很像,不过由于有类似photoshop那样的图层管理,所以常作为绘制贴图的工具来使用。
7.视图观察
在Maya中,使用SurfaceShader材质即可看到不含灯光和材质的纯贴图效果(C4D中只要在视图的“显示”菜单中选择“常量着色”即可)。
#p#e#
8.卡通材质
卡通材质有很多种制作方法,但为了避免各种麻烦,我直接使用maya的rampShader(渐变材质或称梯度材质)。使用ramp材质,选择Brightness的ColorInput模式即可,某些情况下可能会用到NormalizedBrightness,它和Brightness的区别在于当场景所有灯光同时增强时,明暗过渡不会发生改变(也就是不会因为灯光过强而产生生硬的明暗过渡,明暗之间依旧是柔和的过渡),只有个别灯光发生相对强度变化时,采用NormalizedBrightness的方式,才产生明暗偏移。将贴图直接连到ramp材质的color通道上,作为材质的基本色。使用两个remapColor(色彩重绘)工具节点,用于对贴图进行色相,明度的控制,用于卡通材质的暗部或者过渡区域。RemapColor节点的功能也就相当于Photoshop中的“色阶”和“曲线”,虽然控制起来有点麻烦。
卡通角色的眼睛较为简单,我就不打算按真实眼睛那样划分晶状体,虹膜之类的结构,因此我使用一个稍大的球体包住眼球,贴图使用带透明通道的白色圆点作为眼球上的高光。
通过效果对比,最终我并没有使用OCC贴图,而是以卡通材质+纯色贴图,配合多通道进行。毕竟动画合成中,后期的作用也是很大的。
9.卡通线条
选择模型,执行Toon->AssignOutline->AddNewToonOutline,加入笔刷特效。将ProfileLines设置为OffsetMesh,可以得到更细腻的卡通轮廓线,缺点就是会产生多个复制的模型,增加场景计算量,尤其是使用mentalRay进行渲染时。
10.渲染器使用
通常卡通材质使用MayaSoftware进行渲染,因为无论是速度还是质量上,它都优于mentalRay。不过,MayaSoftware也存在一个很严重的不足,那就是当距离摄像机较远时,模型相互贴近的地方会发生穿透现象,即使提高渲染采样,也很难解决这个问题;如果发生这种情况,那我们就只能通过mentalRay来解决这些镜头渲染的问题。
11.Hair的渲染
由于使用了带PE(笔刷特效)的hair系统,那么如何对它进行渲染则是一个很值得研究的问题。对于MayaSoftware,hair是作为后期渲染加入的,就和辉光、笔刷特效一样,因此只支持灯光的深度贴图阴影,无法渲染头发的反射;而MentalRay渲染PE,可支持反射和光线追踪成影,并且在使用光线追踪时效率很高,不过在头发细节上稍逊于Mayasoftware。我们可以在渲染设置中,选择mentalRay针对hair渲染的预设,速度会相当快(通常是MayaSoftWare的两倍上)。不过,如果头发数量过多,mentalRay会占用大量内存,导致渲染速度大幅度降低,因为它是将头发丝当作模型个体来计算的。根据效果和时间,来选择合适的渲染器进行。
此工程中,MayaSoftware渲染头发是每帧5分钟,mentalRay是每帧3分钟 ;但如果执行单帧渲染,mentalRay渲染则会因为内存不足而中断。
#p#e#
12.最终效果
通过分层渲染设置,将卡通角色模型和被遮罩的头发分别渲染,进行后期合成。
#p#e#
卡通角色的头部,往往因为强调可爱的五官,尤其是眼睛,会极大的影响到整个头部的形体轮廓。大眼睛的卡通人物造型,在处理眼眶和面部的关系时,一般有三种制作方法: 1.使用图片序列的形式将眼睛动画作为面部的材质贴图使用; 2.使用扁球体制作眼球; 3.使用大球体的一部分制作眼球。
前两种在制作眼球转动时会较为困难,因此我选择后者。
教程思路
1.创建头发生长区域。 2.创建头发系统。 3.创建头发初始态。 4.设置头发初始态。 5.制作发型。 6.头发初末状态的重要性。 7.头发碰撞。 8.头发动力学参数的设置。 9.头发渲染细节的设置。
使用maya制作动力学头发通常可使用以下几种方法: 1.手动绘制NURBS曲线,将它转为头发动力学曲线,再赋予PE笔刷进行毛发渲染。
2.直接在NURBS几何体(或UV平展的多边形几何体)上生成大量均匀分布的头发曲线,然后通过头发约束来制作发型。
3.通过NURBS曲线生成NURBS曲面,然后赋予贴图;最后通过头发动力学曲线控制骨骼的方法,使NURBS曲面受到骨骼蒙皮的影响。因为贴图渲染速度比PE头发快很多,所以在制作一些短发效果时也常用此方法进行,尽管动力学精度不高。
4.通过NURBS曲线生成NURBS曲面,然后在NURBS曲面上提取更多的曲线,利用模型历史以曲面控制曲线完成发型。这种方法不适合制作复杂的发型。
其实方法1和方法2是差不多的,不同点在于:方法1是先定发型,后设置动力学属性;方法2则反过来。相对而言,方法1可有效的利用资源,但缺点就是调节曲线繁琐,且细节上可能很难满足镜头特写,尤其在制作飘逸的长发效果时。
本例中采用的是方法2。
【Hair系统的组成】
Hair系统由头发动力学节点(hairSystem),毛囊节点(follicle),动力学输出曲线(hairSystemOutputCurves)构成,如果算上渲染部分,则还包含笔刷特效节点(pfxHair)。
hairSystem节点是头发行为的总控制节点,除了头发的各种行为参数,包括新增力场也是以该节点作为对象进行。
follicle毛囊,顾名思义,是头发生长的基部,除了可对单条动力学曲线进行额外控制,还记录着头发受到的约束或碰撞情况。
hairSystemOutputCurves节点是动力学解算后的最终曲线形态,尽管maya的hair系统可以不包含初始态或结束态的曲线,但是我们应按规范至少完成初始态的建立,让输出曲线和follicle毛囊节点进行关联,方便控制。
pfxHair是通过笔刷特效节点来完成头发的渲染,是maya特有的笔刷系统的一部分(paintEffect笔刷特效包含:植物笔刷,卡通线条,头发笔刷,生长笔刷,特效笔刷等),可通过调节特定功能下的笔触参数,实现丰富的效果渲染。
hair操作规则:增加力场影响时,是选择头发的动力学解算节点进行;而创建约束,则是选择头发动力学曲线或者毛囊节点进行。#p#e#
【Hair绑定步骤】
1.创建头发生长区域
将人物头部复制一份,圆滑后删除多余的部分,只留下头皮部分作为头发生成的区域;然后对提取的模型进行UV重展,确保它的UV无拉伸,并尽量利用UV坐标系的空间。
使用几何体生成头发系统,需要注意:毛囊的分布和几何体的UV信息有关。因为NURBS的UV始终是0到1的方形(如果不是则对曲面UV进行重建),所以通常使用NURBS半球体生成毛发曲线是较为理想的。但问题也就在于NURBS编辑形体没多边形那么灵活,因此我选择多边形进行。
2.创建头发系统
选择模型执行:hair->CreateHair(选项:Output:NURBScurves;U Vcount20;Length:4;Passive fill:0。其他保持默认。)
Maya中属性的数值和单位及比例都有密切的联系,默认的5表示头发长度5厘米,但那是1:1的“模型:实物”的比例;我这里使用的是1:10的比例,因此默认的5将表示50厘米的头发长度。因此,根据个人需要,我打算使用长度为40厘米以下的头发,所以修改为4。
提示:
创建大量头发时,应选择paintEffect的创建方式,因为它在场景中显示的速度是NURBS曲线的10倍。当确实需要对头发动力学曲线进行一些额外的操作,例如在曲线上吸附物体随头发进行运动或者模拟湿润头发滴水的时候,则选择后两种。
3.创建头发初始态
刚创建的头发默认是向四面八方伸展的,因此首先使用一个牛顿场,将大片头发吸引至后上方:选择毛发动力学节点,执行Fields->Newton。
#p#e#
4.设置头发初始态
全选头发曲线,执行Hair->SetStartPosition->FromCurrent。
如果是以PaintEffect的方式创建头发,则在outliner中选择毛囊组,然后执行Hair->SetStartPosition->FromCurrent。
5.制作发型
虽然没有头发插件ShaveAndHair那样的梳子工具,不过配合力场,maya提供的动力学约束功能在设置发型上功能也是很强大的,用的熟练的话并不比插件差多少。
Transform变形约束是制作发型时最常用的约束方式,它除了可以将头发曲线进行位移,通过自身的旋转缩放还能影响头发的聚拢和发散。在制作动画时,该约束也常用于制作头 发受到物体作用的效果,如用手拨开头发。
RubberBand是一种橡胶效果的约束:当控制器远离头发,头发就受到很强的拉力;控制器靠近头发,拉力就降低至零。通常这个约束很适合用来梳理头发制作平滑的发型,但在动力学效果中并不常用,因为它的拉力影响过于“柔顺平滑”(制作洗发露广告倒是不错……)。
Stick效果和RubberBand类似,所不同的是它会在一定的距离内产生作用:当头发和约束控制器的距离大于初始距离,头发将被控制器吸引;当距离小于初始距离,头发将被控制器推开。制作发型时,可用它来打乱头发的聚拢。
以上三种约束与头发曲线发生距离变化时,都会产生明显的拉力变化;而以下两种约束只在起始帧时定位曲线上约束点的位置,不会产生任何拉力。
Hair to Hair用于头发之间的相互吸引,它的作用较为微弱,常用于头发块的定型,例如头发束使用丝带固定。
HairBunch用于模拟头发间的自碰撞效果,计算速度要快于启用头发的自碰撞功能。并且,该功能可以在起始帧的时候推开叠加在一起的头发,这是其他约束没有的。 无论是哪种约束,头发的初始态对它都是极其重要的,因为约束参数中有三种不同的点计算方式:Nearest是计算控制器到曲线的相对距离,曲线上的约束点位置会随着运动而不断变化;UParameter是忽略控制器方位,通过0到1的曲线U向方位来定位约束点;UDistance和UParameter差不多,它计算世界空间中曲线上点到约束之间的距离,可进行自定义(UD和UP最大的不同在于当对多条曲线进行控制点定位时,UD能在不同位置的曲线上产生不同的约束点,而UP会使所有曲线的CV点位于相同的距离比),同样的,这个方式是忽略控制器的方位的。但无论是哪个方式,曲线上的约束点都和CV点有关,只能在CV点上进行控制,并且计算只在起始帧时执行(除了HairBunch),动画开始后不会发生改变(即使对UP或UD设置动画帧也是没效果的,约束无法在动画开始后改变位置)。
#p#e#
约束控制器用于定制发型并不是很复杂,你可以把自己想象为一个真正的发型美容师:通过一堆夹子,发卷,橡皮筋等工具(constraint),吹风筒(NewtonField),来固定头发样式(setStartPosition),最后再加些发胶定型(setRestPosition)。Maya是个艺术软件,很多东西是结合现实来进行的,所以我们不用太惧怕那些条条框框。
6.头发初末状态的重要性
头发制作过程中,初末状态的设置十分重要。 setStartPosition(设置起始位置)一般用于定发型前的不断尝试,最后都会和结束态保持一致;setRestPosition(设置结束位置)则是发型静止时的形态参考。很多时候,由于各种运动和动力学影响,头发会处于运动状态中,结束态对头发行为的影响较为微弱。头发(hair)系统的这个原理和maya柔体(softbody)很像:柔体是通过粒子对几何体的goal目标权重来实现结束态的维持,而hair则是通过动力学曲线参考结束态曲线的方式进行,相当于柔体的一个分支功能。在使用约束进行发型制作时,必须要在交互式动画播放的情况下进行,当达到所需效果,应立即停止动画,然后在当前状态setStartPosition,否则hair的状态将在第一帧时还原。同时,发生位移变化的约束将从当前位置开始,必须再次调整初始位置才能继续进行。
我们可以使用Hair菜单下的一些工具对头发曲线进行调整。例如:ScaleTool可以调整头发的长度,但是要注意的是,一定要在起始帧的时候进行;如果是在解算过程中,可能会出现异常。
另外,可以通过手动调节曲线的cv点,并使用Surfaces菜单下的EditCurves对头发的初始或末态曲线进行各种编辑;还可以使用变形器对大量头发进行定型,但要注意此时不能锁定曲线的长度(LockLength),否则将在去除变形器历史后曲线形态发生异常。
如果需要对局部头发进行删除或者属性改变,还可以通过PaintHairFollicles(绘制头发毛囊)工具来完成。
7.头发碰撞
选择头发动力学曲线,执行Hair->CreateConstraint->CollideSphere,创建一个头发系统专用的碰撞球,模拟人物头部轮廓。此外,还需要多个碰撞球放置于角色的肩膀,胸部一带。要注意:虽然头发可以通过geoConnector节点和几何体进行直接碰撞(MakeCollide),但是很容易发生异常现象,所以要尽量使用ColllideSphere或者CollideCube来实现碰撞效果。Stiffness是碰撞球和碰撞方体最重要的设置参数,通常0.2至0.3左右即可(数值为0则不产生碰撞),过高数值会使头发发生一些异常的抖动。
碰撞球可作为最初的头发定型用,虽然在细节上不够精确,但对于完成大体轮廓还是很有帮助的,所以制作发型时除了头发的各种约束,碰撞球和碰撞方体也是很重要的辅助工具。
毛发对几何体的直接碰撞正如柔体曲线对刚体的碰撞,其反弹效果很难控制。
8.头发动力学参数的设置
此时再次涉及到场景比例和单位的问题。这点我除了有专门文章说明,在柔体,刚体以及布料系统的技术文章中也多次提到,由此可见,了解这些对maya的所有动力学特效是十分重要的。根据我自己惯用的标准比例1:10,这里要将头发系统节点Forces区块下的Gravity设置为9.8(默认的0.98是指在1:1的比例下的值),可直接得到较为真实的效果。当然,这是普遍的效果所用的参数值,某些特殊情况需要另作变更,当所处的环境是宇宙,水底,可根据表现效果的需要而变更。另外,头发的动力学行为,和曲线的段数也有很大的关系:段数越高,头发的运动就越柔顺,但这除了增加解算时间,效果上也不一定合理,因此要谨慎使用过高的头发段数。
#p#e#
9.头发渲染细节的设置
更改了力场,接着是头发笔刷的大小。人的头发丝在0.1mm左右(0.05mm-0.15mm),虽然maya不一定能按实际标准来完成这种精度的头发丝,但稍微研究下参数还是能得到很好的方案的。Brush节点是用于头发的渲染,但是头发的直径是由头发系统节点的HairWidth所控制。HairWidth默认值为0.01(厘米),也就是0.1mm,那么根据我的场景比例1:10,将HairWidth设为0.001即可。不过,这个数值达到了软件文本框可输入的最小值,无法再进行降低,因此我的做法是:保持HairWidth的默认值0.01不变,然后将Brush节点下的GlobalScale(全局缩放)参数设为原来的十分之一(将默认的5改为0.5)。于是,一个软件单位的头发丝诞生了。如果觉得还不够细,可以继续降低HairWidth的数值,但不应低于0.005(再低就是纳米纤维了)。
Displacements区块下的SubClumping会生成很多聚拢的发簇,常用于制作头发淋湿的效果,但对通常头发并没有太大的作用,反而会减少头发细节。
MultiStreaks(子头发)是在原有头发的基础上增加头发渲染的总数量。当设置为9,虽然数量上相当于HairPerClump数值为原来的10倍。不过因为MultiStreaks是在头发簇宽度的基础上生成,发丝的散布范围可超出ClumpWidth,细节更丰富;而HairPerClump是在ClumpWidth范围内的,如果头发宽度HairWidth*HairPerClump大于ClumpWidth,那就没什么意义了。因此,一般在设定好头发宽度和簇数量后,如需要增加头发密度,应该增加MultiStreaks的数值;而且相对而言,增加MultiStreaks的数量比增加HairPerClump渲染速度要快。当然,有时也需要适当的修改MultiStreakSpread1(头发宽度最大偏移)和MultiStreakSpread2(头发末梢最大偏移),因为当头发数量乘以头发宽度大于发簇宽度时,就没意义。
开启LightEachHair后渲染效果会好很多,尤其在子头发数量很多,头发运动时影响到头发自身阴影效果的时候。不过同样的,渲染时间也就增加不少。
尽管MultiStreaks在头发细节上不错,但是因为是简单的通过复制头发簇来完成,渲染效果并不尽如人意,因此一般都采用比较低的数值,如1。过多的话将造成头发高光效果的错乱。
因此为了更好的表现头发质感,适当的控制hairPerClump和ClumpWidth才是最佳的方案。
将笔刷Brush添加到头发进行渲染,可以得到更为丰富的效果。要注意,brush节点连接到pfx节点时,并不是所有的参数都有效,如笔刷的宽度和颜色,将被头发系统节点的头发宽度和发色所替换。而笔刷的高光属性则替代头发系统的高光设置(mentalRay会忽略),同时,头发系统节点下的MultiStreaks功能失效。
10.PaintEffect和Brush的关系
创建头发时选择PaintEffect的方式,和选择头发系统节点执行Hair->AssignPaintEffectBrush to Hair,效果上是不同的。前者仅仅是将曲线以笔刷的形式进行渲染,而后者则在头发系统中加入一个Brush笔触节点,提供了更为丰富的渲染效果(如果手动删除Brush节点,那么和创建头发时选择PaintEffect的方式是同样的效果)。
#p#e#
MayaSoftWare渲染PE特效时,是作为后期渲染的,只支持深度贴图阴影,无法渲染头发的反射;MentalRay渲染PE头发可支持反射和光线追踪成影,并且在使用光线追踪时效率很高,但MR渲染的头发相对较亮,且在头发细节上稍逊于software。使用MayaSoftware渲染时,开启Brush下的Illumination功能(默认是关闭的,MR渲染不需要开启,SW则需要),头发将得到高光照明的效果。关闭RealLight可以使用内置灯光照明,提高解算速度;而specular参数对头发高光的渲染效果没任何影响,取决定作用的仍然是头发系统节点下的specular。而且要注意的是,mentalRay将忽略Illumination区块下的所有功能。
以下是不同设置的效果对比。
#p#e#
【总结】
本质上,hair就是粒子动力学系统。它和柔体系统、内核布料系统有很多共通点,例如初始模型的保留,约束模拟碰撞,作用力的单位设置等。因此,要学习maya各个动力学模块,我们要了解的不是那些大量的固定参数,而是认识它们之间的共通点。Maya是个为艺术家而准备的软件,对此我是十分赞同的。
|