zoukankan      html  css  js  c++  java
  • Unity插件

    先上一张效果图:


    (依然是翰老弟)


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


    (导演:咔!

    行了。道具组你们明天不用来上班了)


    (大风扇:怪我咯)


    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


  • 相关阅读:
    000_linux之Ubuntu安装
    001_linux基础命令
    018_linux驱动之_阻塞和非阻塞
    019_linux驱动之_定时器的引入
    017_linux驱动之_信号量
    016_linux驱动之_原子操作
    python logging模块整理
    python sys与shutil模块
    python configparser模块
    python os模块
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7295182.html
Copyright © 2011-2022 走看看