【unity小技巧】Unity人物衣服布料系统的探究 —— Cloth组件

一、Cloth组件解释

基本介绍

Cloth只能必须和Skinned Mesh Renderer搭配使用, 但是这不代表使用简单的物体时还必须在Max中导出一个带有蒙皮信息的FBX, 其实可以新建一个GameObject然后赋予Cloth组件, 这会自动添加Skinned Mesh Renderer组件, 然后在Skinned Mesh Renderer组件中赋予基本体的Mesh上去并且设置正确的材质也完全可以
在这里插入图片描述
Stretching Stiffness: 拉扯硬度.
Bending Stiffness: 弯曲硬度.
Use Tethers: 默认开启, 用于方式过度拉伸
Use Gravity: 是否使用世界重力.
Damping: 阻尼会应用于每个布料顶点. 要想打造看上去抖动更小的布料, 可以试试这个.
External Acceleration: 常量外力.
Random Acceleration: 随机外力.
World Velocity Scale: 与World Acceleration Scale共同组成布料的GameObject.transfrom的运动会对物理模拟造成的影响比例.
World Acceleration Scale: 与World Velocity Scale共同组成布料的GameObject.transfrom的运动会对物理模拟造成的影响比例.
Friction: 当布料碰到在这个列表中存在的Collider时所产生的摩擦力, 这只会影响布料的模拟. 上面说过了布料的物理模拟是单向的
Collision Mass Scale: How much to increase mass of colliding particles. 这个参数我不懂, 求补充
Use Continuous Collision: 使用Continuous Collision, 增加消耗, 减少直接穿透碰撞的几率
Use Virtual Particles: Add one virtual particle per triangle to improve collision stability
Solver Frequency: Number of solver iterations per second. 显然是一个优化参数, 默认120很高了, 我可以试着调低一些
Sleep Threshold: 静止阈值.
Capsule Colliders: 要对布料产生交互的胶囊碰撞体
Sphere Colliders: 要对布料产生交互的ClothSphereColliderPairs. 可以理解为他是按照一组来的, 一组中可以只有一个SphereCollider, 也可以有两个, 当有两个的时候, 那么这两个SphereCollider会在布料的碰撞系统中被”焊接”起来. 这样就允许通过两个大小不同的SphereCollider来组合成一个圆锥形状的碰撞体了.

出于性能的考虑, 可以对Cloth产生影响的Collider只有两种

SphereCollider以及CapsuleCollider, 但是SphereCollider可以赋予两个为一组(当然了还可以只赋予一个, 第二个保持null), 那么通过组合这两个SphereCollider可以出现第三种, Unity会将这组的两个SphereCollider进行相连, 那么就可以有圆锥形的Collider
在这里插入图片描述

打开编辑模式

按这个
在这里插入图片描述
来打开编辑Constraint模式
在这里插入图片描述

Visualization:这里能够选择当前在Scene视图中预览Max Distance还是Surface Penetration. (这两者二选一), 还能选择是否让操作影响视口背面的顶点

Max Distance(最大距离):可以设置每个顶点最大可移动距离. 最常用的用法是将不能动的顶点的Max Distance设置为0

Surface Penetration(表面渗透):控制的是顶点最大可以嵌入到Mesh里面的程度. 在布料网格顶点比较稀疏的情况下可以明显对比出差别

绘制

在这里插入图片描述
在绘制模式中, 这个按钮代表要绘制
在这里插入图片描述
这里设置的值
在这里插入图片描述

二、基本使用

1. 创建出一个空物体

在这里插入图片描述

2. 在空物体上添加cloth组件,可以直接点击Add Component搜索cloth添加,也可以在工具栏 Component–>physics–>cloth选择添加。添加后自动添加两个组件:

在这里插入图片描述

3. 添加组件后需要给Skinned Mesh Renderer指定网格和材质(这里添加了一个plane的网格,和一个自己创建的材质球):

在这里插入图片描述
ps:这样就添加好了一个基本的布料系统组件,但是组件并没有产生什么影响,接下来我们将让plane产生布料的效果。

4. 添加约束

点击Edit cloth constraints编辑约束

在这里插入图片描述

点击选择,图片上的小黑点表示可供选择的约束点,如果觉得不够明显,可以调节约束大小调整显示球体大小,此设置不会对约束产生影响

在这里插入图片描述

选择绘制上方约束,然后勾选最大距离,设置布料的最大距离值为零,绘制布料上方部分,保持上方部分固定。

在这里插入图片描述

5. 运行,效果

在这里插入图片描述

物理交互

如果要和物体产生碰撞交互,需要在组件中指定产生物理交互的组件,但是仅能和两种碰撞体产生碰撞胶囊体球体碰撞器,这是出于性能考虑。
在这里插入图片描述
效果
在这里插入图片描述

