Havok中布料建模的核心概念
这里面Simulation Cloth,以及Buffer都可以被看做承载粒子和弹簧数据的容器,Collidable是用于碰撞的胶囊体,布料属性通过一系列Operator来进行设定,多个Operator组成一个State,多个State又可以重复执行以多次模拟计算的方式获取更好的布料效果。为了避免布料穿插或者提升碰撞检测的效率,Havok又提供了Local Range Constraints、Bone Global Plane Constraints等多种约束来在正常的模拟之外限定布料粒子可以运动的范围,比如Local Range Constraints就以半径、最小距离和最大距离这三个参数指定了粒子可以运动的空间范围。
可见Havok中对于布料系统的设计和实现是如此的复杂。因此,在查阅Unity中布料制作方法的时候我以为会有大量的资料和内容需要学习,结果官方文档中的Cloth部分只有几屏幕内容,而其除了用于处理碰撞之外的核心组件只有Cloth Component一个,并且整个制作过程是在Unity Editor内部的,着实让我有点意外。在学习具体制作方法之前,还是老思路,先对Unity丰富的插件进行一下调研。
5.1 插件调研
需要提前说明的是,前文所描述的布料系统及其原理,主要是针对在主机和端游上使用的物理模型的布料效果,它们基于网格顶点,可以做到非常精细的效果。其实还有一种制作布料效果的方法——基于骨骼进行物理模拟。这种方法的原理更加简单,把骨骼当做一个个通过关节连接在一起的铰链,给予一定的物理参数,来模拟动画之外的动态效果,而最终效果是通过蒙皮反应到模型网格上的。由于骨骼数量通常都比顶点数量少很多,因此这种方法具有更高的运行效率,在手游中使用得也比较多,前面对于《王者荣耀》中妲己的辫子截图,笔者猜想就是使用的类似的方法。
沿着这两个不同的思路,笔者查看了几个相关的插件。 a. 基于骨骼的方案。基于骨骼的方案在Unity的AssetStore上有多个实现,原理都差不多:Dynamic Bone、Swing Bone、PhysicsBone b. 基于质子-弹簧模型的方案。主要看了两个,一个是官方的Cloth Component,一个是Obi Cloth。
5.2 制作方法
Dynamic Bone组件
Dynamic Bone插件的使用比较简单,进行一定的配置之后,角色的飘带等就可以在角色移动、播放动画、旋转等情况下有了一些惯性感的动态效果。这里列举几点具体使用时的小Tips:
a. 骨骼链不能通过Optimize Game Object进行优化。这个要求很容易理解,如果在C#层无法取得骨骼对应的GameObject,自然无法对其进行修改。
b. 整个Dynamic Bone组件必须放置在Animator所在的外层才能正常起作用,也就是需要在Animtor所在的GameObject的父节点上添加Dynamic Bone组件才可以。由于我们之前Animator是在角色模型GameObject的最外层的,因此这个需求需要对之前的角色模型结构进行一点小的修改。
c. 最终效果依赖于骨骼链的数量。我们对于飘带等使用的骨骼进行了非常强的限制,通常只有1-2根,因此结果也可想而知,飘动时有比较明显的折角现象。
d. 必须单独绑定骨骼的面片才可以做出动态效果。我们有些饰品和短的飘带绑定到了角色的脊柱等核心骨骼上面,这些骨骼是不能被用来做动态骨骼的,否则角色真个身体就扭曲掉了……
Unity官方所带的Cloth组件使用稍微复杂一点,但是也不太难,基本步骤包括:
Unity Cloth组件
具体制作的细节流程这里不详述了,提供一个Youtube上的教学视频,有比较详细的过程——《GAME ASSET TUTORIAL - How to Create a Cloth in Unity 5 (PART 2/2)》。
Cloth组件的效果因为是基于网格的,因此不需要绑定骨骼也可以做出动态的效果,而且飘动的单元是mesh顶点,因此效果也比较细腻。(我们的角色面数也比较省,当然做不到像端游那么精细的效果。)
5.3 方案对比