1、Realflow 2017 中文融化教程详解终极篇熊二动漫 转载 vfxinfo realflow融化方法技术总结(3/3)目录realflow融化方法技术总结 1一、不同手法制作简要对比: 2二、保持初始状态 52.1 Liquid粒子 52.2 Dumb粒子 72.3 Elastics粒子 72.4 freeze(冻结)法 8三、 定义分离条件 93.3.1典型属性 103.3.2 相邻粒子数 103.3.3流体边界粒子 11四、处理分离部分 20五、 Python 脚本方法 20myFilter(自定义分离器) 20myForce(自定义力) 22myTemperature(自定义温度)
2、 24总结: 26(这是 RF 官方展示,我所能找到最好的融化参考了)一、不同手法制作简要对比:不同手法制作对比:通过上一篇,对“融化模型”的探索,我们知道了融化的基本思路1.保持初始状态2.找出合适转换条件3.处理分离部分现在看一下不同的案例,找出它们各自,初始状态,转换条件,和如何处理分离部分的1.使用有范围的重力做为条件,这也是 RF2013 帮助自带的案例初始状态:dumb 粒子转换条件:有范围的重力分离部分:受重力影响+地面碰撞2.使用基本的 Y 轴做为条件做融化初始状态:liquid 粒子+freeze转换条件:Y 轴向分离部分:受重力影响+地面碰撞3. 比较常见的冻结+法线方式的
3、融化初始状态:liquid 粒子+freeze转换条件:normal+或者典型的 neighbor unfreeze 方法分离部分:受重力影响+地面碰撞这是冻结+相邻粒子的融化 (当然上面这只是截图,这些都是在 youtube 或 vimeo 上找的视频参考,只要你以 melt 为关键字搜索,很容易找到。)下图是一些实际案例:通常需要很多元素配合,才会显得好看。并且一定要牢记,做好动态仅仅是一个特效的开始,后面还有材质,灯光渲染合成这些环节。做特效时不要局限于某一部分,像画画一样要有整体的观念。不然会陷入某一部分,对效率效果都没有好处二、保持初始状态根据观察和实际制作经验。处理融化效果前,先要
4、决定好保持初始物体状态的方法。最常用的方法应该就是使用填充粒子的方法了。当然不要忘记对模型变形的方法。到底选择什么方法,是根据具体特效需求来定的。主要有两个标准:1.可以保持初始形态 2.可以根据一定条件变形,又不会影响别的部分 如果你在别的软件制作融化,只要把握住上面两个标准就可以了。、下面说的主要是填充粒子的方法,都是在 realflow 中操作。2.1 Liquid粒子简介:使用 liquid 粒子填充模型,保持初始状态。这种粒子有所有流体属性。并且与融化出来的粒子也是同一种类型,在实际制作时会方便很多。操作:1.使用直接 fill_object emitter 填充2.注意如果不使用
5、freeze 方法,那就需要不能让它与重力结点关联。这样才能保持初始状态3.也不能与融化的那一套粒子互相关联。只要让融化粒子不穿插就可以,如果互相关联,会导致变形4.如果使用 freeze 操作,需要在 simulationPre 加上这样的脚本冻结全部粒子如果符合条件的粒子,需要同时进行 unfreeze,不然粒子是不会受力影响的优点:1.可以保持非冻结部分的交互2.有大量属性可以应用。(有最重要的法线 Normal 属性)缺点:通常需要配合 freeze 冻结函数才能使用或者原始粒子不与解冻后的粒子交互。第一篇,金属人头就是这么做的。(就是填充的粒子发射器不要与融化的发射器做关联)注意:在
6、解算开始时,需要把粒子速度降到最低。可以使用解算方法也可以直接使用脚本归零粒子速度2.2 Dumb粒子这种类型的粒子完全没有流体的属性。但使用它做为初始状态会有明显的速度优势。操作:只要把 Fill_Object 类型切换成 Dumb 就可以。它也可以冻结。优点:计算速度非常快使用力进行影响,会产生一定交互性。增加融化真实性。缺点:1.没有 Normal 属性。所以不能与法线的方法进行配合2.使用力做为分离条件,难以控制(因为这种粒子受力会直接坍陷到一起)注意:使用这种粒子填充,一定要注意力的范围,不然原始模型会变型。应用案例:1.Realflow2013帮助文档自带融化案例,就是填充的 Du
7、mb 粒子2.3 Elastics粒子弹性粒子,类似于柔体。使用这种方法保持物体初始状态。可以做果冻这种类似物质效果优点:1.不需要冻结,也能保持原始状态可以产生一定交互可以达到一定弹性效果,做一些特殊案例很有用缺点:1.计算速度太慢2.没 dumb 粒子一样,具体的属性较少3.容易产生爆开的粒子注意:应用案例:(粒子像柔体一样,有弹性变形)2.4 freeze(冻结)法freeze 是 realflow 基本粒子的一个函数。它的作用是,保持粒子当前的位置(position)和速度(velocity).与 unfreeze 配对使用。下图是我制作一个简单的冻结粒子应用我们做融化时,其实就是冻结
8、效果反向效果。一开始需要把全部粒子冻结。然后根据一定条件一点点解冻,这样就可以观察到粒子一点点分离,感觉就是融化效果。操作:python 脚本方法缺点: 1.对于效果来说,有一个最大问题是,冻结部分粒子不能与解冻粒子交互。2.这是一个函数。需要写脚本来应用。因此解算速度会受脚本语言限制,如 python 只能单核计算。可以使用 Graph 结点来代替,或者是使用 C+优点:1.容易控制,并与多种融化条件配合。2.适用于所有类型粒子。特别是配合 liquid 使用。注意:1. 冻结时把所以粒子速度设置归零。(冻结的粒子是保持冻结时的速度和位置,如果不归零,在解冻后会影响融化动态)因为冻结是一种特
9、殊保持初始状态的方法,与下面几张都不一样。应用案例:1.经典的融化 melt 脚本(另一篇博客有详细介绍)2.肥皂泡破裂案例3.4.其它各种应用Bouns:1.有一个经典的 freeze 融化脚本它的原理是在模拟前冻结粒子(这是为了保持模型初始动态).这脚本首先,在表面找出一个粒子点。然后找出这个粒子相邻粒子,进行排序,一个个unfreeze。unfreeze 的粒子会受到重力下落,能产生经典的融化效果,很像金属熔融的感觉。2.使用破裂的肥皂泡 bubble 方法,做融化原理是开始时指定一个粒子,然后搜索周围粒子数,以球形为半径。因为只计算一个粒子的相邻粒子数,速度会大大提高,但这个方法,可以
10、指定多个粒子,这样做那种粒子交互的反应就非常的方便。比如做腐蚀1.经典的 freeze 融化脚本:http:/ 定义分离条件分离条件的定义,应该是融化效果最核心的一个部分了。条件有那么多种,最终选择什么,全是根据你的制作需要来定的。有些条件会产生这种效果,有些效果又是另一种。有时还需要组合不同的条件。全看你的需要来定。比如:达到一定速度的粒子,会被看做融化的粒子。这个条件就是速度 speed或法线值大于一定值的,会看做成融化的粒子.这个条件就是粒子法线 Normal或是距离小于一定值的粒子看成融化粒子。这个条件就是 distance 值类似这些条件有非常多。定义分离,意思就是以什么的规则让粒子
11、一点点融化开来。总的来说有这样几种条件1.典型属性(如 position)2.相邻粒子数(如 neighbor,temperature)3.流体边界粒子(如 normal,distanceField)4.力的方法(如范围重力场)3.3.1典型属性典型属性,包括位移,旋转,缩放这些基本属性。你可以很方便的调用,定义一些分离条件根据 position 位置最简单的,我可以根据 Y 轴高度 。这样很容易就看到从上往下或从下往上,一点点融化的效果(上图是一个手机广告的融化 breakdown 截图)这个是根据粒子的位置做为条件的。你可以直接在 Filter Daemon 中选择不同轴向的 positi
12、on.操作:1.通常直接使用 Filter 选择 position 就可以了2.可以使用 Null 替代物,获取高度方便控制,本质是一样3.3.2 相邻粒子数相邻粒子数,得名于 neighbor 函数。可以根据给定点不断搜集相应半径范围内的粒子。非常类似一个不断缩放扩大的球体。但我们不能把思维局限于此,相邻粒子数,本义应该是一种类似于传递的功能,一个接个扩散出去。neighbor属性相邻粒子数 neighbor 函数。这是 PB 粒子其中一个属性。就是获取以粒子为球心范围内的粒子,返回一个粒子列表。这个条件,通常与 freeze 配合使用。达到一点点获取粒子作用。下图是一个简单的测试,在球上随
13、即取一个粒子点,然后不断获取周围粒子并直接杀死,产生破裂效果。如果保留杀死的粒子,那就是一种融化操作:1.根据 id 找出一个粒子2.使用 neighbor 函数搜索这个粒子半径内粒子3.这个半径值设置为全局属性,甚至是从某一个 null 上来获取,可以方便 key帧4.注意,只有同一个发射器或者发射器之间有关联,才能获取相邻粒子数Bouns:使用这个属性还会有助于你制作一个合理的温度场。因为这也可以看做是一种定义流体边界的方法。温度就是从外部像内部传递的。3.3.3流体边界粒子如何定义流体外部粒子,这很重要。因为融化就是一个典型的由表及里的过程,如果你定义好流体边界粒子,就可以非常容易做出融
14、化。真实做流体计算时有标记(Maker)粒子和水平集方法。像 naiad 中有 boundary结点可以直接获取到边界层。因此如果你要做融化,最关键的就是找好边界粒子。下面主要是 realflow 中的方法。粒子法线 Normal()法线概念。就是粒子指向流体外部朝向。越是流体内部的粒子法线值越小。最外部的比较大。如果能找到合适的法线值,典型的融化效果是很好看的。它的缺点,就是不好缺点法线值。不同 resolution 值不一样,不同帧不一样。它应该是一个动态的值。这需要费一点功夫去测试。判断粒子的法线值,如果大于一定值就让它转移。这是比较方便也比较真实的一种条件。因为真实的融化就是那种一层层
15、脱落感觉。但如何在 realflow 中获取适当的法线值是一件不那么方便的事。下图是使用默认 cross 模型,填充粒子。模拟到 17 帧,并且差不多条件融化到相近效果的 Normal 值对比。我没有找到什么规律,下在只是一些经验值。唯一可以确定的是,只要resolution 一样,粒子最大 normal 值是一样的。所以你确认好一个 resolution 就不要随意更改了。Resolution:1 Normal:1.3 (这是测试值)Resolution:5 Normal:0.75(稍微高一点的测试)Resolution:10 Normal:0.6(大部分效果有这个精度就差不多行了)Reso
16、lution:100 Normal:0.28(比较高的精度了,对融化来讲粒子数这么多足够了。再多也没有视觉意义)Bouns:为了找出合适的 Normal 值。我写了一个小脚本,帮助自己就是找出粒子最大法线值,然后乘以 0.678。差不多就是所需要的值。上面脚本功能很简单,就是可以找出合适的 Normal 值。在测试融化前,只要运行一次就可以了,目的就是为了找出一个值。当然你也可以利用脚本,自动给 filter 赋予值。脚本思路:1.遍历粒子,获取粒子的 normal,然后取模,得到 normal 法线长度2.把这个长度加到一个列表中,然后计算出最大的长度。也就是处理最表面粒子的法线值。最后我把
17、这个最大值,乘以 0.678 差不多就是我需要的融化 normal 值了。下面脚本,我加了一个 null.position 条件。这是为了速度考虑,因为只要搜集最表面的粒子就可以了。并不是搜集的粒子越多越好。maxSample是为了限制列表的长度。同样也是为了计算速度考虑。注意:最后得到值也只是一个参考数值,具体是多少还是需要自己测试温度方法这其实应该是最先考虑到的方法,仔细观察一下生活就应该知道。融化这种效果,其实本质就是温度的变化。但物理归物理,如何把这种思路与 CG 软件结合起来。说起来也很简单,就是定义两种温度:流体温度(可高,可低)环境温度(可以为环境,也可以是某一个有范围的物体)温
18、度在这里的本质,就是某一个通道值的变化,并且是一个标量。温度如何变化。可以参考牛顿冷却定律。虽然这是针对理想流体的,但这绝对满足你的要求。真实的流体温度变化比较复杂。 知道简单的关于温度两点。温度总是由高到低温度冷却是呈指数方式衰减只要知道这两点就可以,不需要研究什么复杂的数学方程。HotACold插件是是比较好的温度方法:它的原理很简单,就是根据一定规则定义一个温度通道,可以根据环境温度,物体温度做一些变化还有就是流体的粘度也会根据温度做出相应变化(图片来自 vimeo)这想这张图是对温度通道最好的诠释了Bouns:下面是对 HotAcold 插件的参数中文解释。与之类似的还有一个叫 Iom
19、elt 的插件。它的原理就是先根据这个插件方法定义一个温度,然后把到达一定温度的粒子转移走。HotACold插件,最重要的一点就是根据 neighbor 判断流体边界粒子赋予相应值。就是遍历流体,如果某一个粒子的相邻粒子数,小于给定值,就把它看作流体边界的粒子参数名称 取值范围 中文Up 朝向 定义向量的“方向”。也被用到沸腾(boiling)力的强制流体朝向Liquid Temperature (LT) 流体温度 0 (In Kelvin,开尔文) : 初始温度,粒子年龄为 0时的温度Ambient Temperature (AT) 环境温度 0 (In Kelvin) : 环境温度Ambi
20、ent Effect (AE) 环境效果 =0 : 该值设置,环境温度(AT)对流体边缘粒子影响效果Ambient Neighbour Limit 环境相邻极限 =0 : 当粒子相邻粒子数少于这个值,就被看成是流体边缘的粒子。将会受到环境温度影响Neutral Temperature (FT) 中立值() =0 (In Kelvin) : 指定温度,哪部分流体是中立的。低于这个温度,粘度会大幅度增加Boiling Temperature (BT) 沸腾温度 =0 (In Kelvin) : 指定流体沸腾。基于这个问题应用一个向上的力。温度越高力越大Object Effect (OE) 物体影响
21、 =0 : 该值设置,粒子碰撞到物体上受物体温度的影响。注意:object 名称前缀有“_”,该值将不会起作用Mix Factor (MF) 混合系数 MF =0 :该值指定,相邻粒子之间温度影响有多高。T_new = T + MF * T_ave + AE * (AT T) + OE * (OT T); T : 粒子当前温度; T_ave : 相邻粒子平均温度,基于距离(distance); OT : 碰撞物体温度,如果粒子有碰撞。否则 OT = T; AT :如果粒子在流体边缘,环境温度。否则 AT = T.Viscosity Factor (VF) 粘度系数 VF =0 :代替或合并,与
22、发射器的标准粘度值。因为发射器的 viscosity可以设置为 0.这个粘度是计算每粒子级别的,根据温度计算,指数法则函数:Viscosity = VF * DVVSF * exp( - TF * ( T FT ); DV 相邻粒子不同速度; PLF 是粘度指数法则因子; TF 是粘度温度因子; T 是当前温度; FT 冻结温度Viscosity Temperature Factor(TF) 粘度温度系数 指数温度因子,见上面Viscosity Speed factor (VSF) 粘度速度系数 Delta速度指数因子,见上面Boiling Factor(Strength) (BF) 沸腾强度
23、系数 =0 :这个系数定义向上温度的力:沸腾力不是应用到流体边缘粒子上,那已经由 Ambient Neighbour Limit 定义过了Force = BF * (1 - exp( - BTF * (T BT ) * UPBoiling Temperature Factor (BTF) 沸腾温度系数 =0 : 指数温度因子,见上面。当前沸腾温度,用来增加沸腾不管压力 pressureAllow Freeze below Neutral Temperature低于 FT温度,允许冻结粒子Daemon Inactive后,粒子会全部 unfreeze.可能冻结时,并不是真正的 freeze.经测
24、试,它冻结后还是会继续保持一点点运动,而不是突然停止。感觉是很大粘度的感觉。(感觉错误,其实是因为温度变化关系。粒子还是正常冻结,想多了)(freeze)Transfer to Emitter 转移到发射器Target Emitter: 目标发射器Condition 条件Custom Temperature 自定义温度距离场(distance field)方法粒子与给定点的距离。也可以是给定 mesh 距离,就是 mesh-distance 这样的通道概念。肯定是距离越小粒子越在表面。你可以根据 distance 场来定义受力大小。Distance Field:力的方法力这个条件应该是所有上面
25、方法的一个总结 。力的变化。可以让需要的部分,粒子先受比较大的力,然后一点点扩散到周围。甚至直接使用一个力的范围框,只要在力的范围中,就定义为需要融化的粒子。上面所以方法都是要把粒子分离出来,目的也为了使用不同部分受不同的力。四、处理分离部分处理分离粒子,就是融化出来的部分。通常只要加上一个重力就可以。你甚至可以把重力反过来。这样可以得到一个简单魔法效果分离后的粒子通常需要与原始部分有碰撞。所以融化后粒子的状态设置,就是处理分离部分五、 Python 脚本方法如果要突破软件的限制,使用脚本是一个不错的手段。脚本方法可以综合所有上面的方法。也可以任意搭配条件。myFilter(自定义分离器)re
26、alflow中,有一个非常方便的 daemon filter,可以根据一定条件,把一套发射器中的粒子,分离到另一套发射器。这个 daemon,大部分时候很有用,但它只能同时支持一个条件。所以你可以需要自己定义一个 filter。或者是你把粒子再分离一次。这样粒子之前交互就多了一层。相当于二次分离。做水面泡沫,或者岩浆上面变黑的那一层时,我确认这样做过。定义自己的过滤器。方法很简单,全代码如下。里面的条件可以任意换myForce(自定义力)一个简单根据年龄,让粒子受到外力的脚本写力的脚本,重力在于两点1.如何定义力的大小2.如何定义力的方向这个脚本力的大小就是使用简单的指数衰减形式。方向更简单,就是原始速度方向的一个负方向。这样就实现了一个阻力的效果粒子会随着年龄受到外力越来越大。最后,是我把这个脚本关闭,粒子全部像水一样流走。myTemperature(自定义温度)