首页 > 其他分享 >unity 骨骼物理 头发 布料模拟

unity 骨骼物理 头发 布料模拟

时间:2023-01-30 19:31:47浏览次数:53  
标签:质点 骨骼 碰撞 布料 弹簧 unity 设置 模拟


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

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

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

DynamicBone
​​​ https://www.bilibili.com/read/cv4338788/​​​ 
https://zhuanlan.zhihu.com/p/526285709

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

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

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

使用MagicaCloth的具体流程:

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

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

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

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

unity 骨骼物理 头发 布料模拟_unity


首先添加一个MagicaRenderDeformer脚本,添加这个脚本以后,标示着,这个模型会参与布料模拟计算。注意,如果面数超过了6w面,将无法计算。第二步,添加MagicaVirtualDeformer,这个脚本主要用于生成虚拟的网格,简化计算内容。

unity 骨骼物理 头发 布料模拟_unity_02


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

unity 骨骼物理 头发 布料模拟_unity_03

然后在下面Reduction Setting下面,我们可以根据顶点距离和三角形距离进行合并,来生成虚拟网格,也可以设置相同面角度相同合并。

如果你需要原始的网格模型的结构,推荐使用面合并,如果不需要,那就使用顶点合并。根据顶点距离合并生成的数据更轻量化一些。

unity 骨骼物理 头发 布料模拟_数据_04


设置数据,后,上面不会再显示No Data,而是显示生成的虚拟网格的数据,我们发现三角面数从之前的1.5w变成了当前的2000等等。最后,就是使用虚拟网格生成质点弹簧了,这里需要添加一个脚本,MagicaMeshCloth

unity 骨骼物理 头发 布料模拟_数据_05


将虚拟网格脚本挂载的对象拖拽到第一个选项。

然后点击Start Point Selection,进行顶点设置,这个是用来控制质点的可移动性,绿色为可移动,红色为不可移动。

unity 骨骼物理 头发 布料模拟_unity_06


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

unity 骨骼物理 头发 布料模拟_Line_07


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

unity 骨骼物理 头发 布料模拟_ide_08


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

unity 骨骼物理 头发 布料模拟_游戏引擎_09


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

unity 骨骼物理 头发 布料模拟_游戏引擎_10


unity 骨骼物理 头发 布料模拟_数据_11


数据查看面板

unity 骨骼物理 头发 布料模拟_Line_12


关于质点深度的生成,是从不动的质点往动态质点渐变的,所以,动态质点最远的深度为1,这样会有一个渐变。

旋转弹簧可以看到根据面片生成的一根根的单独的线,这些弹簧也是从静态质点到动态质点有个动态的变化。接下来就是设置碰撞体,碰撞体可以防止衣料模拟时和其它模型进行穿插,限制其位置。

unity 骨骼物理 头发 布料模拟_unity_13


Merge Avatar Collider 可以实现自动合并碰撞体,让我们设置在角色模型上的碰撞体也可以影响到衣料模拟。

我们还可以在碰撞体列表中添加一些碰撞体节点,还实现额外的碰撞体交互。

在给模型添加碰撞体时,可以在需要添加的骨骼节点下面创建一个空节点,可以在空节点上面调节它的大小和位置,然后挂载碰撞体脚本,可以挂载的脚本有 MagicaCapsuleCollider 胶囊体碰撞体 MagicaPlaneCollider 平面碰撞体 MagicaSphereCollider 球型碰撞体

查询当前场景内的碰撞体,在搜索框输入:t:magicaSphereCollider t:magicaCapsuleCollider t:magicaPlaneCollider设置参数

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

unity 骨骼物理 头发 布料模拟_数据_14


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

unity 骨骼物理 头发 布料模拟_unity_15


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

unity 骨骼物理 头发 布料模拟_unity_16


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

unity 骨骼物理 头发 布料模拟_数据_17


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

unity 骨骼物理 头发 布料模拟_数据_18


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

unity 骨骼物理 头发 布料模拟_游戏引擎_19


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

unity 骨骼物理 头发 布料模拟_Line_20


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

unity 骨骼物理 头发 布料模拟_Line_21


设置质点的最大速度

unity 骨骼物理 头发 布料模拟_游戏引擎_22


物体在世界空间运动对质点的影响程度,可以手动指定节点。

Influence Target:默认为空时,将选择该布料组件的Transform作为参考物。一般建议将人物的盆骨hip骨骼作为参考物

Movement 相关属性是控制Influence Target位移时对其产生的影响。

Rotation 相关属性则是在物体旋转时对其产生影响的程度配置。

Reset After Teleport 在节点发生瞬移以后,是否需要重置,默认勾选会重置,或者根据需求调节它下面的属性。

unity 骨骼物理 头发 布料模拟_Line_23


远离目标节点多少距离以后,会关闭掉布料模拟效果,可以设置根据相机距离来优化性能。

Reference Object 布料模拟和目标的位置

Distance 多少距离内需要模拟

Fade Distance 缓冲区域,当前的值为 20-5 到 20 内

unity 骨骼物理 头发 布料模拟_unity_24


设置粒子可以从起点移动的最大距离。当前数值为百分比

前两个值是和起点的最大百分比和最小百分比。

Velocity Influence 速度影响 将其设置为较低的值可以减少粒子响应突然移动而移动的问题。 然而,粒子的惯性也会丢失。

