注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

豆芽兵的生存探索

因,记录。留下历史,看到未来...

 
 
 

日志

 
 

RealFlow翻译教程——水花(十一)  

2012-04-14 22:43:39|  分类: RealFlow探索 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

推荐此教程精彩看点:

(一)原教程看点:

1.巧妙场景设置,制作出真实漂亮水花

         2.一个短小高效脚本,删除水面下粒子

(二)翻译后教程看点:

     1.本人对RealWave重要参数,应用心得

         2.对脚本的不同角度剖析,让脚本用的更自由,及豆芽兵二个月前写类似功能脚本反思总结

         3.豆芽兵工作经验,用acahe方法,让模拟更稳定

         4.豆芽兵RealWave另类应用,类流沙效果测试

         5.豆芽兵送上,RealFlow后台渲染方法

         6.豆芽兵艰难翻译:Blue Sky Studio 《冰河世纪》的 动画技术总监John David Thornton水花制作相关论文,思想核心放送

         7.自定义浪面的怪异表现。非本人能想通,能解决。期待高手指点。

 

飞溅水花


RealWave Object Splashes (真实波浪物体水花)

 

RealWave是一个非常方便快捷的,用来创建,真实海洋表面上波浪的工具。但它有很多bug,使得在很多方面无法使用。有些问题影响创建潮湿贴图(wetmaps)。波浪频率太高时,交互物体产生的水花细节不足。RealWave有两个特殊发射器"Crest Splash"和"Object Splash"。特别是"Object Splash"发射器,难以处理的原因有很多方面:

 

1.不可控的粒子量

2.爆开和非正常高加速的粒子

3.超长的模拟时间

4.RealWave表面直接产生的粒子,创建的外观不自然

5.不可控的水花外观

6.发射器Resolution值打太高时,RealFlow会崩溃

 

问题的清单很长,似乎没有解决方案,但幸运的是我们有一个很容易使用的设置,只需要简单点几下。这个免费的教程向你展示了,怎么在RealWave表面创建令人印象深刻和完全可以控制的水花。你还会学习到怎样可以产生大量粒子,还不会崩溃。

 

模拟的效果看起来自然,真实。所有参数设置,会直接表现在水花外观上。你学完后会感觉,"Object Splash"发射器完全是另一个样子,怎么会这么好用。下图显示了三个完全不同的水花。三个下落物体的物理属性相同:大小(size),质量(mass),速度 (velocity)和面数。你可以把所有下落物体,放到同一个"Object Splash"节点里。

 

你可能会注意到,水下竟然一个粒子也没有。因为这里用了一个非常简单,却很有效的脚本将水下粒子删除了。这个小脚本用在每帧(per-frame)基础上,因此它运行也很快。

 

 

 

--------------------------------------------------------------------正文--------------------------------------------

RealWave 发射器

 

RealFlow为RealWave提供了两个独立的粒子发射器:"Object Splash"和"Crest Splash"。第二个发射器用来创建浪花顶部白色水花(white cap)和泡沫(foam)。而第一个是为了制作经典的物体落水时的水花。(下图是译者自己加的,这些术语必须心中有数)

这两种粒子发射器,有与"Circle"或"Square"这样的正常发射器,完全相同的物理属性。但它们也具有很多特属于RealWave的参数。这两个发射器最重要作用是可以与其它物体进行交互:模型、另一个粒子发射器,甚至和Hybrido的splash和foam进行交互。当然它们肯定能与RealWave的Surface进行交互(这是最基本的)。它们可以创建涟漪。像其它任何基于粒子(particle-based)的发射器一样,这两个发射器不能与网格流体(grid fluid)进行交互。(关于这基于粒子流体和基于网格流体的区别,可以查看本人做火焰那篇教程)

图1:可用的RealWave节点。

 

