依赖包
Magica Cloth 使用 Job System 和 Burst compiler 加快布料模拟,所以需要先安装这两个依赖包
Burst 可以直接下载
在这里插入图片描述
Job System 得通过 URL 添加,输入com.unity.jobs,设置中也要开启Enable Pre-release Packages
另外为了看到模型的骨骼节点,还要下载Animation Rigging
组件
名称 | 图标 | 介绍 |
---|---|---|
MagicaPhysicsManager | 管理器,使用时会自动创建 | |
MagicaBoneCloth | 控制骨骼(Transform)进行布料模拟,带骨骼的衣服和头发都可以用 | |
MagicaBoneSpring | 控制骨骼(Transform)进行弹簧模拟,适合胸部抖动 | |
MagicaRenderDeformer | 渲染变形器,用于对模型的网格进行变形,当使用 MeshCloth / MeshSpring 时需要,性能消耗大 | |
MagicaVirtualDeformer | 虚拟变形器,通过结合多个渲染变形器进行顶点缩减,并重构为一个虚拟网格。使用MeshCloth / MeshSpring时需要,性能消耗大 | |
MagicaMeshCloth | 对网格顶点进行布料模拟,适用于无骨骼的模型,可以实现比Bone Cloth更加精细的控制,是控制裙装的理想选择,与虚拟变形器一起工作,性能消耗大 | |
MagicaMeshSpring | 对网格顶点进行弹簧模拟 | |
MagicaSphereCollider / MagicaCapsuleCollider / MagicaPlaneCollider | 球形,胶囊形,平面形碰撞器,防止穿模,球形和胶囊形主要用于人体,胶囊形消耗更大,平面形主要用于地面 | |
MagicaDirectionalWind / MagicaAreaWind | 全局的风,区域的风 | |
MagicaAvatar | 用于换装,添加到身体部分 | |
MagicaAvatarParts | 用于换装,添加到其他部分,如衣服,头发 |
Magica Cloth的物理引擎完全独立于Unity的物理学引擎,因此,它完全不干扰Unity的物理系统。
MagicaPhysicsManager
MagicaPhysicsManager这个prefab是插件中自带的,运行时使用插件相关的组件后就会自动创建
Update Per Second | 物理引擎每秒更新次数 |
---|---|
Update Mode | Unscaled Time - 刷新率不受 Unity 的 time scale 影响 |
Once Per Frame - 每帧更新一次,当使用这种模式时,Update Per Second 需要根据游戏的帧率来调整。 | |
Delay Unscaled Time - 延迟执行,与 Unscaled Time 一样,但在渲染时也能进行布料模拟,能大幅提高性能,但结果会晚一帧,这个延迟是通过未来预测来插值的 | |
Update Location | 在 Late Update 之前或之后更新 |
Faster Write | 使用 Unity 的新 Mesh API 更新网格顶点,提高网格更新速度,版本要大于 2021.2 |
OnPreUpdate / OnPostUpdate | 在布料模拟之前或之后注册事件 |
MagicaBoneCloth 模拟头发,衣服飘动
MagicaBoneCloth 和 MagicaBoneSpring 都是通过改变骨骼节点Transform的位置和旋转来实现飘动效果
把模型拖入场景,点击模型,选择Bone Render Setup显示模型的骨骼,方便选择对应骨骼
这个模型后面有长发和两边的侧发,长发和侧发的参数设置不同,这里以长发演示
右键创建一个 Magica Bone Cloth,并改名为长发
这里有错误提示是因为还没有生成数据,将长发的根节点添加到Root List,点击Start Point Selection进入节点编辑模式
红色表示固定节点(Fixed Point),它不会移动,但是会旋转,一般就是根节点,每个可移动的骨骼链上,第一个节点必须是固定节点。
绿色表示活动节点(Move Point),受物理系统影响
还有一种灰色节点表示无效节点(Invalid Point),不参与物理运算
如果需要修改节点类型,先选择节点类型,按住左键在场景中拖动即可改变节点颜色
调整完后, 点击 End Point Selection 结束编辑
下面就是物理模拟相关的参数,这里提供了一些预设,点击Preset选择长发类型的预设,会自动修改适合长发的参数
头发相关的预设:前发(FrontHair),长发(LongHair),脸两侧头发(SideHair),马尾(PonyHair),短发(ShortHair)
衣服相关的预设:柔软的裙子(SoftSkirt),硬裙(HardSkirt),长开衩连衣裙(LongSlitDress)
尾巴或身上飘动的装饰物:Tail
最后点击Create生成数据
上面的错误提示消失,显示了一些参数。现在运行时拖动角色,长发会有抖动的物理效果,但是会有穿模的情况,所以还需要处理下穿模的问题。
Magica Cloth提供了两种穿模的解决方法,表面穿模(Surface Penetration)和碰撞体穿模(Collider Penetration)。
如果衣服(头发)与身体上的骨骼有关联的话,衣服会随着身体动作跟着运动,如图腿动的时候,裙子也会跟着动,这种情况可以选择表面穿模,表现力更好。
如果衣服(头发)与身体上的骨骼没有关联,衣服(头发)完全由自己的骨骼控制,如图腿动的时候,裙子不会动,这种情况使用碰撞体穿模。
模型属于第二种情况,所以选择碰撞体穿模
正常情况下,应该在头部,躯干,四肢都加上球形(MagicaSphereCollider)或胶囊形碰撞体(MagicaCapsuleCollider),这里为了省事儿只在躯干上添加胶囊形碰撞体
为了长发和碰撞体进行碰撞检测,还需要把这个碰撞体添加到长发的ColliderList中,再次点击Create生成数据,运行查看效果
下面处理下裙子
模型前面的裙摆和后面的裙摆被处理成了几个独立的片,这里只处理下后摆,新建一个MagicaBoneCloth改名为后摆
将后摆的几个根节点添加到Root List,并修改连接模式(Connection Mode)为Mesh Sequential No Loop,表示这几个骨骼链形成一个不闭合的网格面,连接模式指定Root List中骨骼链的连接方式。
Connection Mode | Line - 表示单条骨骼链从父级到子级是线性结构的,两条骨骼链是独立的 |
---|---|
Mesh Automatic - 自动连接附近的骨骼节点创建一个网格结构并进行连接,它不受Transform的父-子关系的影响,不适合太复杂的结构 | |
Mesh Sequential Loop - 按照在RootList中的顺序生成网格,并连接第一条和最后一条骨骼链 | |
Mesh Sequential No Loop - 按照在RootList中的顺序生成网格,但不连接第一条和最后一条骨骼链 | |
Same Surface Angle | 只在连接模式为网格时有,表示生成网格法线的角度(0-90) |
连接模式选择Line,那么裙子上的每条骨骼链就分别单独进行碰撞检测,这样物体可能从两条骨骼链之间的缝隙穿过产生穿模
首尾相连的裙子选择Mesh Sequential Loop,生成闭合的网格面,这样碰撞检测更加精确
有的裙子不是闭合的就选择Mesh Sequential No Loop
在腿上创建碰撞体添加到Collider List,预设选择NormalSkirt,点击Create生成数据,运行查看效果
MagicaBoneSpring 模拟胸部抖动
与 MagicaBoneCloth 基本类似,Create Other -> Magica Cloth -> MagicaBoneSpring,右键先创建一个 MagicaBoneSpring 并改名为胸部
找到模型身上的胸部节点添加到 Root List
预设选择Breast,点击Create生成数据,运行时查看效果
MagicaMeshCloth 模拟裙子飘动
参考官方示例,使用Unity Chan模拟
首先,必须开启模型上的Read/Write选项,这是为了读取并修改模型身上的顶点,MagicaCloth不支持具有4个或更多顶点的多边形,所以Keep Quads必须关闭
在裙子,上衣,拉链这三个Mesh Renderer上都添加 MagicaRenderDeformer(渲染变形器),它能对网格进行变形,添加后会自动创建数据,如果上一步Read/Write选项没有开启,这里会报错
Create Other -> Magica Cloth -> MagicaVirtualDeformer,然后创建一个MagicaVirtualDeformer(虚拟变形器),把之前三个 MagicaRenderDeformer(渲染变形器)添加到Render Deformer List中,点击Create生成数据,如果这里报错,点击渲染变形器上的Create重新生成数据。MagicaVirtualDeformer的作用是将一个或多个MagicaRenderDeformer转换为一个虚拟网格,减少顶点,将高多边形网格转换为低多边形网格。这个虚拟网格只用于布料模拟,所以实际模型网格不会被减少。从Cloth Monitor中可以看到虚拟网格的顶点数和三角面数
Reduction Setting 调整下面的参数可以减少顶点数量,简化网格,修改后重新点击Create
参数 | 描述 |
---|---|
Merge Vertex Distance | 在这个距离内合并顶点,忽略网格的连接性 |
Merge Triangle Distance | 在这个距离内合并三角面,考虑网格的连接性 |
Same Surface Angle | 如果两个连接的多边形小于此角度,则认为它们是相连的 |
Use Skinning | 勾选会对所有顶点的骨骼权重进行重新赋值,取消勾选减少物理计算的负担 |
点击Open Cloth Monitor可以看到这个虚拟网格
Create Other -> Magica Cloth -> MagicaMeshCloth,然后创建一个MagicaMeshCloth并改名为衣服
这几个组件之间的关系
接下来的操作和MagicaBoneCloth差不多。添加虚拟变形器的引用,点击Start Point Selection修改顶点类型
这一步比较麻烦,它没有自动帮我们设置类型,需要手动设置,把裙子部分设置活动节点(Move Point),活动节点需要连接固定节点(Fixed Point)
在腿部添加两个胶囊形碰撞器并添加到Collider List中
预设选择Skirt,点击Create生成数据,运行时查看效果
MagicaMeshSpring 模拟胸部抖动
前面和MagicaMeshCloth差不多,先给胸部附近的Mesh Renderer添加MagicaRenderDeformer(渲染变形器)
Create Other -> Magica Cloth -> MagicaVirtualDeformer,创建一个MagicaVirtualDeformer,添加胸部附近的MagicaRenderDeformer,点击Create生成数据,可以调整参数适当简化网格
Create Other -> Magica Cloth -> MagicaMeshSpring,新建一个 MagicaMeshSpring 并改名为左胸
添加MagicaVirtualDeformer的引用,Center Transform 就是 MeshSpring 摆动的中心,选择左胸节点,如何没有合适的节点可以创建一个Transform节点,调整位置到中心,黄色箭头是摆动的前方向,差不多是z轴正向,所以Direction Axis选择Z
预设选择Breast,点击Create生成数据,右胸的处理一样
运行时发现摆幅比较大,还需要调整下Spring参数,参考下面参数说明
MagicaDirectionalWind / MagicaAreaWind 风
MagicaDirectionalWind 是控制全局的风
参数 | 描述 |
---|---|
Main | 风量 |
Turbulence | 风的湍流率,在0.0时,风总是从某一方向流动,在1.0时,风向会随机变化 |
Frequency | 风向变化的速度,你可以改变湍流变化的速度 |
Direction Angle X/Y | 绕X/Y轴旋转的角度 |
需要配合Unity的WindZone组件使用,修改MagicaDirectionalWind风量Main会同步修改Wind Zone的风量Main,可以将两者做成一个预制体在场景中使用
衣服,头发受到的风力通过External Force参数设置,参考下面的参数说明
MagicaAreaWind控制局部区域的风,可以设置方形或球形区域,用它可以实现爆炸时猛烈的气流效果
参数 | 描述 |
---|---|
Main | 风量 |
Turbulence | 风的湍流率,在0.0时,风总是从某一方向流动,在1.0时,风向会随机变化 |
Frequency | 风向变化的速度,你可以改变湍流变化的速度 |
Shape Type | 方形或球形 |
Direction Type | 球形时有效,One Direction - 风吹向某一个方向,Radial - 风从中心径向吹来 |
Attenuation | 球形径向风时有效,风从中心到四周的衰减率 |
Is Addition | 当处于多个风场叠加的区域时,勾选表示叠加这几个风的影响,不勾选会选择区域最小的风场 |
这是官方示例中演示的爆炸气流效果,在红球上添加了MagicaAreaWind,设置为球形径向风,调整风量到最大并勾选Is Addition,这样红球出现时就会伴随强烈的气流,这时再配合爆炸的特效就有不错的表现效果
换装
把 MagicaAvatar 组件添加到身体部分,如果提示 No problem 就没问题,如果 body 下的 GameObject 的名称有冲突会显示警告
把 MagicaAvatarParts 添加到其他部分,如头发,脸,衣服等
MagicaAvatar 的主要方法
/// <summary>
/// 附加 MagicaAvatarParts,返回部位id
/// </summary>
public int AttachAvatarParts(GameObject avatarPartsPrefab, Action<GameObject> instanceAction = null)
{
//.....
}
/// <summary>
/// 分离 MagicaAvatarParts
/// </summary>
public void DetachAvatarParts(int partsId)
{
//...
}
Attach 后会显示相关部分
在 MagicaBoneCloth 和 MagicaMeshCloth 上会有 Merge Avatar Collider 这个选项,勾选表示当 MagicaAvatarParts 附加到 MagicaAvatar 上时会合并主体的碰撞器
参数说明
下面补充下其他其他参数的说明
Update Mode
指定模拟的更新时间
选项 | 描述 |
---|---|
Normal | 根据帧率更新 |
Unity Physics | 基于 Unity 的物理更新,如果角色在 FixedUpdate 内移动,可以通过选择此项来抑制抖动 |
Culling
Culling是剔除相关的设置,当角色移出屏幕后如何影响物理系统的更新
首先需要将模型上的网格组件(Mesh Renderer或Skinned Mesh Renderer)添加到Cull Renderer List中,点击Auto Select即可自动添加,然后设置剔除模式
Culling Mode | 描述 |
---|---|
OFF | 不剔除,始终进行模拟 |
Reset | 离开屏幕,停止模拟,再次出现时,会重置模拟 |
Pause | 离开屏幕,停止模拟,再次出现时,从停止的状态继续模拟 |
Animator和Animation上也有类似的剔除设置
Culling Mode | 描述 |
---|---|
Always Animate | 不剔除,始终运行动画 |
Cull Update Transforms | 不可见时不会渲染该动画,但是依然会根据该动画的播放来改变游戏对象的位置、旋转、缩放 |
Cull Completely | 不可见时停止模拟,再次出现时,从停止的状态继续模拟 |
Culling Type | 描述 |
---|---|
Always Animate | 不剔除,始终运行动画 |
Based On Renderers | 与Animator的Cull Update Transforms一样,离开屏幕,内部动画仍在运行,但不会更新Transform组件 |
建议动画的剔除和 MagicaBoneCloth 的剔除模式相匹配,确保物理模拟与动画更好地同步
下面是推荐的匹配模式
Animator Culling Mode | MagicaCloth Culling mode | 描述 |
---|---|---|
Always Animate | OFF | 不剔除,始终进行模拟和动画 |
Cull Update Transforms | Reset | 离开屏幕,停止模拟和动画,再次出现时,会重置模拟和动画 |
Cull Completely | Pause | 离开屏幕,停止模拟和动画,再次出现时,从停止的状态继续运行 |
Animation Culling Type | MagicaCloth Culling mode | 描述 |
---|---|---|
Always Animate | OFF | 不剔除,始终进行模拟和动画 |
Based On Renderers | Reset | 离开屏幕,停止模拟和动画,再次出现时,会重置模拟和动画 |
Algorithm
Algorithm中老的算法已经不再维护,新的算法解决了老算法的一些问题,一般就默认Algorithm 2算法
Radius
每个由物理引擎控制的点都被称为粒子(particle),Radius就是控制这些粒子的大小,从骨骼链的根节点到末端节点的大小变化
点击Open Cloth Monitor,勾选Particle Position和Particle Radius,就可以看到长发上的粒子,根节点是黄色,子节点是白色,粒子的大小会影响碰撞检测的判断
Mass
Mass 就是控制粒子的重量,较重的粒子更难移动,基本上,如果开始点比较重,结束点比较轻,MagicaBoneCloth 的模拟会更稳定
Gravity
Gravity 设置重力加速度的大小和方向,设置重力让衣服下垂,不容易飘起了会显得更自然一点
External Force
External Force 设置外力(如风)的影响
名称 | 描述 |
---|---|
Depth Influence | 根据粒子在骨骼链上的深度指定受到外力的比率。1.0表示100%受外力影响,0.0表示完全不受外力影响 |
Wind Influence | 风的影响率,1.0是100%受影响,0.0完全不受风的影响 |
Wind Synchronization | 风的同步率,增加同步率,每个粒子将以同样的方式移动。降低同步率会使每个粒子更容易受到干扰 |
Wind Random Scale | 风的随机率,增加随机性,也会增加运动的不规则性 |
Drag
Drag 设定粒子的空气阻力,阻力越大,粒子的惯性衰减越快
Max Velocity 粒子最大速度(m/s)
World Influence
World Influence 设置身体运动时,粒子受影响程度
名称 | 描述 |
---|---|
Influence Target | 检测运动的主体,如果不设置,就会选择该组件所附加的Transform |
Max Move Speed | 粒子最大移动速度 |
Movement Influence | 身体运动对粒子的影响程度 |
Rotation Influence | 身体旋转对粒子的影响程度 |
Reset After Teleport | 在一帧内大幅度移动或旋转称为Teleport,该选项设置是否在检测到Teleport时重置粒子的位置 |
Teleport Mode | Reset - Teleport后重置一次模拟。Keep - Teleport后保持模拟状态 |
Teleport Distance | 一帧内移动多远距离算一个Teleport |
Teleport Rotation | 一帧内旋转多大角度算一个Teleport |
Stabilization Time After Reset | 重置时执行稳定化处理的时间(秒) |
Distance Disable
Distance Disable 根据身体与指定对象(通常是摄像机)之间的距离,禁用/启用模拟
名称 | 描述 |
---|---|
Reference Object | 指定要测量距离的目标,如果没有指定,将选择主摄像机 |
Distance | 指定关闭模拟的距离 |
Fade Distance | 淡化距离,如果Distance是20,FadeDistance是5,则在15到20的距离之间进行淡入淡出效果 |
Clamp Distance
Clamp Distance 设置粒子离根节点的距离范围,作为参考距离,设置从根节点到粒子的直线距离为1.0,并将距离增加或减少的程度设置为百分比。举例来说,当Min Distance Ratio为0.7,Max Distance Ratio为1.1时,移动限制范围如下
末端粒子只能在图中两条红线之间的范围内移动
Velocity Influence 速度效应,将此设置为低值可以减少粒子因突然运动而移动的问题。然而,粒子的惯性也会丢失。
Clamp Position
Clamp Position 限制粒子从原点移动的距离,原点是粒子的原始位置
名称 | 描述 |
---|---|
Clamp Position Ratio X/Y/Z | 可以相对于原点X/Y/Z轴移动的百分比(1.0=100%) |
Velocity Influence | 同上 |
Clamp Rotation
Clamp Rotation 限制相对于父节点的旋转角度,上图直线表示根节点(固定粒子)不能弯曲,尖端可以弯曲25度
Restore Distance
Restore Distance 恢复距离,缩放连接的粒子之间的距离,使它们保持在原来的距离,其作用是保持原始形状。
有以下三种粒子连接方式:
类型 | 描述 |
---|---|
Struct | 根据原始结构连接粒子,在Bone Cloth中,是由Transform的父子结构构建的,在Mesh Cloth中,是由Mesh多边形的连接信息构建的。必选的 |
Bend | 从原始结构中连接更多的结构型粒子,可以使形状不容易坍塌。可选的 |
Near | 忽略原始结构,仅连接那些靠近的粒子,这种连接可以保持形状的强度,但也使其不容易变形。可选的 |
参数名称 | 描述 |
---|---|
Struct Stiffness | Struct 连接强度,该值越高,恢复速度越快 |
Bend Point | 是否使用Bend连接 |
Bend Max Connection | 一个粒子的最大连接数,连接数越多,形状稳定性越强,但负荷也更大 |
Bend Stiffness | Bend 连接强度,该值越高,恢复速度越快 |
Near Point | 是否开启Near连接 |
Near Max Connection | 一个粒子的最大连接数 |
Near Max Depth | 进行Near连接的粒子最大深度,骨骼链上起点深度为0,终点深度为1 |
Near Point Length | 要链接的粒子之间的距离 |
Near Stiffness | Near连接强度,该值越高,恢复速度越快 |
Velocity Influence | 同上 |
Restore Rotation
Restore Rotation 恢复旋转,当粒子产生旋转后恢复到相对于父节点的角度
参数名称 | 描述 |
---|---|
Restore Power | 恢复的强度 |
Velocity Influence | 同上 |
Triangle Bend
Triangle Bend 三角形弯曲,当Connection Mode设置为Mesh相关的选项,或者使用Mesh Cloth时会显示该参数
两个连接三角形受外力变形后,两个三角形的角度恢复到其原始角度
参数名称 | 描述 |
---|---|
Bend Power | 恢复的强度,基本上设置为1.0就行,但具三角形数量比较少的时候,尝试降低该值 |
Twist Correction | 会创建特殊的约束数据以防止扭曲问题,它会增加消耗,因此不建议使用它,除非有扭曲的问题 |
Twist Recovery Power | 恢复扭曲的强度,如果值太高,形状可能会变得很硬 |
Collider Collision
Collider Collision 设置粒子与碰撞体接触时的摩擦系数
参数名称 | 描述 |
---|---|
Dynamic Friction | 动态摩擦系数,与碰撞机接触的粒子很难移动,增加该值将增加摩擦力并减慢运动速度 |
Static Friction | 静态摩擦系数,与碰撞器接触的粒子静止的强度,增加该值将导致粒子在碰撞器上立即停止 |
Penetration
Penetration 穿模
参数名称 | 描述 |
---|---|
Penetration Mode | 碰撞体穿模/表面穿模 |
Max Connection Depth | 最大连接深度 |
Penetration Axis | 粒子可以穿透哪个轴 |
Connection Distance | 搜索粒子所连接的碰撞器时,最大搜索距离 |
Penetration Distance | 粒子可以穿透的距离 |
Moving Radius | 粒子可以移动的最大半径,粒子只能在这个半径的球体内移动 |
Penetration Ignore Collider List | 要忽略的碰撞器列表 |
Rotation Interpolation
Rotation Interpolation 旋转插值
参数名称 | 描述 |
---|---|
Fixed Non-Rotation | 固定不旋转,当打开时,固定粒子(根节点)将完全不旋转 |
Line Avarage Rotation | 根据连接线的平均角度调整粒子的旋转,将此功能打开会产生更平滑的结果 |
Spring
MagicaMeshSpring上调整弹簧的参数,指定弹簧运动的一个球形范围
参数名称 | 描述 |
---|---|
Spring Radius | 球形区域的半径 |
Spring Radius Scale X/Y/Z | 三个轴影响的比例 |
Spring Power | 弹簧力 |
Spring Direction Atten | 弹簧力阻尼率取决于与球体前端的角度,左边是前面的方向,右边是后面的方向 |
Spring Distance Atten | 弹簧力的衰减率取决于与球中心的距离,左边是球的中心,右边是球的外缘 |
Spring Atten Intensity | 阻尼率的整体调整 |
Adjust Rotation
可以根据弹簧移动的距离为根节点添加旋转
参数名称 | 描述 |
---|---|
Adjust Mode | 指定检测运动的轴,通常是Direction Axis之外的两个轴 |
Adjust Rotation Power | 旋转强度 |
性能优化建议
- Update Mode选择Delay Unscaled Time,实际的物理模拟会比画面慢一帧,为了解决这个问题,它通过上一帧和当前帧的物理模拟结果进行插值
- 尽量选择BoneCloth和BoneSpring进行模拟,如果裙子使用BoneCloth效果达不到预期就改成MeshCloth,但注意要简化网格
- Virtual Deformer组件上需要关注的是Use Skinning选项,如果勾选了Use Skinning,则需要对所有顶点的骨骼权重进行重新赋值,取消Use Skinning可以极大地减少物理计算的负担。它的限制在于当取消了Use Skinning选项后,网格只会受到影响程度最大的Virtual Deformer的影响,可能在一定程度上会影响最终的表现,但是如果对于一个网格的Render Deformer只在一个Virtual Deformer中使用的情况下则可以放心地取消该选项的勾选
参考
up主IGBeginner0116
官方文档文章来源:https://www.toymoban.com/news/detail-780778.html
【博物纳新】Magica Cloth文章来源地址https://www.toymoban.com/news/detail-780778.html
到了这里,关于Unity 布料模拟插件Magica Cloth的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!