≡
导航
搜索
教程
插件
模型
模板
博客
交易
朋友
Realflow吧
已关注 | 取消
+关注
关注:
73
帖子:
45
签到
07月14日 尚未签到
看帖
图片
精品
视频
共有回帖数
0
个
Realflow 2013 中文融化教程详解[终极篇]
取消只看楼主
收藏
回复
晚街听风
等级:
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(自定义温度) 24总结: 26
一、不同手法制作简要对比:不同手法制作对比:通过上一篇,对“融化模型”的探索,我们知道了融化的基本思路
优点:1.可以保持非冻结部分的交互2.有大量属性可以应用。(有最重要的法线Normal属性)缺点:通常需要配合freeze冻结函数才能使用或者原始粒子不与解冻后的粒子交互。第一篇,金属人头就是这么做的。(就是填充的粒子发射器不要与融化的发射器做关联)注意:在解算开始时,需要把粒子速度降到最低。可以使用解算方法也可以直接使用脚本归零粒子速度2.2 Dumb粒子这种类型的粒子完全没有流体的属性。但使用它做为初始状态会有明显的速度优势。操作:只要把Fill_Object类型切换成 Dumb就可以。它也可以冻结。优点:计算速度非常快使用力进行影响,会产生一定交互性。增加融化真实性。缺点:1.没有Normal属性。所以不能与法线的方法进行配合2.使用力做为分离条件,难以控制(因为这种粒子受力会直接坍陷到一起)注意:使用这种粒子填充,一定要注意力的范围,不然原始模型会变型。应用案例:1.Realflow2013帮助文档自带融化案例,就是填充的Dumb粒子2.3 Elastics粒子弹性粒子,类似于柔体。使用这种方法保持物体初始状态。可以做果冻这种类似物质效果优点:1.不需要冻结,也能保持原始状态可以产生一定交互可以达到一定弹性效果,做一些特殊案例很有用缺点:1.计算速度太慢2.没dumb粒子一样,具体的属性较少3.容易产生爆开的粒子注意:应用案例:(粒子像柔体一样,有弹性变形)
我们做融化时,其实就是冻结效果反向效果。一开始需要把全部粒子冻结。然后根据一定条件一点点解冻,这样就可以观察到粒子一点点分离,感觉就是融化效果。
操作:python脚本方法
缺点:
1.对于效果来说,有一个最大问题是,冻结部分粒子不能与解冻粒子交互。
2.这是一个函数。需要写脚本来应用。
因此解算速度会受脚本语言限制,如python只能单核计算。可以使用Graph结点来代替,或者是使用C++
优点:
1.容易控制,并与多种融化条件配合。
2.适用于所有类型粒子。特别是配合liquid使用。
注意:
1. 冻结时把所以粒子速度设置归零。(冻结的粒子是保持冻结时的速度和位置,如果不归零,在解冻后会影响融化动态)
因为冻结是一种特殊保持初始状态的方法,与下面几张都不一样。
应用案例:
1.经典的融化melt脚本
(另一篇博客有详细介绍)
2.肥皂泡破裂案例
3.
4.其它各种应用
Bouns:
1.有一个经典的freeze融化脚本
它的原理是在模拟前冻结粒子(这是为了保持模型初始动态).这脚本首先,在表面找出一个粒子点。然后找出这个粒子相邻粒子,进行排序,一个个unfreeze。unfreeze的粒子会受到重力下落,能产生经典的融化效果,很像金属熔融的感觉。
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插件是是比较好的温度方法:
力的方法
力这个条件应该是所有上面方法的一个总结 。
力的变化。
可以让需要的部分,粒子先受比较大的力,然后一点点扩散到周围。甚至直接使用一个力的范围框,只要在力的范围中,就定义为需要融化的粒子。
上面所以方法都是要把粒子分离出来,目的也为了使用不同部分受不同的力。
四、处理分离部分
处理分离粒子,就是融化出来的部分。通常只要加上一个重力就可以。你甚至可以把重力反过来。这样可以得到一个简单魔法效果
分离后的粒子通常需要与原始部分有碰撞。
所以融化后粒子的状态设置,就是处理分离部分
五、 Python脚本方法
如果要突破软件的限制,使用脚本是一个不错的手段。脚本方法可以综合所有上面的方法。也可以任意搭配条件。
myFilter(自定义分离器)
realflow中,有一个非常方便的daemon filter,可以根据一定条件,把一套发射器中的粒子,分离到另一套发射器。
这个daemon,大部分时候很有用,但它只能同时支持一个条件。
所以你可以需要自己定义一个filter。或者是你把粒子再分离一次。这样粒子之前交互就多了一层。相当于二次分离。做水面泡沫,或者岩浆上面变黑的那一层时,我确认这样做过。
定义自己的过滤器。
方法很简单,全代码如下。里面的条件可以任意换
这是一个简单的温度场。1.根据null物体中心点与粒子距离对比2.使用这个距离使用指数衰减得出力大小3.温度每时每刻都趋向于一个给定值,物理意义是与环境温度相同。写这个脚本目的就是为了学习HotAcold。当然这里定义的条件没有它多。这个温度场,可以跟力结合起来,这样就得到了一个有变化的力。HotAcold有一个缺点就是不能手动控制范围,你可以使用这个温度场来任意定义温度范围
总结:最后,说一下,掌握这些技术细节,并不是一个好效果关键工作。需要看大量参考,通过自己观察。与学习别人艺术化的东西。才能呈现好的效果。下图是我为了观察融化效果。自己拿打火机烧蜡烛玩
楼主 2015-08-01 21:14
回复
共有回帖数
0
个
回 帖
表情
图片
视频
欢迎来到本吧,您可以在此发帖和众多大咖交流学习.
选择或直接输入昵称
Tips:支持QQ截图直接粘贴
发表
登录直线网账号
自动登录
忘记密码
免费注册
本吧信息
查看详情
吧主:
禾木
本吧公告
暂无公告
我常逛的吧
我管理的吧
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈
|
关于直线
|
版权声明
|
会员须知