Loading
1

[vfxinfo 原创]Realflow 2013 中文融化教程详解[终极篇]

vfxinfo原创 转载请注明作者与出处

原创作者:豆芽兵(现任职于东方梦工厂)
使用软件:Realflow 2013
版权归原创作者豆芽兵所有 

realflow融化方法技术总结(3/3)

目录

realflow融化方法技术总结 1

一、不同手法制作简要对比: 2

二、保持初始状态 5

2.1 Liquid粒子 5

2.2 Dumb粒子 7

2.3 Elastics粒子 7

2.4 freeze(冻结)法 8

三、 定义分离条件 9

3.3.1典型属性 10

3.3.2 相邻粒子数 10

3.3.3流体边界粒子 11

四、处理分离部分 20

五、 Python脚本方法 20

myFilter(自定义分离器) 20

myForce(自定义力) 22

myTemperature(自定义温度) 24

总结: 26

(这是RF官方展示,我所能找到最好的融化参考了)

一、不同手法制作简要对比:

不同手法制作对比:

通过上一篇,对“融化模型”的探索,我们知道了融化的基本思路

1.保持初始状态

2.找出合适转换条件

3.处理分离部分

现在看一下不同的案例,找出它们各自,初始状态,转换条件,和如何处理分离部分的

1.使用有范围的重力做为条件,这也是RF2013帮助自带的案例

初始状态:dumb粒子

转换条件:有范围的重力

分离部分:受重力影响+地面碰撞

2.使用基本的Y轴做为条件做融化

初始状态:liquid粒子+freeze

转换条件:Y轴向

分离部分:受重力影响+地面碰撞

3. 比较常见的冻结+法线方式的融化

初始状态:liquid粒子+freeze

转换条件:normal+或者典型的neighbor unfreeze方法

分离部分:受重力影响+地面碰撞

这是冻结+相邻粒子的融化 

(当然上面这只是截图,这些都是在youtubevimeo上找的视频参考,只要你以melt为关键字搜索,很容易找到。)

下图是一些实际案例:通常需要很多元素配合,才会显得好看。并且一定要牢记,做好动态仅仅是一个特效的开始,后面还有材质,灯光渲染合成这些环节。

做特效时不要局限于某一部分,像画画一样要有整体的观念。不然会陷入某一部分,对效率效果都没有好处

二、保持初始状态

根据观察和实际制作经验。处理融化效果前,先要决定好保持初始物体状态的方法。最常用的方法应该就是使用填充粒子的方法了。当然不要忘记对模型变形的方法。

到底选择什么方法,是根据具体特效需求来定的。

主要有两个标准:1.可以保持初始形态 2.可以根据一定条件变形,又不会影响别的部分 

如果你在别的软件制作融化,只要把握住上面两个标准就可以了。、

下面说的主要是填充粒子的方法,都是在realflow中操作。

2.1 Liquid粒子

简介:

使用liquid粒子填充模型,保持初始状态。

这种粒子有所有流体属性。并且与融化出来的粒子也是同一种类型,在实际制作时会方便很多。

操作:

1.使用直接fill_object emitter填充

2.注意如果不使用freeze方法,那就需要不能让它与重力结点关联。这样才能保持初始状态

3.也不能与融化的那一套粒子互相关联。只要让融化粒子不穿插就可以,如果互相关联,会导致变形

4.如果使用freeze操作,需要在simulationPre加上这样的脚本冻结全部粒子

如果符合条件的粒子,需要同时进行unfreeze,不然粒子是不会受力影响的

优点:

1.可以保持非冻结部分的交互

2.有大量属性可以应用。(有最重要的法线Normal属性)

缺点:

通常需要配合freeze冻结函数才能使用

或者原始粒子不与解冻后的粒子交互。第一篇,金属人头就是这么做的。(就是填充的粒子发射器不要与融化的发射器做关联)

注意:

在解算开始时,需要把粒子速度降到最低。