在本次教程中,我们将会集中在"Object Splash"发射器,你将学习到怎么创建真实的飞溅水花。用本教程方法你能完全控制水花强度和水花外形。相比这些对"Object Splash"发射器相关技巧和提示,都是针对的"liquid"粒子而不是"dumb"粒子。Liquid模拟起来通常要比dumb粒子模拟花的时间多,但你会得到更好的模型结果,也能为渲染图片时提供更多设置。(liquid参数更多,模拟出来粒子文件含有更多的信息,在渲染时可以用到,如velocity,density这些,渲染时可以调用这些通道。)

 

物体水花—— 一个标准场景

 

当你使用其它基于粒子的发射器时,你心中可能有一个固定的工作流程了:先添加一个节点,对好位置,然后调节辅助器与流体参数,最后模拟就可以了。让我们试试在一个简单的RealWave场景里这么做,会发生什么。

 

这个场景里元素有:一个RealWave Surface网格面,一个"Object Splash"发射器,一个交互物体(例如 一个球,sphere),一个"Gravity"(重力场)和一个"k Volume"辅助器。为了更好的观察,把辅助器隐藏起来。需要把sphere切换成动力学特性。注意在RealFlow 5和 2012是不同的:

Sphere01 > Node Params > Node > Dynamics > Rigid body (RF5)

Sphere 01 > Node Params > Node > Dynamics > Active rigid body (RF2012)

 

然后在"Rigid body"面板把sphere的mass值改成100,然后把这个球位置调整在RealWave网格上面一点。"K Volme"辅助器,包住RealWave 网格和sphere。整个场景如下图所示:

开始测试时,只做一个"添加"设置:这一步是必须的,是告诉"Object Splash"发射器到底是哪个物体产生水花。请把这个sphere加入到发射器中:

 

Node Params > RW_Object_Splash > Objects

 

是可以添加多个物体到同一个splash emitter中。用这个功能,你可以很容易的创建出一组具有相同参数和模拟结果的水花。

其余参数保持不变,然后就开始模拟吧,点击"Simulate"。几帧过后,你会看到一个非常令人失望的结果:很难有粒子留在表面上,模拟的很差。

 

 

跟发射器的"Resolution"值肯定有关系,但不能大幅增加它,不然会导致RealFlow崩溃。导致这样的原因是发射器的"Hit force"值。这个参数决定了,下落物体影响的水面,产生粒子的强度有多大。如果有问题,请设置这个参数为0或是非常小的值:

Node Params > RW Particle Interaction > Hit force > 0

 

"Resolution"值再打高一点,模拟结果可以接受了,是那种典型的外观,也正是我们希望的模拟结果。然而水花变得有一点高,Resolution还是不够,但对于这个基本的测试模拟已经足够了。还会注意到,物体下落碰到水面时的模拟时间立即下降。

 

想要增加水花强度,可以把发射器的"H strength"和"V strength"值增加。这两个参数值会与粒子的速度值(velocity)相乘。要限制水花侧面发射,也有相对应的参数。另一个用来控制水花强度和高度的值是"Speed mult",它在创建时(creation time ,类比Maya Expression 中creation事件)乘以粒子的速度,在创建时所有方向上,不仅是垂直和水平,而是整个强度的变化。

图2:"Object Splash"特别参数

最后,有还一个方法影响粒子速度,基于粒子自己的线性速度。第一个参数称作"Parent obj speed'值为1(这也是最大值)会完成添加物体速度到粒子速度上。为0时,滑物体速度增加。

 

第二个参数是"Speed threshold"(速度阈值),只有物体的速度大于这个值才会产生粒子。这是非常有效的方法增加或减少大量粒子。

---------------------------------------------------------------------------------------------------------------------

补充一段:

RealWave属性心得。

 

Prticles面板,这是一个通用的面板,所有发射器都有,常用的有,译者前面教程也有涉及,这里再重复一次。

 

Type:选择粒子类型,默认的就是Liquid,这种粒子应用最广。有内外压,和张力一些属性。相比Dumb粒子就是有了内外压力。

 

Resolution :该值越大,粒子生成越多。具体多种,跟场景缩放也有很大关系,一般先小值,再大值。

Surface Tension: 表面张力,通常我都设置在10左右。可用辅助器代替。

 

