现在的电影里有很多妖魔在死亡后身体逐渐融化并下滑最后化为一滩黑水的情景,本次出于兴趣大致研究了这个效果,原理是控制模型的顶点向一个方向坍塌,坍塌到最低点时再根据法线方向扩散形成黑水状。

第一步:

添加MeshMelt脚本,属性面板如下:

MeltDirection:融化的方向轴;

Melt Speed:融化速度;

第二步:

选择以Y轴融化为例。

首先,筛选出模型的最高点及最低点。

//获取目标网格
_Mesh = _Target.GetComponent<MeshFilter>().mesh;
//获取目标所有顶点
_AllVertex = _Mesh.vertices;
//记录目标融化至高点及至低点
_DissolutionMaxPoint = _DissolutionMinPoint = _AllVertex[0];
//获取目标融化至高点及至低点
for (int i = 0; i < _AllVertex.Length; i++)
{
if (_MeltDirection == MeltDirection.x)
{
if (_AllVertex[i].x < _DissolutionMinPoint.x)
_DissolutionMinPoint = _AllVertex[i];
else if (_AllVertex[i].x > _DissolutionMaxPoint.x)
_DissolutionMaxPoint = _AllVertex[i];
}
else if (_MeltDirection == MeltDirection.y)
{
if (_AllVertex[i].y < _DissolutionMinPoint.y)
_DissolutionMinPoint = _AllVertex[i];
else if (_AllVertex[i].y > _DissolutionMaxPoint.y)
_DissolutionMaxPoint = _AllVertex[i];
}
else if (_MeltDirection == MeltDirection.z)
{
if (_AllVertex[i].z < _DissolutionMinPoint.z)
_DissolutionMinPoint = _AllVertex[i];
else if (_AllVertex[i].z > _DissolutionMaxPoint.z)
_DissolutionMaxPoint = _AllVertex[i];
}
}
IsCanMelt = true;

然后循环遍历所有点向着最低点的高度塌陷,已达到最低点位置的点开始以法线方向扩散,当最高点低于最低点时,融化结束。

if (_MeltDirection == MeltDirection.y && _DissolutionMaxPoint.y > _DissolutionMinPoint.y)
{
for (int i = 0; i < _AllVertex.Length; i++)
{
//目标点开始塌陷
if (_AllVertex[i].y > _DissolutionMinPoint.y)
{
_AllVertex[i] = new Vector3(_AllVertex[i].x, _AllVertex[i].y - Time.deltaTime * _MeltSpeed, _AllVertex[i].z);
}
if (_AllVertex[i].y < _DissolutionMinPoint.y)
{
_AllVertex[i] = new Vector3(_AllVertex[i].x, _DissolutionMinPoint.y, _AllVertex[i].z);
}
//目标点开始扩散
if (_AllVertex[i].y == _DissolutionMinPoint.y)
{
_AllVertex[i] += _Mesh.normals[i] * Time.deltaTime * _MeltSpeed;
}
}
//刷新目标网格
_Mesh.vertices = _AllVertex;
_Target.GetComponent<MeshFilter>().mesh = _Mesh;
//重新记录至高点
_DissolutionMaxPoint = new Vector3(_DissolutionMaxPoint.x
, _DissolutionMaxPoint.y - Time.deltaTime * _MeltSpeed, _DissolutionMaxPoint.z);
}

那么,核心代码主要有这两部分就完成了,之后在其他脚本里,想要动态的控制物体融化的话,可以调用融化开关函数

/// <summary>
/// 开始融化
/// </summary>
public void BeginMelt()
{
if (IsCanMelt)
{
IsStartMelt = true;
IsCanMelt = false;
transform.GetComponent<Collider>().enabled = false;
}
else
Debug.Log("由于未知原因,目标无法融化或处于融化中!");
}

最后附上动态演示图:

-----by MeshEditor

