Skip to main content

Cloth

布料(Cloth)组件与带蒙皮的网格渲染器(Skinned Mesh Renderer)协同工作,从而提供基于物理的面料模拟解决方案。此组件是专为角色服装设计的,仅对蒙皮网格有效。如果向非蒙皮网格中添加Cloth组件,则 Unity 会删除非蒙皮网格并添加蒙皮网格。

网格与骨骼权重处理

因为布料与动骨是不同的系统,为了共存需要做相应的处理

大致为以下要求

  • 单层网格

确保衣服是单层的

  • 缝合网格

确保衣服是完整的

  • 分离干扰

衣服上的小配件可能会对布料模拟有所干扰

  • 四边形网格

如果衣服为三角形网格,可能不会有太好的模拟效果

如何缝合网格?

在Blender中删除合并重叠点。顶部菜单网格-清理-按距离合并左下角按间距合并,通过修改增大合并间距的数值让两个距离相邻的两个点合并。快捷键:M

添加布料

Inspector窗口中单击Add Component按钮,然后选择 Physics-Cloth

Edit cloth constraints(编辑约束)

您可以将约束应用于布料的特定顶点,以增加或减少这些顶点的移动自由度。

Cloth Constraints

属性 选项 功能
Visualization   选择要显示的约束类型和粒子。
  Max Distance 仅显示布料粒子的 Max Distance 值。
  Surface Penetration 仅显示布料粒子的 Surface Penetration 值。
  Manipulate Backfaces 启用此选项可以可视化和操控可能隐藏在布料当前朝向部分后面的粒子。
[ 色谱 ]   根据当前在整块布料中应用的最小值和最大值,为上述选定的约束类型提供粒子颜色和约束值之间的对应关系。黑色始终表示粒子没有约束。
Constraint Size   代表布料粒子的球体的显示大小。在方便时可以调整此值以便简化约束版本。这个属性对约束本身没有任何影响。

约束类型与颜色

约束类型 描述
Max Distance 布料可以从顶点位置行进的最大距离
Surface Penetration 布料粒子可穿透网格的深度

根据在Visualization所选类型,粒子的颜色表示该粒子的约束在布料内的相对值

约束版本模式

一共可以使用三种不同模式来编辑布料的约束值

1)Select

将固定约束值应用于已选择的粒子组

使用鼠标框选后,启用要应用于选定项的约束类型然后设定一个值即可

2)Paint

通过用画笔绘制布料粒子来施加固定的约束值

根据需要调整Brush Radius,启用要应用的约束类型并设置一个绘制值后用画笔在粒子上绘制约束

3)Gradient

将约束值从左到右线性渐变应用于预先选择的粒子组

需先确保在场景视图中开启2D视图

使用鼠标框选后,设置范围,然后选择要应用的约束类型

Edit cloth self/inter-collision(编辑自碰撞与互碰撞)

  • 自碰撞:防止布料穿透自身
  • 互碰撞:允许布料粒子相互碰撞

Cloth Self-Collision and Inter-Collision

属性 选项 功能
Visualization   选择要显示的约束类型和粒子。
  Self-Collision 自碰撞
  Inter-Collision 互碰撞
Manipulate Backfaces   启用此选项可以可视化和操控可能隐藏在布料当前朝向部分后面的粒子。

颜色

颜色 描述
黑色 未使用的粒子
蓝色 当前选中粒子
绿色 已应用碰撞粒子

应用

选择Select,使用鼠标框选后勾选Self-Collision and Inter-Collision即可

Self-Collison

在应用自碰撞与互碰撞后检查器会多出此选项

此时场景中粒子,可能会消失,将检查器Self-Collision Distance调大即可看到

属性 功能
Distance 每个粒子的包裹球体的直径。Unity 确保这些球体在模拟过程中不会重叠。Distance 属性的值应小于配置中的两个粒子之间的最小距离。如果距离较大,则自碰撞可能违反某些距离约束并导致抖动。
Stiffness 粒子之间的分离冲力的强度。此值由布料解算器进行计算,应足以保持粒子分离。

Paint与Erase

调整好Brush Radius后在场景中滑动以添加或删除用于碰撞的粒子

互碰撞