RW Particle Interaction 面板 (注意在把RealWave做成acahe时,这个面板会失效)

这个面板在我们做效果时最容易忽略而不去调节,而恰恰很多关键值就隐藏在这里。

 

Destroy on depth 这个值可以杀灭水花粒子,0是无限大。可设置成0.1这些。本教程脚本跟这个值功能相能,但效果更好.

 

Hit Force :撞击系数,本教程核心参数,没有之一。如果设置不好,场景会经常崩溃,做水花时,直接打成0

下面@属性,都是做涟漪时用到的,在这不提。

 

RW_Object_Splash面板,这个面板是必须要调整的,大部分参数在这,也是RealWave魅力所在。

 

Object : 加入碰撞物体的,可多选

Waterline mult :默认1,表示交互产生出粒子是100%

@width :水花产生宽度,不要太大。有时候粒子产生不出来时,可试着加大

@H /V strength :纵向/横向强度,是一个乘数,就是其值会乘以粒子的velocity值。

@Side emission:边发射,可以理解成"偏度"值越大,发射粒子范围越窄

Underwater mult :水下粒子,默认是0。这个值如果打开,物体落到水里,还会在水面下产生粒子,可以做泡泡效果。

Speed mult:这个值可以很大程度影响整体粒子强度,小心调节

Parent Obj Speed :继承物体速度,可超过1,粒子会根据物体运动速度变化,不建议调节。

Speed threshold:阈值,如果物体运动速度小于这个值粒子不会发射,下面Speed variation就是对这个阈值进行随机化处理。

 

 

我们做RealFlow交互水花经常遇到而又不得不解决的问题及原因:

 

问题一:粒子产生不出来

这问题必须要解决不然谈不上什么效果。根据本人经验有这样几个原因

  1. 场景比例原因。别的文件导入进来的场景如果太大,经常性的粒子就会产生不出来。只要把场景缩小就可以了(scale值),不建议一开始通过Resolution。
  2. 物体运动速度达不到 阈值(Speed threshold)。如果物体运动速度太小,就要把这个阈值改小一点。
  3. 碰撞物体法线不正确。这个问题隐藏最深,经常会忽视。建议导出物体时,检查法线是否正确。如果是错误,Realwave Display面板下可以反转法线,虽然它在显示面板下,这确实会起作用。(通常会误解为,显示面板下属性不影响模拟的,在RealFlow里不是这样)
  4. 添加了k-Volume场,这个问题也容易发生,你在一个很大场景,而又不小心添加了K-volume场又不去调整大小,粒子一产生就被杀死自然看不到

     

  问题二:粒子速度不够快或慢,高或矮

  1. 首先检查FPS是不是需要的,我喜欢用这FPS进行速率控制。但不建议一开始使用
  2. H/V strength /Normal Speed /speed mult /parent Obj Speed/这几个参数都会影响粒子速度和高度
  3. 物体本身运动速度
  4. 添加了Drag来控制,主要用来变慢

---------------------------------------------------------------------------------------------------

图3:标准场景"Resolution" 值为250

 

要获得很高的水花,比较好的做法,先用"V strength"和"H strengh"值。观察真实的水花外形,你会看到粒子主要创建在物体周围。当物体完全没入到水中,后面水的动态,像水滴。如果碰撞物体是不规则的,或非常重,亦或有初始的旋转,你会观察到水往旁边发射。

 

对规则光滑的物体,像球体,水花更多是垂直方向。为了模拟这种动态,"Side emission"和"H strength"必须减小。

 

Node Params > RW_Object_Splash > Side emission > 0.2

Node Params > RW_Object_Splash > H strength > 0.2

 

最终,"V strength"设置成这样

 

Node Params > RW_Object_Splash > V strength > 1.0

 

用这些设置就可以创建不错的水花,结果确实比之前好多了:

图.4 用上面参数模拟的结果

 

你会看到大部分的粒子被删除了,当他们碰到RealWave Surface面时,在这里设置:

 

Node Params > RW Particle Interaction > On surface > Destroy

 

如果你想保留粒子,请选择"Place"在这个菜单。如果没有交互就选择"No interact".

 