可以使用解算方法

也可以直接使用脚本归零粒子速度

2.2 Dumb粒子

这种类型的粒子完全没有流体的属性。但使用它做为初始状态会有明显的速度优势。

操作:只要把Fill_Object类型切换成 Dumb就可以。它也可以冻结。

优点:

计算速度非常快

使用力进行影响,会产生一定交互性。增加融化真实性。

缺点:

1.没有Normal属性。所以不能与法线的方法进行配合

2.使用力做为分离条件,难以控制(因为这种粒子受力会直接坍陷到一起)

注意:

使用这种粒子填充,一定要注意力的范围,不然原始模型会变型。

应用案例:

1.Realflow2013帮助文档自带融化案例,就是填充的Dumb粒子

2.3 Elastics粒子

弹性粒子,类似于柔体。使用这种方法保持物体初始状态。可以做果冻这种类似物质效果

优点:

1.不需要冻结,也能保持原始状态

可以产生一定交互

可以达到一定弹性效果,做一些特殊案例很有用

缺点:

1.计算速度太慢

2.dumb粒子一样,具体的属性较少

3.容易产生爆开的粒子

注意:

应用案例:

(粒子像柔体一样,有弹性变形)

2.4 freeze(冻结)法

freeze realflow基本粒子的一个函数。它的作用是,保持粒子当前的位置(position)和速度(velocity).

unfreeze配对使用。

下图是我制作一个简单的冻结粒子应用

我们做融化时,其实就是冻结效果反向效果。一开始需要把全部粒子冻结。然后根据一定条件一点点解冻,这样就可以观察到粒子一点点分离,感觉就是融化效果。

操作:python脚本方法

缺点: 

1.对于效果来说,有一个最大问题是,冻结部分粒子不能与解冻粒子交互。

2.这是一个函数。需要写脚本来应用。

因此解算速度会受脚本语言限制,如python只能单核计算。可以使用Graph结点来代替,或者是使用C++

优点:

1.容易控制,并与多种融化条件配合。

2.适用于所有类型粒子。特别是配合liquid使用。

注意:

1. 冻结时把所以粒子速度设置归零。(冻结的粒子是保持冻结时的速度和位置,如果不归零,在解冻后会影响融化动态)

因为冻结是一种特殊保持初始状态的方法,与下面几张都不一样。

应用案例:

1.经典的融化melt脚本

(另一篇博客有详细介绍)

2.肥皂泡破裂案例

3.

4.其它各种应用

Bouns:

1.有一个经典的freeze融化脚本

它的原理是在模拟前冻结粒子(这是为了保持模型初始动态).这脚本首先,在表面找出一个粒子点。然后找出这个粒子相邻粒子,进行排序,一个个unfreezeunfreeze的粒子会受到重力下落,能产生经典的融化效果,很像金属熔融的感觉。

2.使用破裂的肥皂泡bubble方法,做融化

原理是开始时指定一个粒子,然后搜索周围粒子数,以球形为半径。

因为只计算一个粒子的相邻粒子数,速度会大大提高,

但这个方法,可以指定多个粒子,这样做那种粒子交互的反应就非常的方便。比如做腐蚀

1.经典的freeze融化脚本:http://qqww2334.blog.163.com/blog/static/12036582201272062422560/

2.破裂的肥皂泡:http://qqww2334.blog.163.com/blog/static/120365822011102503910699/

三、 定义分离条件

分离条件的定义,应该是融化效果最核心的一个部分了。

条件有那么多种,最终选择什么,全是根据你的制作需要来定的。有些条件会产生这种效果,有些效果又是另一种。有时还需要组合不同的条件。

全看你的需要来定。

比如:

达到一定速度的粒子,会被看做融化的粒子。这个条件就是速度speed

或法线值大于一定值的,会看做成融化的粒子.这个条件就是粒子法线Normal

或是距离小于一定值的粒子看成融化粒子。这个条件就是distance

类似这些条件有非常多。

