更新日期:2020年4月22日。
Github源码:[点我获取源码]
索引
- 前言
- 扩展
- Vortex
- 使用
- 参数
- 原理及算法
- 图像展示
前言
MeshEditor系列重整归来,算法更优,扩展性更强,开销更低,且之后将会在源码托管平台持续更新。
扩展
编写自己的MeshEffects组件:
1.继承至基类MeshEffectsBase。
2.重写OnBeginEffect方法,当特效播放开始。
3.重写OnUpdateEffect方法,更新特效逻辑。
4.重写OnEndEffect方法,当特效停止。
通用网格数据对象MeshData,存储了经过优化后的网格数据,理论上就算要增删网格的顶点也不用直接操作其顶点数组Vertices,而是调用AddTriangle或RemoveTriangle增删三角面,该操作会立即生效到网格。
Vortex
设置一个涡流中心,使得网格在涡流中心的引力和向心力的拉扯下逐渐扭曲变形直到被吸入涡流中心(基于上一版涡流特效优化升级而来)。
使用
在Hierarchy界面选中一个带网格渲染组件(MeshRenderer或SkinnedMeshRenderer)的物体,在物体名字上单击右键,选择创建MeshEditor > Effects > Vortex。
调用Play播放特效,Pause暂停特效,UnPause恢复特效,Stop停止特效。
参数
Vortex参数面板:
1.Play On Start:是否在Start时自动播放特效。
2.Gravitation:涡流中心引力大小。
3.Centripetal Force:涡流中心向心力大小。
4.Centripetal Direction:向心力方向。
5.Center:涡流中心世界坐标。
6.Radius:涡流中心半径。
原理及算法
MeshData是优化后的网格数据,在顶点的量级计算上会比原始数据低数倍(比如一个Cube,肉眼所见的顶点数量是8个,但原始顶点数量则为24),Vortex直接遍历其顶点数组,在每个顶点上施加向心力和引力。
引力算法:传入参数顶点位置vertex、系数factor(这里的系数为顶点与涡流中心的距离),返回施加引力后的新顶点位置。
//应用引力
private Vector3 ApplyGravitation(Vector3 vertex, float factor)
{
float gravitation = Gravitation / factor * Time.deltaTime;
return vertex + (_realCenter - vertex).normalized * (gravitation > factor ? factor : gravitation);
}
1.这里的Gravitation / factor x Time.deltaTime,将引力与系数、帧刷新时间计算,产生一个可变的引力值gravitation;
2.(_realCenter - vertex).normalized求得实时引力方向(_realCenter为涡流中心坐标);
3.gravitation > factor ? factor : gravitation由于factor也表示顶点与涡流中心的距离,如果引力值已经超出距离,则以距离值替换引力值,防止顶点被吸入后反向穿透;
向心力算法:传入参数顶点位置vertex、系数factor(这里的系数为顶点与涡流中心的距离),返回施加向心力后的新顶点位置。
//应用向心力
private Vector3 ApplyCentripetal(Vector3 vertex, float factor)
{
return Quaternion.AngleAxis(CentripetalForce / factor, CentripetalDirection) * (vertex - _realCenter) + _realCenter;
}
1.这里的Quaternion.AngleAxis(CentripetalForce / factor, CentripetalDirection),将向心力除以系数,并与向心力方向合力计算出向心力旋转值(Quaternion);
2.x (vertex - _realCenter) + _realCenter求得旋转值基于涡流中心的偏移量。
图像展示