Unity插件 MeshEditor模型正弦扭曲特效
先展示一张效果图:
在开始具体的技术讲解前,我们先引入正弦函数的相关知识。正弦函数曲线在坐标系中的表现如下:
在给定的坐标系里,这条正弦曲线由函数 y = a * sin(x) 上所有的点 (x, y) 构成。其含义是,当 x 的值呈线性变化时,y 的值会在两个固定值之间往复变动,而这两个固定值的大小由系数 a 决定。
假设我们的模型遵循这样的坐标轴设定:左右方向为 X 轴,上下方向为 Y 轴,前后方向为 Z 轴。若要让模型实现第一张图所示的效果,我们可以把 Z 轴类比为正弦函数中的 y(在固定值间变化),把 Y 轴类比为正弦函数中的 x(值线性变化)。
基于此,我们对正弦函数 y = a * sin(x) 进行变量替换,得到如下代码:
vertice.z = WaveRange * Mathf.Sin(vertice.y + _weight);
这里我们引入了一个 _weight 参数,并使其在 0 到 2π 之间变化。这样做的目的是保证正弦函数中的 x 在 2π 区间内变化。因为在正弦曲线上,每一个长度为 2π 的区间内,y 值会完成一个完整的往复变化,如此能确保模型的运动连贯。
也就是说,随着 vertice.y 的变化(不同顶点的 y 坐标本身就存在差异),会产生一个扭曲变化的值,并将其赋给 vertice.z,从而实现我们期望的效果。
在上述代码中,WaveRange 相当于正弦函数中的系数 a,它决定了 y 值的变化区间,也就是模型正弦运动的幅度。
综上所述,实现该效果的思路并不复杂,下面我们直接来看该效果在属性面板中的相关说明:
- FixedAxis:固定轴,对应正弦函数中的
x分量。 - WaveAxis:扭动轴,对应正弦函数中的
y分量。 - WaveMold:模式,包含
Entity(正常)和squash(模型压成面片)两种。 - WaveSpeed:扭动的速度。
- WaveRange:扭动的幅度,若该值为
0,则模型停止扭动。 - IsWaveing:用于开启或关闭正弦扭曲效果。
最后,再展示几张不同模式下的效果图:
- (正常模式)
- (压扁模式)