咨询电话:400-810-1418服务与监督电话:400-810-1418转接2

RealFlow教程:如何利用脚本创建realwave网格

发布时间:2019-08-07 17:30:23

今天我们将尝试一下制作物体撞击Realwave时产生的水花效果,以及如何使用脚本制作水花在生成Mesh时,与Realwave连为一体的效果。

先看下对比的效果:水花与水面不相融和相融的对比。

RealFlow教程:如何利用脚本创建realwave网格

左图是物体落入水面后溅起水花粒子,并对水花粒子和Realwave生成Mesh后的效果,图中的球状物即为水花粒子的Mesh。注意对比两幅图中水花的Mesh和Realwave的Mesh之间连接的部位,左图是解算完毕后,默认状态下生成Mesh的效果,可以看到水花Mesh落入Realwave时,犹如固体物质落入水中。

但是,在实际生活中,水花和水面均由水分子构成,是同一种状态( 液态)下的同一种物质。因此在水花与水面接触的那一刻,水分子之间应该已经开始融合,如右图所示,该效果才更接近真实世界。

更重要的是,左图中由于水花的Mesh和Realwave的Mesh是分离的,因此在导入其他三维软件中进行渲染时,两种Mesh接触的部位会受反射、折射等参数的影响而产生错误的渲染结果,直接影响到作品的效果。

实现右图中的效果,需要增加一步操作,每解算-帧均需要将该步骤操作一次。这样的话,如果解算一个长达,几百帧或几千帧的序列就会非常费时费力,为了简化手动操作的麻烦,可以使用一个脚本来实现这一操作。

◎Step 01:打开RealFlow,创建一个Realwave、一个Sphere (球体)物体和一-个Gravity (重力场)辅助器。将Sphere ( 球体)修改为主动刚体,如图14-52所示,并将其提升至-定的高度。

RealFlow教程:如何利用脚本创建realwave网格

◎Step 02:默认条件下进行解算,可以看到Sphere (球体)已经与Realwave产生了碰撞。

RealFlow教程:如何利用脚本创建realwave网格

◎Step 03:解算无误后,对解算内容进行Reset(重置),并对场景进行保存,以免丢失。在Realwave菜单下选择Object splash (物体水花)进行创建; 展开其节点参数面板,设置Objects (对象)为Sphere01,拾取需要创建水花的物体。

RealFlow教程:如何利用脚本创建realwave网格

◎Step 04:进行解算,发现物体落入水面时,已经产生了水花粒子。

RealFlow教程:如何利用脚本创建realwave网格

◎Step 05:下面为水花粒子和Realwave生成Mesh。单击厦按钮,选择Particle Mesh(standard) [粒子网格(标准) ]进行创建。.

◎Step 06:在Nodes (节点)面板中的ParticleMesh_ ST01 上单击鼠标右键,从弹出的菜单中选择Insert emitters (插入发射器)命令,在弹出的Select nodes (选择节点)对话框中选择RW_ Object_ Splash01, 单击OK按钮,将水花粒子拾取进来,此时水花粒子就会出现在ParticleMesh_ ST01的子选项中。

RealFlow教程:如何利用脚本创建realwave网格

◎Step 07:在Nodes(节点)面板中的ParticleMeshST01上单击鼠标右键,从弹出的菜单中选择Build, (建立)命令,为水花粒子建立序列Mesh。

RealFlow教程:如何利用脚本创建realwave网格

观察效果,发现水花和水面是两个单独的物体,这样在Maya中进行渲染时,水花与水面交界处就会出现问题,所以需要将其进行融合。

◎Step 08:在Nodes (节点)面板中的ParticleMesh ST01. 上单击鼠标右键,从弹出的菜单中选择Insertemitters (插入发射器)命令,打开Select nodes (选择节点)对话框,将Realwave02也添加进来。

这里将Realwave也添加进来,是因为Realwave也是由粒子构成的,并且需要与水花粒子产生交互,因此两者都需要生成Mesh。

◎Step 09:可以通过以下方式观察到Realwave的粒子,选中Realwave,在其节点参数面板中展开Realwave项,将Particle layer (粒子层)设置为Yes,如图14-63所示,此时可以看到Realwave表面上布满了密密麻麻的粒子。

RealFlow教程:如何利用脚本创建realwave网格

