一些布料模拟trick方案的分享

Last modified date

用很小的开销模拟布料物理,适合移动端

球网模拟

把球网的四个面uv展开成矩形,然后用一个小尺寸的RT来模拟简单的流体场,最后用顶点偏移的方式扰动球网模型。能达到和真实物理相似的效果。

  • RT设置成2:1的尺寸比例刚好能适配长方形的球网,RT的尺寸256×128足矣。
  • 两个球网可以拼在一张1:1的RT上,但其实足球游戏基本上同时只能看到一个球网,没有必要。
  • 我只用了RT的两个通道:一个update了流体波形扩散,另用一个通道绘制了offset权重。球网的固定绳索的地方权重小,而松弛的网面权重大。具体权重的分布可以根据球网的模型来设计。
  • 最后在shader里采样RT做顶点偏移(球网Normal方向 x RT波形 x RT权重)

这个方案虽然没法做到很精确的物理模拟,但大致效果已经有了。

服装根据身形变化

这个方案是从《模拟人生4》手游版里学来的。视频链接 25分钟”Deformation Map“

做法如下:

首先角色身体模型需要展出一个足够均匀分布的UV,这是为了后续做变形的时候能尽量贴合。(我做的演示的模型并没有很好的展UV,这个UV图就用《Sim 4》的截图示意了)

把身体模型复制出一份,刷出胖子的模样,注意这两个模型顶点数据必须一样,只是顶点坐标不同。

然后把胖模型每个顶点相对于原始顶点的偏移bake到一张图里,即Deformation Map。注意这张图是逐像素bake的。

衣服的模型可以写工具来展UV2来适配Deformation Map。做法就是从衣服模型的顶点沿着法线反方向跟身体模型做碰撞检测,再把碰撞点映射到身体UV图里,生成衣服的UV2。

最后就是代码传递胖瘦参数给shader,衣服的shader采样Deformation Map做顶点偏移来适配体型变化。

这同样也会用到刷权重来控制offset,例如裙子和挂件这种不贴身的部分权重就小。具体可以看《Sim 4》的分享。

服装褶皱根据动作变化

Wrinkle map这种方案很常见。做法就是bake两套normal map,根据动作变化来lerp。因为大部分人形或者动物的模型都是左右对称的,所以一般只要制作一个方向的变化的normal map,镜像使用。

动作变化数据来自于某几根关键骨骼的变化,效果好坏需要根据经验来调整。

《荒野大镖客》里的马也用了这种方案来模拟肌肉动感,这种方案技术上可能就是几行代码,工作量是在美术效果上。