首页 > 学院 > 开发设计 > 正文

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

2019-11-07 23:29:49
字体:
来源:转载
供稿:网友

先上一张效果图:

(依旧是翰老弟)

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

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

(大风扇:怪我咯)

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

一、原理:

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

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

    /// <summary>    /// 风向    /// </summary>    public enum WindDirection    {        /// <summary>        /// x轴正向        /// </summary>        xForward = 0,        /// <summary>        /// x轴反向        /// </summary>        xReverse = 1,        /// <summary>        /// y轴正向        /// </summary>        yForward = 2,        /// <summary>        /// y轴反向        /// </summary>        yReverse = 3,        /// <summary>        /// z轴正向        /// </summary>        zForward = 4,        /// <summary>        /// z轴反向        /// </summary>        zReverse = 5    }

        //计算风向        switch (BlowsDirection)        {            case WindDirection.xForward:                _blowsDirection = (Vector3.zero - new Vector3(1, 0, 0)).normalized;                break;            case WindDirection.xReverse:                _blowsDirection = (Vector3.zero - new Vector3(-1, 0, 0)).normalized;                break;            case WindDirection.yForward:                _blowsDirection = (Vector3.zero - new Vector3(0, 1, 0)).normalized;                break;            case WindDirection.yReverse:                _blowsDirection = (Vector3.zero - new Vector3(0, -1, 0)).normalized;                break;            case WindDirection.zForward:                _blowsDirection = (Vector3.zero - new Vector3(0, 0, 1)).normalized;                break;            case WindDirection.zReverse:                _blowsDirection = (Vector3.zero - new Vector3(0, 0, -1)).normalized;                break;            default:                _blowsDirection = Vector3.zero;                break;        }记录每个顶点将会受到风力的影响程度(计算风向与顶点法线点积):
        //计算每个顶点将会受到的风力影响        _dots = new float[_vertices.Length];        for (int i = 0; i < _vertices.Length; i++)        {            _dots[i] = Vector3.Dot(_mesh.normals[i], _blowsDirection);        }然后,直接开启大风扇(也就是让顶点开始根据风向偏移,主要是模型的边缘顶点以及背离风向的顶点):
        for (int i = 0; i < vertices.Length; i++)        {            if (_dots[i] <= 0)            {                vertices[i] += _blowsDirection * BlowsPower * _dots[i] *                     Random.Range(BlowsPowerMinRate, BlowsPowerMaxRate);            }        }好了,代码简直简单暴力得无话可说。

二、属性面板如下:

Blows Direction:风向

Blows Power:风力

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

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

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

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

三、运行:

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

再上几张效果图:

(横向瞬移)

(垂直瞬移)

-----by MeshEditor


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表