# 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`,然后设置`Distance`与`Stiffness`(功能与自碰撞的相同)
### 注意
自碰撞和互碰撞可能需要大量的总模拟时间。请考虑缩小碰撞距离并使用自碰撞索引来减少彼此碰撞的粒子数
自碰撞使用顶点,而不是三角形,因此对于三角形远大于布料厚度的网格,不要指望碰撞能够完美运行
## 检查器属性
属性 | 功能 |
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](https://www.bilibili.com/video/BV1ob411e7Q8)
## 碰撞
布料仅可以与`胶囊碰撞体`或`球形碰撞体`相互作用,其中两个`球形碰撞体`可以相连形成锥体碰撞。
碰撞体记得勾选`is trigger(是触发器)`,不然游戏里移动或者跳跃会产生一股脚踩脚的感觉而且还会转圈
### 胶囊碰撞体
胶囊碰撞体由两个半球与一个圆柱体连接在一起组成
#### 添加
在相应骨骼创建空物体,在`检查器`窗口中单击`Add Component`按钮,然后选择 `Physics`-`Capsule Collider`
#### 属性
属性 | 功能 |
Edit Collider | 选中即可在`场景`中可视化编辑大小 |
Is Trigger | 如果启用此属性,则该碰撞体将用于触发事件,并被物理引擎忽略 |
Material | 引用物理材质,可确定该碰撞体与其他对象的交互方式 |
Center | 碰撞体在对象局部空间中的位置 |
Radius | 碰撞体的局部宽度的半径 |
Height | 碰撞体的总高度 |
Direction | 胶囊体在对象局部空间中纵向方向的轴。 |
#### 结构
[](https://docs.vrcd.org.cn/uploads/images/gallery/2024-04/S92NlD2MkxtcX2YY-image.png)
#### 添加到布料
直接将碰撞所在物体拖到`Cloth(布料)`的`Capsule Colliders(胶囊碰撞器)`处即可
### 球形碰撞体与锥体
球形碰撞体是一种基本的球体形状原始碰撞体
#### 添加
在相应骨骼创建空物体,在`检查器`窗口中单击`Add Component`按钮,然后选择 `Physics`-`Sphere Collider`
#### 属性
属性 | 功能 |
Edit Collider | 选中即可在`场景`中可视化编辑大小 |
Is Trigger | 如果启用此属性,则该碰撞体将用于触发事件,并被物理引擎忽略 |
Material | 引用物理材质,可确定该碰撞体与其他对象的交互方式 |
Center | 碰撞体在对象局部空间中的位置 |
Radius | 碰撞体半径的大小 |
#### 添加到布料
在`Cloth(布料)`的`Sphere Colliders(球体碰撞器)`将`Size`调整为非零值,每个元素可以放两个球体碰撞
如果只放入一个,则为球体碰撞
如果放入两个,那么两个球体碰撞将自动相连为锥体碰撞