rainyeve
  • 首页
  • 编程
  • 涂鸦
  • 其他
  • 关于
2019年7月19日
编程

【Unity Shader】顶点动画模拟衣物晃动效果

【Unity Shader】顶点动画模拟衣物晃动效果
2019年7月19日
编程

实现效果

做一个类似幽灵的角色,原模型是简单的人型骨骼,没有针对衣物做特定动画,这里用shader动画来模拟衣物晃动。

未加入shader动画
未加入shader动画前,只有基本的骨骼动画
加入动画后的效果
模型加入shader动画后,模拟了衣物晃动(图床限制gif文件大小,图中动作没有连贯)

基本思路

unity shader graph编写顶点位移动画

  • 对模型顶点的x和z坐标做偏移,偏移量由一个噪声图决定
  • 噪声图用Gradient Noise,必须在object空间取样,否则模型的网格会出现缝隙
  • 用Lerp函数来模拟衣物旗帜等布料基于定点的晃动,即距离定点越远,晃动幅度越大
shader graph节点总览
shader graph 节点总览

细节要点

shader graph 细分为5个部分
用shader graph 实现流程细分为5个部分

对顶点坐标的x和z值做偏移

最直观的步骤是(3)(4),步骤(3)通过原顶点坐标xz值与一个噪声相加得到一个偏移过的坐标,步骤(4)通过Lerp函数用t参数控制偏移幅度,实现了距离定点越远则顶点偏移量越大的效果。

控制取样范围

并不是整个模型从上到下的点都要做偏移。步骤(5)的clamp函数,从模型坐标的y值取样,以0为min1为max,控制了模型不需要偏移的点,以图中的胶囊模型来说,只需取下半身的点做顶点偏移,上半身的点的偏移量全部取0。对于胶囊示例来说步骤(5)的OneMinus函数是不准确的,应该用Negate函数做Remap,但由于实际模型的轴心在底部所以这里用了OneMinus做调整。

胶囊模型坐标示例
胶囊模型坐标示例

噪声值的Remap

步骤(2)实质上是对噪声值做Remap,原本输出范围是[0,1],因为要往相反方向偏移,所以减0.5使之取值范围是[-0.5,0.5],后面则是简单地用Multiply函数放大噪声值。

生成噪声图并滚动

步骤(1)作用是生成噪声图,要使得顶点偏移之后,模型不出现裂缝,这步骤的Gradient Noise函数的UV必须取样自模型的object空间,参考自unity官方的技术博客→Creating an Interactive Vertex Effect using Shader Graph,这个案例说明了顶点动画噪声不能在UV空间上取样。

在UV空间取样的噪声造成模型出现裂缝
unity官方博客案例,在UV空间取样的噪声令模型出现裂缝
fix裂缝
“To fix the seams by using Object Space for the Simple Noise instead of UV Space, we can simply add a Position node set to Object.”——引述

步骤(1)的Time节点用来输入噪声图的offset使之滚动。额外再用一个Vector2来控制滚动的方向,这里取横向滚动,即取值(1,0)。

Post Views: 5,481

shader unity3d

上一篇【Unity Shader】UV动画实现生命值槽下一篇 【Unity网格编程】SkinnedMeshRenderer Decal 实现斩击伤痕贴花效果

2条评论

网友说道:
2022年6月17日 下午2:43

图都不见了,可以再补充一下吗

回复
wayson说道:
2022年7月10日 下午5:22

gitee仓库最近搞了个限制,公开仓库要重新审批,我提交审批了,两三天后图片应该就恢复了

回复

发表评论 取消回复

邮箱地址不会被公开。 必填项已用*标注

分类目录

  • 其他 (2)
  • 旅行 (1)
  • 涂鸦 (6)
  • 编程 (28)
Email: wuch441692@163.com