实现效果
做一个类似幽灵的角色,原模型是简单的人型骨骼,没有针对衣物做特定动画,这里用shader动画来模拟衣物晃动。
基本思路
unity shader graph编写顶点位移动画
- 对模型顶点的x和z坐标做偏移,偏移量由一个噪声图决定
- 噪声图用Gradient Noise,必须在object空间取样,否则模型的网格会出现缝隙
- 用Lerp函数来模拟衣物旗帜等布料基于定点的晃动,即距离定点越远,晃动幅度越大
细节要点
对顶点坐标的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空间上取样。
步骤(1)的Time节点用来输入噪声图的offset使之滚动。额外再用一个Vector2来控制滚动的方向,这里取横向滚动,即取值(1,0)。
图都不见了,可以再补充一下吗
gitee仓库最近搞了个限制,公开仓库要重新审批,我提交审批了,两三天后图片应该就恢复了