Unity插件 MeshEditor模型正弦扭曲特效

2017年04月26日 14:13 0 点赞 0 评论 更新于 2025-11-21 21:25

先展示一张效果图:

在开始具体的技术讲解前,我们先引入正弦函数的相关知识。正弦函数曲线在坐标系中的表现如下:

在给定的坐标系里,这条正弦曲线由函数 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 之间变化。这样做的目的是保证正弦函数中的 x 区间内变化。因为在正弦曲线上,每一个长度为 的区间内,y 值会完成一个完整的往复变化,如此能确保模型的运动连贯。

也就是说,随着 vertice.y 的变化(不同顶点的 y 坐标本身就存在差异),会产生一个扭曲变化的值,并将其赋给 vertice.z,从而实现我们期望的效果。

在上述代码中,WaveRange 相当于正弦函数中的系数 a,它决定了 y 值的变化区间,也就是模型正弦运动的幅度。

综上所述,实现该效果的思路并不复杂,下面我们直接来看该效果在属性面板中的相关说明:

  • FixedAxis:固定轴,对应正弦函数中的 x 分量。
  • WaveAxis:扭动轴,对应正弦函数中的 y 分量。
  • WaveMold:模式,包含 Entity(正常)和 squash(模型压成面片)两种。
  • WaveSpeed:扭动的速度。
  • WaveRange:扭动的幅度,若该值为 0,则模型停止扭动。
  • IsWaveing:用于开启或关闭正弦扭曲效果。

最后,再展示几张不同模式下的效果图:

  • (正常模式)
  • (压扁模式)

作者信息

孟子菇凉

孟子菇凉

共发布了 3994 篇文章