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交互水花经常遇到而又不得不解决的问题及原因:


  问题一:粒子产生不出来

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

  场景比例原因。别的文件导入进来的场景如果太大,经常性的粒子就会产生不出来。只要把场景缩小就可以了(scale值),不建议一开始通过Resolution。

  物体运动速度达不到 阈值(Speed threshold)。如果物体运动速度太小,就要把这个阈值改小一点。

  碰撞物体法线不正确。这个问题隐藏最深,经常会忽视。建议导出物体时,检查法线是否正确。如果是错误,Realwave Display面板下可以反转法线,虽然它在显示面板下,这确实会起作用。(通常会误解为,显示面板下属性不影响模拟的,在RealFlow里不是这样)

  添加了k-Volume场,这个问题也容易发生,你在一个很大场景,而又不小心添加了K-volume场又不去调整大小,粒子一产生就被杀死自然看不到


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

  首先检查FPS是不是需要的,我喜欢用这FPS进行速率控制。但不建议一开始使用

  H/V strength /Normal Speed /speed mult /parent Obj Speed/这几个参数都会影响粒子速度和高度

  物体本身运动速度

  添加了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:渲染图片,删除水下粒子,泡沫和浮动的球


相关教程学习视频:


,realflow案例,realflow教程