三、人物衣服

人物衣服布料配置和前面基本一致,不够建议多配置几个物理交互碰撞体,反正衣服穿模的同时有很贴合身体

这里群子就配置了3个碰撞体
在这里插入图片描述
绘制裙子上方固定,最大距离值为0,下方为0.2
在这里插入图片描述
效果
在这里插入图片描述

参考

https://blog.csdn.net/qq_51978873/article/details/123769866
https://blog.csdn.net/linxinfa/article/details/89704028

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

在这里插入图片描述

<think>嗯,用户想要在Unity中实现布料飘动效果的Shader教程或者示例代码。首先,我需要回忆一下之前学过的Unity Shader相关知识,特别是关于布料模拟的部分。记得布料模拟通常涉及到顶点动画和噪声函数的应用,比如使用正弦波或者Perlin噪声来模拟布料的自然运动。 用户提到的引用[2]里提到用sin函数和Perlin噪声来模拟窗帘布料,这可能是一个很好的切入点。我应该考虑如何将这些方法应用到Shader中,通过顶点着色器修改顶点的位置,从而实现飘动效果。另外,关键帧动画和线性插值也可能有用,但可能在Shader中通过时间变量来控制动画进度。 接下来,我需要确保回答的结构清晰,分步骤说明实现方法。首先可能需要解释顶点动画的基本原理,然后介绍如何结合噪声函数。然后给出一个示例代码,并解释关键部分,比如如何计算位移,应用噪声,以及调整参数。最后,提供优化建议和相关问题,帮助用户进一步学习。 要注意用户提到的所有数学表达式需要用$...$格式,比如sin函数的公式。同时,独立公式需要用$$...$$,比如顶点位移的计算可能需要单独成段的公式。还要检查LaTeX语法是否正确,避免错误。 另外,用户可能需要具体的代码示例,所以需要提供一个简单的Shader代码,用HLSL编写,展示如何在顶点着色器中实现飘动。同时,要指出关键参数如频率、幅度、噪声强度等,并建议用户如何调整这些参数。 还需要考虑用户可能的后续问题,比如性能优化、复杂布料效果,或者与其他系统的交互,比如风场。因此,在相关问题部分,可以列出这些问题,帮助用户深入探索。 最后,确保引用正确,引用[2]是关于Unity Shader实现PPT切换效果的,其中提到了使用sin函数和Perlin噪声,这部分内容需要自然地融入到回答中,并在引用处添加标识符[^2]。</think>在Unity中实现布料飘动效果的Shader主要通过顶点动画结合噪声函数实现,以下是具体实现步骤和示例代码: ### 一、实现原理 1. **顶点位移算法** 使用$f(x,z,t) = A \cdot \sin(\omega t + kx + \phi)$作为基础波形函数,其中: - $A$:振幅 - $\omega$:角频率 - $k$:波数 - $\phi$:相位常数 2. **叠加Perlin噪声** $$ displacement = baseWave + noiseScale \cdot perlinNoise(uv \cdot noiseTiling + timeOffset) $$ 通过噪声函数增加布料自然褶皱效果 ### 二、Shader实现代码 ```hlsl Shader "Custom/ClothWave" { Properties { _MainTex ("Texture", 2D) = "white" {} _WaveSpeed ("Wave Speed", Range(0,5)) = 1.0 _WaveAmplitude ("Wave Amplitude", Range(0,1)) = 0.2 _NoiseScale ("Noise Scale", Range(0,1)) = 0.1 _NoiseSpeed ("Noise Speed", Range(0,5)) = 1.0 } SubShader { Tags { "RenderType"="Opaque" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "noiseSimplex.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float _WaveSpeed; float _WaveAmplitude; float _NoiseScale; float _NoiseSpeed; v2f vert (appdata v) { v2f o; // 基础波形计算 float wave = sin(_Time.y * _WaveSpeed + v.vertex.x * 5) * _WaveAmplitude; // Perlin噪声计算 float2 noiseUV = v.uv + _Time.y * _NoiseSpeed; float noise = snoise(noiseUV * 10) * _NoiseScale; // 顶点位移合成 v.vertex.y += wave + noise; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { return tex2D(_MainTex, i.uv); } ENDCG } } } ``` ### 三、参数调节建议 1. 初始测试参数组合: ``` _WaveSpeed = 2.0 _WaveAmplitude = 0.3 _NoiseScale = 0.15 _NoiseSpeed = 1.5 ``` 2. 调试顺序建议: - 先调整基础波形参数 - 再叠加噪声效果 - 最后整体微调 ### 四、性能优化技巧 1. 使用LOD技术根据摄像机距离切换计算精度 2. 对静态布料预先生成顶点动画贴图 3. 采用GPU Instancing技术处理多布料对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向宇it

创作不易,感谢你的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值