unity 骨骼物理 头发 布料模拟_游戏引擎_25


unity 骨骼物理 头发 布料模拟_游戏引擎_26


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

unity 骨骼物理 头发 布料模拟_unity_27


限制质点的旋转度

unity 骨骼物理 头发 布料模拟_游戏引擎_28


unity 骨骼物理 头发 布料模拟_ide_29


调节弹簧的特性,还可以开启或者关闭某种弹簧的特性。

Struct Stiffness 用来调节弹簧的刚性,值越大弹簧恢复的就越快,值越小,恢复速度就越慢。

Blend Point 开启弯曲弹簧

Blend Stiffness 用于调节弹簧弯曲性

Near 可选,弹簧是根据质点之间的距离生成的弹簧,忽略原始结构,简单地连接那些靠近的粒子。这种连接使形状保持牢固,但也使其不易变形。

unity 骨骼物理 头发 布料模拟_游戏引擎_30


对应Monitor上面的三种显示

unity 骨骼物理 头发 布料模拟_unity_31


弹簧旋转的恢复

unity 骨骼物理 头发 布料模拟_ide_32


对应Monitor里面的Rotation Line

unity 骨骼物理 头发 布料模拟_Line_33


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

unity 骨骼物理 头发 布料模拟_unity_34


对应Monitor里面的Triangle Bend 显示

unity 骨骼物理 头发 布料模拟_数据_35


对于碰撞相关的调节

Dynamic Friction 动态摩擦力 作用在切线方向上的力 增加该值会导致质点很难移动

Dynamic Friction 静态摩擦力 作用在法线方向的粘合力 增加该值会导致物体立刻停止在碰撞体上面

光滑的表面可以将两个值减少到 0.05左右,棉麻物体可以适当增加到0.1 0.2

unity 骨骼物理 头发 布料模拟_游戏引擎_36


设置这个可以防止布料模拟插入碰撞体内部

具体文档请查看此​​ https://magicasoft.jp/en/prevent-penetration-2/​unity 骨骼物理 头发 布料模拟_Line_37


Fixed Non-Rotation 启用时,固定粒子将完全不旋转。 设置为“OFF”时,固定粒子将沿链接的移动质点的方向旋转。

Line Avarage Rotation 开启时,质点将平滑的进行旋转,推荐一直开启。关闭时,质点将固定朝向弹簧方向,如果是耳环等物体,效果还可以。


标签:质点,骨骼,碰撞,布料,弹簧,unity,设置,模拟
From: https://blog.51cto.com/u_15948039/6027763

相关文章

  • unity 皮肤材质效果实现分析
    相关资料​​https://therealmjp.github.io/posts/sss-intro/​​​里面讲解了次表明散射的概念原理,以及发展过程。到了实时渲染,早期的基于纹理空间的扩散,到现在经常会应用......
  • unity urp 衣服渲染
    正常衣服的布料分类:棉,羊毛,绒丝绸尼龙皮革还有一些特殊的比如富贵的貂那种绒毛,还有一些闪闪发光的那种。首先说一下基础的棉类的衣服。质地偏软,和之前默认的硬表面有很......
  • unity URP前向渲染流程以及获取屏幕空间UV和深度
    前向渲染流程cpu上进行剔除和排序,剔除为,相机的视椎体剔除,将相机视角外的模型剔除掉,不再渲染。遮挡剔除,将视椎体内不可见的模型剔除掉,不再渲染。排序为了保证性能,不透明为从......
  • unity urp 实现车漆效果
    车漆的效果除了基础的pbr效果,上面还可以添加两层额外的效果。一层是清漆的效果,另一层就是薄膜干涉的效果。这个就是薄膜干涉的效果,可以明显的看出来颜色被分散开来。这里......
  • unity urp 实现衣服上面片的效果
    在看模特秀的时候,有时候身上会有那种布灵布灵的面片效果。下面两张是我在丝绸的时装秀里面截取的两张模糊图,凑合看一下吧。如果需要在渲染里面去实现这种效果,该如何实现呢......
  • 在unity 2020 urp版本中实现 LensFlare功能
    这个官方里面没有支持,只能自己去解决。效果请查看地址:https://www.bilibili.com/video/BV1w24y1o7pY/下面说一下我的实现过程。找来找去,我找到了一篇不错的解决方案,还带源......
  • unity中实现ue眼球的渲染
    此图取至ue官方网站在shader里面我们还是需要使用英文,中英文对照:巩膜:sclera角膜缘:limbus虹膜:iris瞳孔:pupil角膜:cornea渲染效果。模型方面:使用一个突出的眼球模型来......
  • Unity 热更新方案
    一、Lua:内置一个Lua虚拟机。典型的框架有xLua,uLua。 二、ILRuntime:内置一个.net字节码解释器,解释执行.net字节码。三、puerts:内置一个JavaScript/TypeScrip......
  • The GPG keys listed for the "MySQL 5.7 Community Server" repository are already
    报错TheGPGkeyslistedforthe"MySQL5.7CommunityServer"repositoryarealreadyinstalledbuttheyarenotcorrectforthispackage.Checkthatthecorrec......
  • 关于blender导入到unity……
    我快被该死的左右手坐标轴搞疯了,于是做了个实验:我在blender里建了个箭头,让箭头朝向z轴,再在y轴正方向上写了个y,x轴正方向写了个x,然后ctrl+a应用全部。然后直接以blender文......