Unity插件 - MeshEditor(十) 模型风力拉扯特效

发表于2017-04-17
评论1 1.6k浏览

风力拉扯效果大家在游戏中都会见到,那么这个风力拉扯特效在开发时是如何实现的呢,下面就给大家介绍下使用Unity 插件MeshEditor实现模型风力拉扯特效的教程。


先上一张效果图:


(依旧是翰老弟)


(导演:我们需要一个刮风的效果,道具组,上大风扇)


(导演:咔!!!行了,道具组你们明天不用来上班了)


(大风扇:怪我咯)


OK,效果虽然渣了点,但我们还是进入今天的正题吧,我记得在PS或者是某些图片编辑工具里都有类似给目标添加一个大风的效果,虽然这样做最终图片也会被风刮得模糊不清了,但有时候就是需要这样的效果,不是吗?虽然我就是那样的逗比,所以我再次秉承了暴力解决一切的终极技巧,将大风扇搬了过来。


一、原理:


我的做法是首先确定风向,然后根据风向与每个顶点的法线计算点积,最终用点积来确定每个顶点将会受到风力的影响程度。


这里用一个枚举来统计风向,目前也就六种风向,分别是三个轴的正反向(不过注意,风向是以模型的本地坐标系计算的):


[csharp] view plain copy
 
  1. ///   
  2. /// 风向  
  3. ///   
  4. public enum WindDirection  
  5. {  
  6.     ///   
  7.     /// x轴正向  
  8.     ///   
  9.     xForward = 0,  
  10.     ///   
  11.     /// x轴反向  
  12.     ///   
  13.     xReverse = 1,  
  14.     ///   
  15.     /// y轴正向  
  16.     ///   
  17.     yForward = 2,  
  18.     ///   
  19.     /// y轴反向  
  20.     ///   
  21.     yReverse = 3,  
  22.     ///   
  23.     /// z轴正向  
  24.     ///   
  25.     zForward = 4,  
  26.     ///   
  27.     /// z轴反向  
  28.     ///   
  29.     zReverse = 5  
  30. }  


[csharp] view plain copy
 
  1. //计算风向  
  2. switch (BlowsDirection)  
  3. {  
  4.     case WindDirection.xForward:  
  5.         _blowsDirection = (Vector3.zero - new Vector3(1, 0, 0)).normalized;  
  6.         break;  
  7.     case WindDirection.xReverse:  
  8.         _blowsDirection = (Vector3.zero - new Vector3(-1, 0, 0)).normalized;  
  9.         break;  
  10.     case WindDirection.yForward:  
  11.         _blowsDirection = (Vector3.zero - new Vector3(0, 1, 0)).normalized;  
  12.         break;  
  13.     case WindDirection.yReverse:  
  14.         _blowsDirection = (Vector3.zero - new Vector3(0, -1, 0)).normalized;  
  15.         break;  
  16.     case WindDirection.zForward:  
  17.         _blowsDirection = (Vector3.zero - new Vector3(0, 0, 1)).normalized;  
  18.         break;  
  19.     case WindDirection.zReverse:  
  20.         _blowsDirection = (Vector3.zero - new Vector3(0, 0, -1)).normalized;  
  21.         break;  
  22.     default:  
  23.         _blowsDirection = Vector3.zero;  
  24.         break;  
  25. }  

记录每个顶点将会受到风力的影响程度(计算风向与顶点法线点积):

[csharp] view plain copy
 
  1. //计算每个顶点将会受到的风力影响  
  2. _dots = new float[_vertices.Length];  
  3. for (int i = 0; i < _vertices.Length; i++)  
  4. {  
  5.     _dots[i] = Vector3.Dot(_mesh.normals[i], _blowsDirection);  
  6. }  

然后,直接开启大风扇(也就是让顶点开始根据风向偏移,主要是模型的边缘顶点以及背离风向的顶点):

[csharp] view plain copy
 
  1. for (int i = 0; i < vertices.Length; i++)  
  2. {  
  3.     if (_dots[i] <= 0)  
  4.     {  
  5.         vertices[i] += _blowsDirection * BlowsPower * _dots[i] *   
  6.             Random.Range(BlowsPowerMinRate, BlowsPowerMaxRate);  
  7.     }  
  8. }  

好了,代码简直简单暴力得无话可说。

二、属性面板如下:




Blows Direction:风向

Blows Power:风力

Blows Power Min Rate:风力变化最小速率(当为0时,风力为0)

Blows Power Max Rate:风力变化最大速率(当为1时,风力最大,再大则翻倍)

Update Blows:是否持续刮风?不的话就刮一次,模型保持被吹一次时的情景

Update Rate:持续刮风的速率,越小刮得越快(也就是刷新的越快,越小看着越不卡,只不过性能遭不住不怪我)


三、运行:


在任意静态模型上添加脚本MeshBlows,勾选UpdateBlows,然后直接运行场景就可以看到效果:


再上几张效果图:


(横向瞬移)


(垂直瞬移)


如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论