选择"Place"可以用来模拟泡沫,顺便说一下,这个模式也是导致爆炸粒子和使水花形态不像的原因。最好的结果是选择"Destroy"

(粒子碰到这个面就死去)

 

仍然缺少足够数量的粒子。当前有12,000或15,000个粒子,但还不足够用来做好的mesh或进行渲染。为此就需要更多的粒子。唯一有效得到更多粒子方法是

 

1.更高的发射器Resoultion

2. 用"K Speed"辅助器激活"Split"设置(这个辅助器,可以根据设置的速度值,达到这个速度的粒子会分裂出新粒子)

 

"k Speed"辅助器可以创建巨量的粒子,它完全符合我们目的,但结果看着不真实,并且这个技术也有局限。另一方面用高的"Resolution"值,产生精确的结果,但要花很长的模拟时间,甚至设置到1000,粒子数仍然不够多。另一缺点是,变得越来越难控制,在"Resolution"值达到五六百时,RealFlow就可能会崩溃。我们需要在可接受的模拟时间和粒子数之间做一个平衡。

 

一个先进的方法

 

到目前为止,创建一个好的水花期望还没有达到。你可能有一些崩溃和难以控制水花经历。这里介绍的方法,可以解决所有问题,创建出非常真实,高度可控的飞溅水花,几乎是无限数量粒子。

Exclusive Links

 

解决方法是单独的元素与交互对像关联。RealFlow提供了一个非常好的方法来定义哪一个元素在全局(Global)或独有(Exclusive)关联。所以第一步就是在全局(Global Links)面板中删除所有结点。

 

下一步是定义,基本的全局关联——他们是必须移动的,并引发粒子产生。

 

Sphere <-> Gravity

Sphere <-> RealWave

Object Splash <-> Gravity

Object Splash <-> k Volume

Object Splash <-> RealWave

 

这些关联可以用鼠标轻松的拖放建立,但你要遵循一些基本规则,因为RealFlow的"Global Links"遵循层级。

 

1.Object(物体)和emitter(发射器)必须要放在RealWave节点下

 

2.Daemon(辅助器)必须在物体和发射器下

 

3.物体必须在发射器下

 

4.物体必然在归入其它对像。

 

关联实际不是真正需要,"Object Splash"发射器和交互对像。所以这是一个好主意开始,开始时用单独关联("Exclusive Links")设置起来像下面一页:

图5:

在做这一步时,前回复默认设置,否则在你模拟时你会不知道哪个值影响。这些参数要重置:

 

H strength > 0.5

V strength > 0.5

Side emission > 0.5

 

发射器的"Resolution"还是250,"Hit force"仍是0.0.现在场景模拟结果是。

图6:单独关联("Exclusive Links")后的模拟

 

当物体落到水面一半时就能看出明显的不一样:粒子主要在水面上产生而不是在水下。当然这导致是完全不同的水花。这个水花更"连贯",但还是有足够的细节。用标准设置,问题开始用的"Resolution"值高于500,可看成是最终的测试。为了保险一点,下个模拟用值为1,500.

 

这个水花效果不错,粒子数也达到需要。另外模拟绝对稳定,甚至发射器"Place"设置,粒子留在表面 ,也没有崩溃。看来正是球与"Object Splash"之间的关联导致问题的。

 

尽管这个描述的方法的所有优点,它仍然可以发生,

RealFlow的变得不稳定甚至崩溃,但现在,这应该是一个例外。它会出现RealWave modifie组合(例如用"Statistical Spectrum"modifier)会导致问题。最好的是用"Fractal"modifier.另一个动作,导致崩溃是快速变化的RealFlow的视图,和透视图模式(顶视图,投视图等等)在很高的粒子数时。要快速模拟,你要快速模拟你也可以禁用RF视图,用"Alt +D".

 

