浅谈角色换装功能--前置篇【骨骼,蒙皮,动作】

  无论是AAA级的主机游戏,还是层出不穷的移动端游戏,角色换装几乎都是必不可少的功能,有的甚至是核心功能,像暗黑3和魔兽世界的幻化系统(如图1)。这个功能没什么新鲜点。网上关于Unity换装的文章不胜枚举,我再添一篇也没意思,本系列旨在通过换装功能的实现,来讲解一些被Unity引擎所隐藏起来的那些细节。

浅谈角色换装功能--前置篇【骨骼,蒙皮,动作】_第1张图片浅谈角色换装功能--前置篇【骨骼,蒙皮,动作】_第2张图片

                                (图1:暗黑3和魔兽世界的幻化系统.来源:互联网)  

  我刚刚上班的时候就奇怪,同样都是FBX文件,有的导入到Unity后渲染组件就是MeshRenderer,而有的则是SkinMeshRenderer。记得当初还问过前辈,不过他的回答记不清了,总之我没有听懂。不知道大家是不是曾经也有过类似的疑问。Unity是一款很容易上手的引擎,但代价就是隐藏了很多实现细节。如果不能明白背后的原理,那么在做一些功能时总是感觉隔靴搔痒本。本文标题中提到骨骼,蒙皮,动作.我们的整个换装也正是围绕这三个核心来展开。先来简单解释一下它们。


骨骼



  我们在引擎中使用的任何可绘制的物体,也就是mesh,往往是由顶点信息所组成的集合。渲染的过程,也就是利用这些顶点信息,把这些模型绘制出来。如果对于没有动作的静态模型,这一切就足够了。当我们提到模型动画的时候,无论以何种方式来实现动画,最本质上都是对模型顶点集合的一系列变换。所以在3dmax中要想制作一个动画,并不需要一定有骨骼,你可以在关键帧中直接修改模型的顶点信息。可以想象,这种方式无疑是低效的,特别是对于复杂的模型的复杂动作。这也就引出了"骨骼+蒙皮"的工作方式。在3DMAX中,有两种骨骼,分别是Bones和Bip(如图2).前者的自由度较高,后者则是特殊版的Bones,按照人体的骨骼结构,制定好规范,直接使用。Bones的一般用于场景物件和非脊椎动物的动作,比如披风,旗帜,鸟类,而Bip大多用于脊椎动物,或类人生物的主体部分。本系列中主要以Bip骨骼为例,这是一个典型的父子层次结构。基本符合人体的关节布局和限制。这样基于骨骼来制作动画,既直观又方便。

浅谈角色换装功能--前置篇【骨骼,蒙皮,动作】_第3张图片浅谈角色换装功能--前置篇【骨骼,蒙皮,动作】_第4张图片

                  (图2:左为Bone,右为Bip.来源:互联网)

使用Bip还是Bone不是绝对的,对于稍微复杂一点的模型,通常是两者结合,如下图中对于初音的骨骼搭建,可以发现身体的主要结构是使用Bip,对于头发和裙摆处则使用更自由的Bone骨来进行细节化处理。

浅谈角色换装功能--前置篇【骨骼,蒙皮,动作】_第5张图片

        (图3:bip+bone结合使用。来源:互联网)

 


蒙皮



  前面我们提到动画实际上mesh的顶点在进行运动。单纯的骨骼并不会对Mesh顶点的变化有任何影响,而蒙皮的意义就在于把Mesh上的顶点与对应骨骼关联起来。之后只需要对骨骼进行动画关键帧的制作,就可以带动模型的顶点产生变化。那骨骼具体是怎么与mesh顶点关联的呢。模型的骨骼结构中的每个节点都会在整个骨骼架构中中有一个序号,比如(根节点的序号可能为0),然后模型上的每个顶点都记录它受哪几根骨骼的影响,以及影响的权重多大(虽然max中没有对受骨骼影响的数量限制,但一般为了运行效率不会超过三根,如图4)。

浅谈角色换装功能--前置篇【骨骼,蒙皮,动作】_第6张图片

          (图4:蒙皮过程中对顶点对应骨骼的权重修改)

  负责角色建模的美术同学,往往会把模型建成双手向两侧抬起的姿势,这个姿势叫作T-pose(也叫绑定姿势,如图5)。这样做是为了方便动作美术进行蒙皮,蒙皮后模型上每个顶点都会保存在绑定姿势下相对于部分骨骼的相对位置。当对骨骼进行动画操作时,这些顶点就会实时的根据它所绑定的的各根骨骼的当前位置,及影响的权重,进行空间变换和插值,以计算出新的位置。这个过程展开的话会稍微有一些复杂。感兴趣的朋友可以去看《游戏引擎架构》里的详细讲解。

浅谈角色换装功能--前置篇【骨骼,蒙皮,动作】_第7张图片

      (图5:绑定姿势T-pose)


动作



  所有蒙皮后Mesh,都应该通过调节骨骼来制作动画,如我前面说的,因为此时模型上的顶点位置已经是实时通过骨骼位置和权重实时计算出来的了。这也就是为什么对Unity中带有skinMeshRenderer组件的GameObject进行移动,旋转等操作,并不会影响模型的最终渲染。而具体在存储上每一根骨骼都会记录一个在当前动作帧的情况下,骨骼相对于父节点SQT(缩放,平移,旋转),也可能是其它数据结构,用来记录它的姿势。假定游戏的预期帧率是60FPS,美术设计一个时长1s的行走动画,也就是在max里你可以看到60帧,但美术并不会一帧一帧的key动作,而只会在几个关键的时间节点上插入关键帧,设定好相应的动作。在播放的时候,运行到关键帧以外的动画帧时,各个骨骼数据的位置是通过其两边的关键帧上的骨骼数据进行插值来的。插值的种类也有很多,我还没深入研究过,不展开了。但是这种插值过度并不一定让设计者满意,就可以进一步添加关键帧来解决。

    浅谈角色换装功能--前置篇【骨骼,蒙皮,动作】_第8张图片浅谈角色换装功能--前置篇【骨骼,蒙皮,动作】_第9张图片

      (图6:在动作条上添加关键帧,并在关键帧上调整骨骼动作.来源:互联网)    (图7:动作关键帧插值后形成动画.来源:互联网)

 


总结



  串起来说一下,角色美术建立好T-pos下的模型后,交给动作美术,动作美术基于模型的姿势,大小,形态来选择Bip或者bone骨骼来搭配出相应的骨骼结构。然后进行绑骨,把Mesh上的顶点和对应的骨骼关联起来。这样在后面制作动作关键帧的时候,骨骼的变化会带动与其绑定顶点的变化。整个流程,听起来很简单,每个环节都有专门的美术负责,原画,模型,动作.本文是这个系列的前置篇,虽然不懂这些具体的美术流程,也并不影响使用引擎的API来进行换装的实现。但是不明白这背后的美术流程,乃至更深层的数学原理,便不会变通,做的功能也不够灵活。

  在之后的文章中,我们通过在Unity中实现一个简单的换装功能,其中的一些内容也会涉及本文的知识点。

  尊重他人智慧成果,若要转载,请注明作者esfog,原文地址http://www.cnblogs.com/Esfog/p/EquipChange_ArtKnowledge.html 

转载于:https://www.cnblogs.com/Esfog/p/EquipChange_ArtKnowledge.html

你可能感兴趣的:(浅谈角色换装功能--前置篇【骨骼,蒙皮,动作】)