Unity插件 - MeshEditor(四) 模型融化特效的更多相关文章

  1. Unity插件 - MeshEditor(二) 模型网格编辑器(高级)

    源码已上传至github,并持续更新,链接请看底部.(本帖跟随github持续更新) 继先前的一篇MeshEditor之后,MeshEditor第二版发布,这次在先前的基础上加入了为模型新增顶点以及删 ...

  2. Unity插件 - MeshEditor(八)模型镜像特效

    将静态模型(带MeshFilter)按指定轴向.指定距离克隆一个镜像物体出来,思路很简单,将模型的顶点坐标按指定轴取反,并累加上设定的距离值,然后就完毕了!不过,因为镜像体的顶点镜像于之前模型的顶点, ...

  3. Unity插件 - MeshEditor(一) 3D线段作画 & 模型网格编辑器

    之前,因为工作需要,项目中需要动态生成很多的电线,不能事先让模型做好,更不能用LineRenderer之类的,因为画出来没有3D的效果,最主要是拐角的时候还容易破面,而我们要的是真真实实纯3D的电线, ...

  4. Unity插件 - MeshEditor(七)变形动画骨骼及蒙皮

    MeshAnimation在物体的顶点比较多的情况下,悲剧是显而可见的,我一个一个的点选顶点肯定得累死,而且对于形态的调控不是很方便,应该说是很麻烦,要知道,骨骼动画因为有了骨骼以及蒙皮信息而有了灵魂 ...

  5. Unity插件 - MeshEditor(五) 网格顶点动画(变形动画)

    源码已上传至github,并持续更新,链接请看底部.(本帖跟随github持续更新) 网格顶点动画(变形动画)是针对于物体的形状可以随意变换并记录为关键帧的动画,虽然模型的顶点数据还是应该交给GPU绘 ...

  6. Unity插件 - MeshEditor(六) 变形动画状态机

    变形动画状态机--MeshAnimator,是针对MeshAnimation的状态管理器,有大量类似Unity animator的功能,但MeshAnimator操作会更加简便,更加直观,居家旅(zh ...

  7. Unity插件 - MeshEditor(三) 面片破碎&网格破碎

    网上的unity破碎插件很多,不过想着可以以自己的方式实现也不失为一种乐趣,虽然整体的表现性上显得有些差,但也并不会影响最终的效果,接下来我大致讲解一下破碎一个物体的流程,因为用到了协程计算碎片的原因 ...

  8. Unity NGUI和UGUI与模型、特效的层级关系

    目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 ...

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

    课程 章节 内容 签到 Unity插件之NGUI 完整视频教程 第一章 NGUI基础控件和基础功能学习 1.NGUI介绍和插件的导入 6月29日 2.创建UIRoot 6月29日 3.学习Label控 ...

随机推荐

  1. C语言第二次作业 ,

    一:修改错题 1输出带框文字:在屏幕上输出以下3行信息. 将源代码输入编译器 运行程序发现错误 错误信息1: 错误原因:将stido.h拼写错误 改正方法:将stido.h改为stdio.h 错误信息 ...

  2. NVisionXR for ARCore内测版开放申请

    NVisionXR for ARCore引擎能够帮助开发者快速开发原生ARCore应用,只要你懂基本的Android开发,直接使用Android Studio,即可实现动画模型渲染.粒子特效.音视频播 ...

  3. .9-浅析express源码之请求处理流程(2)

    上节漏了几个地方没有讲. 1.process_params 2.trim_prefix 3.done 分别是动态路由,深层路由与最终回调. 这节就只讲这三个地方,案例还是express-generat ...

  4. easyui datagrid属性和方法

    本文可以当做api来使用 使用方法(Usage Example) 从现有的表单元素创建数据表格,定义在html中的行,列和数据. <table class="easyui-datagr ...

  5. ubuntu 14.04 64位 安装Opencv3.1.0 (包含opencv_contrib模块)

    写在前边: 据官方说法,目前还不是太稳定的算法模块都在opencv_contrib里边,由于不稳定,所以不能在release版本里发行,只有在稳定以后才会放进release里边.但是这里边有很多我们经 ...

  6. java基础复习+大数运算

    String: Array: 下面分别是大数加法,加法,乘法,取模

  7. ACM 畅通工程

    Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通 ...

  8. PHP HTTP 函数

    PHP HTTP 简介 HTTP 函数允许您在其他输出被发送之前,对由 Web 服务器发送到浏览器的信息进行操作. 安装 HTTP 函数是 PHP 核心的组成部分.无需安装即可使用这些函数. PHP ...

  9. MVC和MTV模式

    著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的对象(ORM),视图负责与用户的交 ...

  10. Do a web framework ourselves

    step 1: from wsgiref.simple_server import make_server def application(environ, start_response): star ...