定义分离,意思就是以什么的规则让粒子一点点融化开来。

总的来说有这样几种条件

1.典型属性(如position

2.相邻粒子数(如neighbor,temperature

3.流体边界粒子(如normal,distanceField

4.力的方法(如范围重力场)

3.3.1典型属性

典型属性,包括位移,旋转,缩放这些基本属性。你可以很方便的调用,定义一些分离条件

根据position位置

最简单的,我可以根据Y轴高度 。这样很容易就看到从上往下或从下往上,一点点融化的效果

(上图是一个手机广告的融化breakdown截图)

这个是根据粒子的位置做为条件的。你可以直接在Filter Daemon中选择不同轴向的position.

操作:

1.通常直接使用Filter选择position就可以了

2.可以使用Null替代物,获取高度方便控制,本质是一样

3.3.2 相邻粒子数

相邻粒子数,得名于neighbor函数。可以根据给定点不断搜集相应半径范围内的粒子。非常类似一个不断缩放扩大的球体。

但我们不能把思维局限于此,相邻粒子数,本义应该是一种类似于传递的功能,一个接个扩散出去。

neighbor属性

相邻粒子数neighbor函数。

这是PB粒子其中一个属性。就是获取以粒子为球心范围内的粒子,返回一个粒子列表。

这个条件,通常与freeze配合使用。达到一点点获取粒子作用。

下图是一个简单的测试,在球上随即取一个粒子点,然后不断获取周围粒子并直接杀死,产生破裂效果。

如果保留杀死的粒子,那就是一种融化

操作:

1.根据id找出一个粒子

2.使用neighbor函数搜索这个粒子半径内粒子

3.这个半径值设置为全局属性,甚至是从某一个null上来获取,可以方便key

4.注意,只有同一个发射器或者发射器之间有关联,才能获取相邻粒子数

Bouns:使用这个属性还会有助于你制作一个合理的温度场。因为这也可以看做是一种定义流体边界的方法。

温度就是从外部像内部传递的。

3.3.3流体边界粒子

如何定义流体外部粒子,这很重要。因为融化就是一个典型的由表及里的过程,如果你定义好流体边界粒子,就可以非常容易做出融化。

真实做流体计算时有标记(Maker)粒子和水平集方法。像naiad中有boundary结点可以直接获取到边界层。

因此如果你要做融化,最关键的就是找好边界粒子。下面主要是realflow中的方法。

粒子法线Normal()

法线概念。就是粒子指向流体外部朝向。

越是流体内部的粒子法线值越小。最外部的比较大。如果能找到合适的法线值,典型的融化效果是很好看的。

它的缺点,就是不好缺点法线值。不同resolution值不一样,不同帧不一样。它应该是一个动态的值。

这需要费一点功夫去测试。

判断粒子的法线值,如果大于一定值就让它转移。这是比较方便也比较真实的一种条件。因为真实的融化就是那种一层层脱落感觉。

但如何在realflow中获取适当的法线值是一件不那么方便的事。

下图是使用默认cross模型,填充粒子。模拟到17帧,并且差不多条件融化到相近效果的 Normal值对比。

我没有找到什么规律,下在只是一些经验值。唯一可以确定的是,只要resolution一样,粒子最大normal值是一样的。所以你确认好一个resolution就不要随意更改了。

Resolution:1 <==> Normal:1.3 (这是测试值)

Resolution:5 <==> Normal:0.75(稍微高一点的测试)

Resolution:10 <==> Normal:0.6(大部分效果有这个精度就差不多行了)

Resolution:100 <==> Normal:0.28(比较高的精度了,对融化来讲粒子数这么多足够了。再多也没有视觉意义)

Bouns

为了找出合适的Normal值。我写了一个小脚本,帮助自己就是找出粒子最大法线值,然后乘以0.678。差不多就是所需要的值。

上面脚本功能很简单,就是可以找出合适的Normal值。在测试融化前,只要运行一次就可以了,目的就是为了找出一个值。

当然你也可以利用脚本,自动给filter赋予值。

脚本思路:

1.遍历粒子,获取粒子的normal,然后取模,得到normal法线长度

2.把这个长度加到一个列表中,然后计算出最大的长度。

也就是处理最表面粒子的法线值。

最后我把这个最大值,乘以0.678差不多就是我需要的融化normal值了。

下面脚本,我加了一个null.position条件。这是为了速度考虑,因为只要搜集最表面的粒子就可以了。并不是搜集的粒子越多越好。

maxSample是为了限制列表的长度。同样也是为了计算速度考虑。

注意:最后得到值也只是一个参考数值,具体是多少还是需要自己测试

温度方法

这其实应该是最先考虑到的方法,仔细观察一下生活就应该知道。融化这种效果,其实本质就是温度的变化。但物理归物理,如何把这种思路与CG软件结合起来。

说起来也很简单,就是

定义两种温度:

流体温度(可高,可低)

环境温度(可以为环境,也可以是某一个有范围的物体)

温度在这里的本质,就是某一个通道值的变化,并且是一个标量。

温度如何变化。

可以参考牛顿冷却定律。虽然这是针对理想流体的,但这绝对满足你的要求。

真实的流体温度变化比较复杂。 

知道简单的关于温度两点。

温度总是由高到低

温度冷却是呈指数方式衰减

只要知道这两点就可以,不需要研究什么复杂的数学方程。

HotACold插件是是比较好的温度方法:

它的原理很简单,就是根据一定规则定义一个温度通道,可以根据环境温度,物体温度做一些变化

还有就是流体的粘度也会根据温度做出相应变化

(图片来自vimeo

这想这张图是对温度通道最好的诠释了

Bouns:

下面是对HotAcold插件的参数中文解释。与之类似的还有一个叫Iomelt的插件。它的原理就是先根据这个插件方法定义一个温度,然后把到达一定温度的粒子转移走。

HotACold插件,最重要的一点就是根据neighbor判断流体边界粒子赋予相应值。就是遍历流体,如果某一个粒子的相邻粒子数,小于给定值,就把它看作流体边界的粒子

参数名称

取值范围

中文

Up 朝向 定义向量的“方向”。也被用到沸腾(boiling)力的强制流体朝向
Liquid Temperature (LT) 流体温度 >0 (In Kelvin,开尔文) : 初始温度,粒子年龄为0时的温度
Ambient Temperature (AT) 环境温度 >0 (In Kelvin) : 环境温度
Ambient Effect (AE) 环境效果 >=0 : 该值设置,环境温度(AT)对流体边缘粒子影响效果
Ambient Neighbour Limit 环境相邻极限 >=0 : 当粒子相邻粒子数少于这个值,就被看成是流体边缘的粒子。将会受到环境温度影响
Neutral Temperature (FT) 中立值() >=0 (In Kelvin) : 指定温度,哪部分流体是中立的。低于这个温度,粘度会大幅度增加
Boiling Temperature (BT) 沸腾温度 >=0 (In Kelvin) : 指定流体沸腾。基于这个问题应用一个向上的力。温度越高力越大
Object Effect (OE) 物体影响 >=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 : 代替或合并,与发射器的标准粘度值。因为发射器的viscosity可以设置为0.这个粘度是计算每粒子级别的,根据温度计算,指数法则函数:
Viscosity = VF * DV^VSF * exp( - TF * ( T – FT ))
; DV 相邻粒子不同速度
; PLF 是粘度指数法则因子
; TF 是粘度温度因子
; T 是当前温度
; FT 冻结温度
Viscosity Temperature Factor(TF) 粘度温度系数 指数温度因子,见上面
Viscosity Speed factor (VSF) 粘度速度系数 Delta速度指数因子,见上面
Boiling Factor(Strength) (BF) 沸腾强度系数 >=0 : 这个系数定义向上温度的力:
沸腾力不是应用到流体边缘粒子上,那已经由 Ambient Neighbour Limit定义过了
Force = BF * (1 - exp( - BTF * (T – BT )) * UP
Boiling Temperature Factor (BTF) 沸腾温度系数 >=0 : 指数温度因子,见上面。当前沸腾温度,用来增加沸腾不管压力pressure
Allow Freeze below Neutral Temperature 低于FT温度,允许冻结粒子(freeze) Daemon Inactive后,粒子会全部unfreeze.可能冻结时,并不是真正的freeze.经测试,它冻结后还是会继续保持一点点运动,而不是突然停止。感觉是很大粘度的感觉。(感觉错误,其实是因为温度变化关系。粒子还是正常冻结,想多了)
Transfer to Emitter 转移到发射器
Target Emitter: 目标发射器
Condition 条件
Custom Temperature 自定义温度

距离场(distance field)方法

粒子与给定点的距离。也可以是给定mesh距离,

就是mesh-distance这样的通道概念。肯定是距离越小粒子越在表面。

你可以根据distance场来定义受力大小。

Distance Field

力的方法

力这个条件应该是所有上面方法的一个总结 。

力的变化。

可以让需要的部分,粒子先受比较大的力,然后一点点扩散到周围。甚至直接使用一个力的范围框,只要在力的范围中,就定义为需要融化的粒子。

上面所以方法都是要把粒子分离出来,目的也为了使用不同部分受不同的力。

四、处理分离部分

处理分离粒子,就是融化出来的部分。通常只要加上一个重力就可以。你甚至可以把重力反过来。这样可以得到一个简单魔法效果

分离后的粒子通常需要与原始部分有碰撞。

所以融化后粒子的状态设置,就是处理分离部分

五、 Python脚本方法

如果要突破软件的限制,使用脚本是一个不错的手段。脚本方法可以综合所有上面的方法。也可以任意搭配条件。

myFilter(自定义分离器)

realflow中,有一个非常方便的daemon filter,可以根据一定条件,把一套发射器中的粒子,分离到另一套发射器。

这个daemon,大部分时候很有用,但它只能同时支持一个条件。

所以你可以需要自己定义一个filter。或者是你把粒子再分离一次。这样粒子之前交互就多了一层。相当于二次分离。做水面泡沫,或者岩浆上面变黑的那一层时,我确认这样做过。

定义自己的过滤器。

方法很简单,全代码如下。里面的条件可以任意换

myForce(自定义力)

一个简单根据年龄,让粒子受到外力的脚本

写力的脚本,重力在于两点

1.如何定义力的大小

2.如何定义力的方向

这个脚本力的大小就是使用简单的指数衰减形式。方向更简单,就是原始速度方向的一个负方向。

这样就实现了一个阻力的效果

粒子会随着年龄受到外力越来越大。最后,是我把这个脚本关闭,粒子全部像水一样流走。

myTemperature(自定义温度)

这是一个简单的温度场。

1.根据null物体中心点与粒子距离对比

2.使用这个距离使用指数衰减得出力大小

3.温度每时每刻都趋向于一个给定值,物理意义是与环境温度相同。写这个脚本目的就是为了学习HotAcold。当然这里定义的条件没有它多。这个温度场,可以跟力结合起来,这样就得到了一个有变化的力。

HotAcold有一个缺点就是不能手动控制范围,你可以使用这个温度场来任意定义温度范围

效果图

总结:

最后,说一下,掌握这些技术细节,并不是一个好效果关键工作。

需要看大量参考,通过自己观察。与学习别人艺术化的东西。才能呈现好的效果。

下图是我为了观察融化效果。自己拿打火机烧蜡烛玩

(看我烧烧烧。

不会告诉你下面绿色液体是我最喜欢的芬达,蓝色液体是英雄墨水

混合一刹那,再加上蜡烛滴下去,真的非常好玩

(大自然永远是最美的,做特效真好玩)