(译者注:本教程,用单独链接的方法,的确避免了崩溃问题。但通常情况下,我们做交互,又必须要与物体进行关联。上面单独关联目的就是为了粒子不与球进行交互。 如果你想做轮船行驶时产生的水花,就必须要关联。那时是怎么解决崩溃问题的,就是把RealWave做成cache。这里因为一些原因不能把说的太细,想了解更多的,请单独发邮件探讨。)

 

升华

 

到目前为止,波面一直只是一个平面,这就是为什么

溅起来是一个相当无趣的和统一的外观。

 

典型飞溅的样子,是和外部影响的组合,例如波的速度和你的"RW_Object_Splash"设置。物体的形状也占有很大因素。

也有一些其他因素,可以极大地改变仿真的外观,例如RealWave网的多边形大小,辅助器参数,障碍物和物体的物理性质。

 

有趣的效果也可以实现,当你使交互物体漂浮在波浪表面上。在这种情况下,将不断创造新的粒子。例如,当碰到浪,或超出 "速度阈值"。这种行为创造了非常好的效果。

图7.不错的水花,用Torus模拟创建。

 

如前所述,"place"选项,可以用来模拟泡沫的效果,但是请注意,这个"泡沫"的效果是与Hybrido的"泡沫"的发射器没有可比性的。.提供泡沫,聚集在波谷,---用Object Splash 发射器由于重力。这也是为什么grid流体泡沫不需要与场景中"Gravity"关联原因。

 

水下粒子

 

一个常见问题"Object Splash"发射器在水下粒子并不那么容易删除。用传统方法,"K"辅助器,获得外观很不自然,特别是用"k Volume"要避免误解:"k Volume"辅助器是很重要的在这种模拟中,但仅是删除离开RW网面的粒子。当你用它删除水面下粒子,你会得到一个奇怪的线,粒子突然消失。

(为什么Demon要这种水上水下都有的)

 

