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

先上一张效果图:

(依旧是翰老弟)

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

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

(大风扇:怪我咯)

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

时间: 2024-08-05 19:35:03

Unity插件 - MeshEditor(十) 模型风力拉扯特效的相关文章

【Unity 3D】学习笔记四十二:粒子特效

粒子特效 粒子特效的原理是将若干粒子无规则的组合在一起,来模拟火焰,爆炸,水滴,雾气等效果.要使用粒子特效首先要创建,在hierarchy视图中点击create--particle system即可 粒子发射器 粒子发射器是用于设定粒子的发射属性,比如说粒子的大小,数量和速度等.在创建完粒子对象后,在右侧inspector视图中便可以看到所有的粒子属性: emit:是否是使用粒子发射器. min size:粒子最小尺寸. max size:粒子最大尺寸. min energy:粒子的最小生命周期

YbSoftwareFactory 代码生成插件【十八】:树形结构下的查询排序的数据库设计

树形结构的排序在中国特色下十分普遍也非常重要,例如常说的五大班子,党委>人大>政府>政协>纪委,每个班子下还有部门,岗位,人员,最终排列的顺序通常需要按权力大小.重要性等进行排列,顺序排列不好可是重大的罪过,领导很生气,后果很严重.这种排序方式本质上就是典型的树形结构深度排序,但在数据库中很难直接通过SQL语句简单高效地进行处理,更不用说还要支持不同类型数据库了. 当前解决此类问题,主要有两种方法. 1. 排序码方式 原理:在每个树形节点上均设置一个排序码,排序码通常是一个字符串并

【VR】Leap Motion 官网文档 Unity插件概述

前言: Leap Motion的官网文档已经有不少的热心网友参与了翻译,但没有覆盖官网文档的全部. 为迎合Unity VR的热潮与大家的学习需要,本博客将推出针对Unity方向的官方文档翻译系列. 本篇主要对Leap Motion的Unity插件及坐标系系统进行简述. 英文原文网址:https://developer.leapmotion.com/documentation/unity/unity/Unity_Overview.html 译文首发&持续更新:http://blog.csdn.ne

YbSoftwareFactory 代码生成插件【十九】:实体类配合数据库表字段进行属性扩展的小技巧

实体类通常需要和数据库表进行了ORM映射,当你需要添加新的属性时,往往同时也需要在数据库中添加相应的字段并配置好映射关系,同时可能还需对数据访问组件进行重新编译和部署才能有效.而当你开始设计一个通用数据访问组件后,因为项目需求的不同和需求的不断变化演变,很难不能保证不会再添加额外的属性和字段.特别是项目部署运行后,添加一个属性和字段带来的额外维护的工作量可能要远远超过对代码进行调整的工作量.本文提供了属性字段扩展的一种思路,在满足核心字段可通过实体类强类型进行访问的同时,还可通过C# 4.0提供

【学习中】Unity插件之NGUI 完整视频教程

课程 章节 内容 签到 Unity插件之NGUI 完整视频教程 第一章 NGUI基础控件和基础功能学习 1.NGUI介绍和插件的导入 6月29日 2.创建UIRoot 6月29日 3.学习Label控件,显示文字 6月29日 4.学习Sprite创建精灵,显示图片 5.学习Panel面板,控件容器 6.创建Button按钮,使用脚本监听按下 7.创建图集Atlas 8.切图SlicedSprite九宫切图 9.dynamicFont动态字体制作和显示 10.widget属性,pivot,dept

Unity插件之NGUI学习(5)—— 创建Label图文混排及文字点击

创建一个新的Scene,并按 Unity插件之NGUI学习(2)创建UI Root. 准备工作,制作Font,现在Project窗口创建一个Font文件夹,然后从系统自带字体文件夹中选择自己需要的字体,我选择了黑体,然后拖到Font文件夹中去.选择刚导入的字体. Font Size默认是16,不过网上看到过size16在IOS上显示太小,所以设置为30. 在菜单中选择NGUI->Open->Font Maker Type默认是Generated Bitmap--会生成材质文件,Dynamic-

Unity插件之NGUI学习(4)—— 创建UI2DSprite动画

创建一个新的Scene,并按 Unity插件之NGUI学习(2)创建UI Root,并在UI Root的Camera下创建一个Panel. 然后在选中Panel,在菜单中选择NGUI->Create->Unity 2D Sprite 查看Inspector窗口 接着是在Unity中制作Sprite: 在Project窗口创建Textures文件夹,并从外部拖入一些图片素材,然后选中需要转成Sprite的图片,然后在Inspector窗口进行转变Sprite的操作,如图. 选择Sprite(2D

Unity插件之NGUI学习(9)—— Tween和世界坐标系尺寸转换为NGUI尺寸

在游戏中,有一种比较常见的动画效果,就是产生得分后,分数会在游戏中显示,并快速移动到总分的位置并使之相加.今天我就打算使用NGUI的Tween来制作这种分数动画效果. 根据 Unity插件之NGUI学习(2),创建一个UI Root,然后使用NGUI创建一个Label和一个Button. 在Project窗口中,在Resources/Prefabs文件夹中创建一个Prefab,该Prefab就是一个NGUI的Label,然后在菜单中选择NGUI->Tween->Rotation和NGUI-&g

CSDN开源夏令营 基于Compiz的switcher插件设计与实现之compiz特效插件介绍及特效实现

compiz自带的特效插件不够多,也不够强大,为了更好的体验compiz的特效,我们可以安装特效插件,在终端输入命令:sudo apt-get install compiz-plugins就可以下载特效插件安装了. 一.安装compiz特效插件 在此过程中可能会出现一些问题,比如说依赖问题,我们需要把源更新一下.对于更新源,我们需要注意以下几点: 1.设置软件更新 注意:这里要选主服务器 2.更新源 在终端输入命令:sudo apt-get update来更新源,一般情况下,这样是可以的,但是,