unity 骨骼物理 头发 布料模拟

Posted 暮志未晚Webgl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity 骨骼物理 头发 布料模拟相关的知识,希望对你有一定的参考价值。

能够实现模拟布料效果的现在通常使用的有两种:

  1. DynamicBone
  2. MagicaCloth (https://magicasoft.jp/magica-cloth/)

一般现在使用的布料模拟,会选择这两种,第一种是直接对骨骼节点添加脚本进行操作,这里就不再赘述。重点讲一下MagicaCloth。

DynamicBone
https://www.bilibili.com/read/cv4338788/
https://blog.csdn.net/dengshunhao/article/details/105165215
https://zhuanlan.zhihu.com/p/526285709

DynamicBone是基于软骨骼实现的,而MagicaCloth则实现了一套布料系统。

当前游戏中使用的大部分还是DynamicBone,稳定性好。而MagicaCloth的布料模拟会模拟的更加精细,根据其不断的迭代,相信其在未来会成为主流。

布料模拟实现原理:
基于Mass-Spine模型(质点-弹簧)
质点:粒子,有质量的点,会受到外力的影响。
弹簧:链接两个质点,受质点影响,会造成拉伸,旋转,弯曲等情况。
所谓的质点-弹簧模型,就是仿真一些有质量的质点,再在质点之间构建出来一些虚拟的弹簧,模拟当前网格的运行。
在模型当中,布料被当做网格上的质点来进行模拟,这些质点会被弹簧进行连接。弹簧会连接两个质点,并基于质点的位置和速度来产生作用力。
我们可以通过修改质点的质量参数,弹簧的类型以及阻尼因子等参数,实现丝绸,棉麻等等不同的布料模拟。

使用MagicaCloth的具体流程:

  1. 生成虚拟的Mesh,减少计算的面数,节约性能。
  2. 生成质点弹簧结构体,可以通过Open Cloth Monitor 进行对生成的结构进行查询,可以查询质点 弹簧等相关信息。
  3. 设置相关的碰撞体,防止布料穿插进入身体等。
  4. 调节参数,设置理想效果。

接下来进入具体操作流程:

  1. 选中当前需要设置的模型节点

这里我准备对这个女性角色的胸前的头发,添加上物理效果。

首先添加一个MagicaRenderDeformer脚本,添加这个脚本以后,标示着,这个模型会参与布料模拟计算。注意,如果面数超过了6w面,将无法计算。

第二步,添加MagicaVirtualDeformer,这个脚本主要用于生成虚拟的网格,简化计算内容。

添加了以后,需要将当前模型拖拽到Render Deformer List 上面,用于生成用于计算的原始网格。

然后在下面Reduction Setting下面,我们可以根据顶点距离和三角形距离进行合并,来生成虚拟网格,也可以设置相同面角度相同合并。
如果你需要原始的网格模型的结构,推荐使用面合并,如果不需要,那就使用顶点合并。根据顶点距离合并生成的数据更轻量化一些。

设置数据,后,上面不会再显示No Data,而是显示生成的虚拟网格的数据,我们发现三角面数从之前的1.5w变成了当前的2000等等。

最后,就是使用虚拟网格生成质点弹簧了,这里需要添加一个脚本,MagicaMeshCloth

将虚拟网格脚本挂载的对象拖拽到第一个选项。
然后点击Start Point Selection,进行顶点设置,这个是用来控制质点的可移动性,绿色为可移动,红色为不可移动。

这里我将头发贴近头的部分全刷成了红色

下面还可以添加与当前质点弹簧交互的碰撞体,以及相关参数配置。还有一些预设

设置完成后,将显示当前生成的质点弹簧数据

然后我们点击 Open Cloth Monitor,可以看到当前的生成的质点弹簧数据


数据查看面板

关于质点深度的生成,是从不动的质点往动态质点渐变的,所以,动态质点最远的深度为1,这样会有一个渐变。
旋转弹簧可以看到根据面片生成的一根根的单独的线,这些弹簧也是从静态质点到动态质点有个动态的变化。

接下来就是设置碰撞体,碰撞体可以防止衣料模拟时和其它模型进行穿插,限制其位置。

Merge Avatar Collider 可以实现自动合并碰撞体,让我们设置在角色模型上的碰撞体也可以影响到衣料模拟。
我们还可以在碰撞体列表中添加一些碰撞体节点,还实现额外的碰撞体交互。
在给模型添加碰撞体时,可以在需要添加的骨骼节点下面创建一个空节点,可以在空节点上面调节它的大小和位置,然后挂载碰撞体脚本,可以挂载的脚本有 MagicaCapsuleCollider 胶囊体碰撞体 MagicaPlaneCollider 平面碰撞体 MagicaSphereCollider 球型碰撞体
查询当前场景内的碰撞体,在搜索框输入:t:magicaSphereCollider t:magicaCapsuleCollider t:magicaPlaneCollider

设置参数
最后一个步骤就是调节参数,让布料模拟达到一个理想的效果。

下面一个个解释当前参数设置。

Algorithm 为当前布料模拟的算法实现。

Radius 质点的半径 设置质点碰撞体的大小。

Mass 质量 较重的质点更难移动,而较轻的质点更容易移动。基本上,如果起点较重,终点较轻,布料模拟会更稳定

Gravity 重力 自然界重力值为9.8,个人建议调低此数值,或者直接设为0,用来模拟地球引力效果

External Force 设置外力的影响程度,比如风力,还有物体甩动的力。

Drag 空气阻力 该值越高,空气阻力越大,质点惯性衰减越快

设置质点的最大速度

物体在世界空间运动对质点的影响程度,可以手动指定节点。
Influence Target:默认为空时,将选择该布料组件的Transform作为参考物。一般建议将人物的盆骨hip骨骼作为参考物
Movement 相关属性是控制Influence Target位移时对其产生的影响。
Rotation 相关属性则是在物体旋转时对其产生影响的程度配置。
Reset After Teleport 在节点发生瞬移以后,是否需要重置,默认勾选会重置,或者根据需求调节它下面的属性。

远离目标节点多少距离以后,会关闭掉布料模拟效果,可以设置根据相机距离来优化性能。
Reference Object 布料模拟和目标的位置
Distance 多少距离内需要模拟
Fade Distance 缓冲区域,当前的值为 20-5 到 20 内

设置粒子可以从起点移动的最大距离。当前数值为百分比
前两个值是和起点的最大百分比和最小百分比。
Velocity Influence 速度影响 将其设置为较低的值可以减少粒子响应突然移动而移动的问题。 然而,粒子的惯性也会丢失。


限制质点和原来位置的距离

限制质点的旋转度


调节弹簧的特性,还可以开启或者关闭某种弹簧的特性。
Struct Stiffness 用来调节弹簧的刚性,值越大弹簧恢复的就越快,值越小,恢复速度就越慢。
Blend Point 开启弯曲弹簧
Blend Stiffness 用于调节弹簧弯曲性
Near 可选,弹簧是根据质点之间的距离生成的弹簧,忽略原始结构,简单地连接那些靠近的粒子。这种连接使形状保持牢固,但也使其不易变形。

对应Monitor上面的三种显示

弹簧旋转的恢复

对应Monitor里面的Rotation Line

为一个恢复默认形状的一个强度,可以通过这个值来调节恢复两个连接三角形的角度恢复到其原始角度的一个力度。

对应Monitor里面的Triangle Bend 显示

对于碰撞相关的调节
Dynamic Friction 动态摩擦力 作用在切线方向上的力 增加该值会导致质点很难移动
Dynamic Friction 静态摩擦力 作用在法线方向的粘合力 增加该值会导致物体立刻停止在碰撞体上面
光滑的表面可以将两个值减少到 0.05左右,棉麻物体可以适当增加到0.1 0.2

设置这个可以防止布料模拟插入碰撞体内部
具体文档请查看此处
https://magicasoft.jp/en/prevent-penetration-2/

Fixed Non-Rotation 启用时,固定粒子将完全不旋转。 设置为“OFF”时,固定粒子将沿链接的移动质点的方向旋转。
Line Avarage Rotation 开启时,质点将平滑的进行旋转,推荐一直开启。关闭时,质点将固定朝向弹簧方向,如果是耳环等物体,效果还可以。

以上是关于unity 骨骼物理 头发 布料模拟的主要内容,如果未能解决你的问题,请参考以下文章

计算机图形学动画

Unity 物理系列六 布料

小球自由落体动态模拟(Position Based Simulation)

网格弹簧质点系统模拟(Spring-Mass System by Fast Method)

Unity Adam角色部分

如何将布料模拟从 Blender 导入 Unity