指定粒子与自碰撞相同,不过设置在Edit-Project Setting-Physics中勾选Cloth Inter-Collision,然后设置DistanceStiffness(功能与自碰撞的相同)

注意

自碰撞和互碰撞可能需要大量的总模拟时间。请考虑缩小碰撞距离并使用自碰撞索引来减少彼此碰撞的粒子数

自碰撞使用顶点,而不是三角形,因此对于三角形远大于布料厚度的网格,不要指望碰撞能够完美运行

检查器属性

属性 功能
Stretching Stiffness 布料的伸展刚性
Bending Stiffness 布料的弯曲刚性
Use Tethers 施加约束以帮助防止移动的布料粒子离开固定粒子的距离太远。此属性有助于减少过度拉伸。
Use Gravity 重力是否影响布料的模拟
Damping 布料运动时的阻尼
External Acceleration 施加在布料上的恒定外部加速度。在布料上固定的外部加速度,主要用于模拟风的效果,可设定XYZ方向
Random Acceleration 施加在布料上的随机外部加速度。在布料上随机的外部加速度,让布料产生不规则的摆动
World Velocity Scale 角色多大程度的世界空间移动会影响布料顶点。
World Acceleration Scale 角色多大的世界空间加速度会影响布料顶点。
Friction 布料与角色碰撞时的摩擦力。设定布料的摩擦系数
Collision Mass Scale 碰撞粒子的质量增加量。
Use Continuous Collision 启用连续碰撞来提高碰撞稳定性。
Use Virtual Particles 每个三角形添加一个虚拟粒子,从而提高碰撞稳定性。
Solver Frequency 解算器每秒迭代次数。
Sleep Threshold 布料的睡眠阈值。
Capsule Colliders 应与此布料实例碰撞的胶囊碰撞体的数组。
Sphere Colliders 应与此布料实例碰撞的球形碰撞体的数组。
virtual Particle Weights 虚拟粒子权重

参考数据

Stretching Stiffness:0.8

Bending Stiffness:0.2

Damping:0.2

World Velocity Scale:0(若想移动时晃动,改为0.2)

World Acceleration Scale:0(若想移动时晃动,改为0.2)

Friction:0

Collision Mass Scale:0

数据来源:https://www.bilibili.com/video/BV1ob411e7Q8

碰撞

布料仅可以与胶囊碰撞体球形碰撞体相互作用,其中两个球形碰撞体可以相连形成锥体碰撞。

碰撞体记得勾选is trigger(是触发器),不然游戏里移动或者跳跃会产生一股脚踩脚的感觉而且还会转圈

胶囊碰撞体

胶囊碰撞体由两个半球与一个圆柱体连接在一起组成

添加

在相应骨骼创建空物体,在检查器窗口中单击Add Component按钮,然后选择 Physics-Capsule Collider

属性

属性 功能
Edit Collider 选中即可在场景中可视化编辑大小
Is Trigger 如果启用此属性,则该碰撞体将用于触发事件,并被物理引擎忽略
Material 引用物理材质,可确定该碰撞体与其他对象的交互方式
Center 碰撞体在对象局部空间中的位置
Radius 碰撞体的局部宽度的半径
Height 碰撞体的总高度
Direction 胶囊体在对象局部空间中纵向方向的轴。

结构

image.png

添加到布料

直接将碰撞所在物体拖到Cloth(布料)Capsule Colliders(胶囊碰撞器)处即可

球形碰撞体与锥体

球形碰撞体是一种基本的球体形状原始碰撞体

添加

在相应骨骼创建空物体,在检查器窗口中单击Add Component按钮,然后选择 Physics-Sphere Collider

属性

属性 功能
Edit Collider 选中即可在场景中可视化编辑大小
Is Trigger 如果启用此属性,则该碰撞体将用于触发事件,并被物理引擎忽略
Material 引用物理材质,可确定该碰撞体与其他对象的交互方式
Center 碰撞体在对象局部空间中的位置
Radius 碰撞体半径的大小

添加到布料

Cloth(布料)Sphere Colliders(球体碰撞器)Size调整为非零值,每个元素可以放两个球体碰撞

如果只放入一个,则为球体碰撞

如果放入两个,那么两个球体碰撞将自动相连为锥体碰撞