◎Step10在Nodes(节点)面板中的ParticleMeshSTO1上单击鼠标右键,从弹出的菜单中选择Build(建立)命令,建立Mesh,效果如图;若将Particle layer (粒子层)设置为No,则效果如图。

RealFlow教程:如何利用脚本创建realwave网格

注意:只有将Particlelayer(粒子层)开启时,才能使水花粒子和Realwave形成-一个整体;若Particle layer (粒子层)处于关闭状态,则水花粒子和Realwave并不能够相融。这里还有一个问题,即便将Particle layer (粒子层)开启,事实上系统也只是默认在当前帧当前Build (建立) Mesh的情况下,生效一次。在当前帧进行第2次Build (建立)或移至下一帧时,尽管Particle layer (粒子层)仍是开启状态,实际上已经为关闭状态了,那么如何知道Particle layer (粒子层)是否真的打开呢?很简单,在Realwave表面上可以看到排列整齐的粒子时,就表示该项已经打开,生成Mesh时才能够起效,否则失效。

出现了这样的问题,解算时就变得繁琐了,不能再使用序列Mesh-次性生成,需要手动完成解算。将Particle layer (粒子层)关闭,再次开启,解算当前帧;手动移至下一帧,再将Paricle layer (粒子层)关闭,再次开启,解算当前帧;依次类推,反复操作,完成整个序列Mesh的创建。

如果整个序列有几百帧或几千帧,那么这么操作无疑费时费力。那么该如何解决呢?方法就是利用脚本,通过一个简单的小程序来代替这项单一、重复性的工作。

◎Step 11:执行菜单Layout>Batch Script (布局批处理脚本)命令,打开Batch Script(批处理脚本)窗口(也可以使用快捷键F 10直接调取该对话框)。

RealFlow教程:如何利用脚本创建realwave网格

◎Step12在脚本编辑器中输入以下脚本,如图14-70所示,按下键盘上的Ctrl+Enter组合键执行,这样即可生成融合的序列Mesh。

pm = scene getMesh( "ParticleMesh_ STO1" )

rw = scene.getRealwave()

for i in range(20):

      rw.setParameter(“Particle layer”,False)

      rw.setParameter(“Particle layer”,True)

      pm.build()

      f= scene.getCurrentF rame()

      scene. setCurrentFrame(f+1)

RealFlow教程:如何利用脚本创建realwave网格

解读:

pm = scene getMesh(“ParticleMesh_ STO1” ):获取Mesh节点名称并命名为pm。

rw = scene getRealwave():获取Realwave节 点并命名为rw。

for i in range(20):将该句以下的内容(即本句以下含有缩进的语句)循环计算20遍。

rw.setParameter(“ Particle layer”,False): 在rw (即Realwave )的属性中将Particle layer项设置为No (关闭该项)。

rw.setParameter(“Particle layer”,True): 再在rw的属性中将Particle layer项设置为Yes (开启该项)。

pm.build():在pm ( 即Mesh节点)中生成当前帧的Mesh。

f= scene getCurrentFrame():在场景中获取当前帧并命名为f。

scene.setC urrentFrame(f+1):在场景中设置当前帧为f(即当前帧) +1,即获取下一帧。

这个脚本中所使用的语句,在之前的脚本案例中已经多次涉及,相信读者朋友们也都不陌生了,需要简单说明的有以下几点。

01.rw = scene getRealwave():按常规逻辑,括号中需要输入当前使用的Realwave的名称,但为何括号内却空空如也?这是因为在同一个RealFlow场景中,只允许存在一个Realwave, 这个唯-性决定了获取Realwave时不需要再指定名称了。

如果在场景中已有一个Realwave的情况下,再次创建-个新的Realwave,则系统会弹出对话框,提示只能有一个Realwave存在于当前场景中。

RealFlow教程:如何利用脚本创建realwave网格

02.for i in range(20)::句中的“20” 是指循环计算20帧,用户可根据实际需要的帧数来定义该值;如果需要计算1000帧,在括号中输入1000即可。

03.scene setC urrentFrame(f+1) :该句是循环语句的结尾,既指定了下一帧的操作,又与for i inrange(20):首尾呼应,循环语句将对两句之间的所有操作反复执行。

注意:在执行本案例中的脚本时,会从当前时间滑块所处的位置向后进行解算,并不会自动从第0帧开始。所以如果需要从第0帧开始解算,需要在执行脚本之前,将时间滑块手动移至第0帧。