用"k Age"辅助器也是差不多,因为大部分粒子-或多或少-是在同一时间点创建的。当你想用"k Age"辅助器,确定你设置很高的"Variation"值,关闭"Life"值。请记住"K Age"是按帧起效,不是按秒。"Object Splash"发射器也有一个内置函数来删除粒子,就是"Destroy on depth".(杀灭深度)。不辛的时,这个参数不容易调节(至少不能用在一些modifier,例如"Spectrum"

它有效果有点像"K Volume"辅助器。

 

 

脚本方案  (如果暂时看不明白脚本意思,可以先学习一下,本博客,关于RealFlow Python的基础教程

 

删除水面以下的粒子最有效的方法是写一个简短的Python 脚本。当然,有人可能会说这个脚本会增加大量的模拟时间,但幸运的是,脚本的影响几乎可以忽略。很重要的原因是,脚本是基于每帧(per-frame)的,不是每步长(simulation step).这已经大幅度减少了时间。

 

这个脚本一个特定功能是,不断检查粒子是不是在水面下。这方便方法节省了很多计算时间。因为没有必要手动检查。

 

(粒子是每帧生成的,不用担心,本人之前也尝试写过一个脚本,但运行效率跟这个差太多了。我之前因为没有注意到RealWave有isBelowRealWave这个属性。我是判断每一个点的坐标位置进行判断。那种方法太笨了,就不详细说了。)

 

在这种情况下,脚本遍历所有顶点RealWave网与粒子的位置,并比较他们的位置。这样的蛮力方法需要大量的计算时间,因为我们要检查每个粒子对每个顶点。

当然,也有方法,以减少数量计算,例如,如果脚本只考虑目前观察到的粒子周围一定半径内的顶点,(这是优化方法,我之前没想过)但内置的功能仍然是更方便,快捷,

 

这里所使用的功能被称为"isBelowRealWave()",并返回一个简单的"真"或"假"的标志 - 这是一个布尔函数。当"isBelowRealWave()"是"真",然后粒子是在不面以下,可以将其删除。

  注意此脚本不能与自定义的浪面一起使用。如果使用自定义的浪面,会崩溃。。。。

脚本仅短短几行:

splashEmitterList = scene.getEmitters()

 

for emitter in splashEmitterList:

    particle    =    emitter.getFirstParticle()

    while(particle):

        if(particle.isBelowRealwave()    ==    True):

            emitter.removeParticle(particle.getId())

 

        particle    =    particle.getNextParticle()

 

脚本收集场景中的所有发射器,不仅是"Object Splash"发射器

,作为名称"splashEmitterList"可能表明,是因为没有(on-the-fly动态)从其他发射类型的方法来单独飞溅发射。因此,如果你想跳过其他发射器,你必须手动执行此操作。只需单独的"Object Splash"发射名为"RW_Object_Splash01"的的脚本如右图所示:

    splashEmitter    =    scene.getEmitter("RW_Object_Splash01")

    particle        =    splashEmitter.getFirstParticle()    

 

    while(particle):

        if(particle.isBelowRealwave()    ==    True):

            emitter.removeParticle(particle.getId())

 

        particle    =    particle.getNextParticle()

这已经是一切。使用它,打开"Simulation Events"窗口,对"FramesPre"右击,选择"Add Script",并复制/出现的窗口中键入脚本。关闭窗口,并开始你的模拟。结果是一个"干净"没有任何水下粒子飞溅。

图8:渲染图片,删除水下粒子,泡沫和浮动的球

 

 

下面是本人一个小测试:RealWave模拟特殊的流沙效果。沙子不停往中心下落,还同时向外扩散。

 


 
RealFlow翻译教程——水花(十一) - 豆芽兵 - 豆芽兵的天地
 

不详细说,只说一下大概思路

 

1.RW,用物体砸出一个波浪出来

 

2.用由上面RealWave自动产生的SD文件,来创建Crest

 

3.中间加一个引力场,粒子就会不短往下落了,同时还扩大。

 

4渲染用的KK,光效

 

制作最多十五分钟,之前我用别的方法模拟这效果绝对没有这个快。

 

 

 

《冰河世纪》一个总监写了篇做水花论文。我试着翻译了一下。下面只说它的大概思路。

 

第一步:分析二维动画中水花。也就是抓住真正水花本质。

1.动力学轮廓(动态轮廓)

2.分明的边线

3.内部明显"圆柱状"

4.比真实大的水滴

5.在有撕开的洞

 

 

第二步:进行简单绑定,如图。用一个个小圆柱。然后根据需要key帧。用这个来发射粒子。这样整体水花形态,和动画节奏就完全自己控制了。这是普通动力学模拟很难达到的。这也是本方法的核心所在

 

下图,是用上面绑定做的一些效果

 

此方法的一些思维拓展,如做牛奶滴,雨滴,大水花,小水花,模拟速度还超级快。再说一次,这是动画总监写的论文。

 

 

 

 

RealFlow后台模拟: 

 

  1. 保存好你要模拟的场景
  2. 打开Cmd
  3. 输入" cd C:\Program Files\Next Limit\RealFlow 2012"
  4. 回车后
  5. 再输入"realfflow –nogui –threads 16 –range 0 150 D:\BoatWake\BoatWake.flw"

 

(上面两次输入,引号不要,看参考下图。 Threads 后面是你计算CPU核数 ,-range 首尾帧 然后详细路径包括文件名.后缀)


(经过对比,此方法与按下 Alt +D 隐藏视图时(Disable Viewports)的运算时间是差不多的,)

 

这是我看完后收获和一些小想法:列在下面

Tips:  1.RF :RW_Object_Splash --RW Particle Interaction --Hit force 碰撞时,打为0,刚体下落速度会提高很多

就是控制落到RW——surface,撞击力度,这个值打为0,水面只有波纹,不会有因为水落下产生的不规则起伏

2.Alt+D:屏蔽视图,这样避免在渲染时因为,查看而崩溃

3.Bin解算一半就查看,RF容易崩溃

4.脚本可以优化成,只在某几帧起作用

这个脚本如果用在正常方法水花,前几帧会删除不了。可以把脚本改成每步长执行(跳步优化)的,这就是牺牲模拟时间。

 

按照真实情况,开始有水花在下面,也是合理的,非要删除也可以

 

 

  评论这张
 
阅读(19790)| 评论(24)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017