×

如何利用RealFlow的脚本功能制作结冰效果

发布时间:2019-08-02 15:30:57

水面结冰可以说是我们日常生活中较为常见的一种形态,特别是在冬天的北方。而大家会制作冰块,可是结冰的这一个动作要怎么做呢?相信许多小伙伴也是非常的疑惑,那么今天我们就通过realflow的脚本运算,来制作结冰粒子形态的变化吧!

要知道,结冰效果的实现是通过粒子形态的变化而产生的,所以脚本也必然在粒子解算的过程中逐帧运行,而在Batch Script (批处理脚本)编辑器中写入的脚本只能运行一次, 对于该案例便不再适合,需要使用表达式编辑器,执行菜单Layout>Simulation Event (布局>模拟事件)命令,打开Simulation Events (解算事件)对话框。

如何利用RealFlow的脚本功能制作结冰效果

01.如何检查输入的语法格式是否正确:在Simulation Events (解算事件)对话框中,执行菜单Script>Check Syntax (脚本>检查语法)命令,弹出对话框提示“Syntax is OK (语法正确)”,表示语法正确;弹出对话框提示“Syntax error at line# (第#行语法错误)”则表示语法错误 。

如何利用RealFlow的脚本功能制作结冰效果

02.Active (激活) :位于Simulation Events (解算事件)对话框的右下角,勾选时表示编辑的表达式将应用于场景中,不勾选时表示不执行任何表达式。

03.#后面的是注释内容不参与运算。

04.Fuction:函数。

05.def(定义) :定义函数类似mel中的global proc。

06.onSimulationBegin():函数,在解算开始执行,类似Maya的创建表达式。

07.pass (通过) :置于表达式的末尾,表示该表达式的内容已经完成,运行将到此为止。Simulation Events (解算事件)编辑框中包含了几大模块,每个模块的内容几乎相同,唯有onSimulation后面的内容有区别,onSimulationBegin( )的用法前面介绍过,onSimulationStep()表示每个步幅执行一次,步幅的概念在前面的章节中已经介绍过,这里不再赘述。onSimulationFrame()表示每帧执行一次,onSimulationEnd()表示解算完成后执行一次, OnChange ToFrame( )表示针对-部分帧的解算内容来执行。

今天,我们将使用onSimulationStep( )这个模块来进行表达式的编辑,原理是根据粒子的存活时间,对其进行冻结。

◎Step 01:首先创建一个Circle (圆环)发射器、一个Plane (平面)、一个Gravity (重力场),打开

Simulation Events (解算事件)对话框。

如何利用RealFlow的脚本功能制作结冰效果

◎Step 02:在运行里写入:

def onSimulationStep():

    par=scene. getEmitter("Circle01")

    p=par.getFirstParticle()

    while p:

        page-p.getAge()

        if page> I:

        p.freeze()

        p=p.getNextParticle()

    pass

解读:

01.par-scene.getEmitter(“Circle01” ): 获取Circle01发射器 并将其命名为par,注意退格。

02.p-par.getFirstParticle():获取par的第一个粒子, 取名为p。

03.whilep::循环语句,对于统计粒子的循环,-般使用while语句, p是在上一句中自定义的名称,注意循环语句以冒号结尾。

04.page-p.getAge():获取第1个粒子的年龄,并把这种获取方式起名为page。注意,这一句已经在循环语句下了,也就是说它计算的不仅仅是第l颗粒子,而是会循环计算每一颗粒子。该句是运用在循环中的,所以需要在while p:的基础上再退一格。

05.if page>l: 如果自定义的page也就是粒子,其年龄大于1时,这一-句是条件设定,满足条件时,才会执行该句下面的命令,条件语句也需要以冒号结尾。

06.p.freeze():冻结p,就是冻结所有的粒子,满足if page> I:条件的粒子才会执行这-步。p.freeze()作为受条件限制的语句,同样需要在if page>1:的基础上退一格。

07.p=p.getNextParticle():在p中查询下一颗粒子,并赋予新的p。这句是循环语句的结尾,循环表达式每执行完一次,就会从这里返回至循环语句的开始whilep:,再进行下一颗粒子的运算,直至所有的粒子被计算完成;所有需要参与循环计算的语句都必须处于以上两句中间,不需要循环计算的语句也尽量不要置于这两句中间,由于p=p.getNextParticle():这句是循环语句的末尾,是针对开头的,因此无论中间穿插多少句,需退格的语句有多麻烦,只要记住该句只是在while p:的基础上退一格就不会出错。

08.pass:在def onSimulationStep(的基础上退-格即可。

完成效果如图所示。

如何利用RealFlow的脚本功能制作结冰效果

下面来了解如何使粒子沿位置方向进行冻结。

分析:沿位置方向进行冻结需要为其设置参照物,通过与参照物的位置对比,满足条件者进行冻结。仍然使用上一个案例的场景,只是在本例中需要为表达式的运算再创建一个参照物,RealFlow 自带了一个空物体Null,可以作为本例的参照物,为Null设置-段沿z轴的位移动画。注意位移的方向轴,表达式要以此为依据。打开Simulation Events (解算事件)对话框,写入:

def onSimulationStep():

import random

n=scene. getObject(“Null01” )

nz=n.getParameter(“Position.z" )

em=scene.getEmitter(“Circle01” )

prt-em.getFirstParticle()

while prt:

pos= prt.getPosition()

pz-pos.z

if pz+random.uniform(0,1)<nz: 

prt.freeze()

prt= prt.getNextParticle( )

pass

如何利用RealFlow的脚本功能制作结冰效果

解读

01.n=scenen.getObjcet(“Null01” ):在场景中获取Null物体,并将获取过程命名为n。

02.nz=n.getParameter(“Position.z" ): 在n中获取其z轴的位移参数,将这个过程命名为nz。

03.em=scene. getEmitter(Circle01):在场景中获取Circle,将获取过程命名为em。

04.prt=em.getFirstParticle():获取em的第1个粒子,将获取过程命名为prt。

05.while prt:循环计算prt。

06.pos=prt.getPositionO):获取每一颗粒 子的位移参数,将获取过程命名为pos。

07.pz-pos.z:获取pos的z轴位移参数,将获取过程命名为pz。

08.if pz<nz:如果pz<nz, 即Circle中每一 颗粒 子z轴的位移参数小于Null z轴的位移参数。

09.prt.freeze():冻结Circle的粒 子。

10.prt-prt.getNextParticle:循环计算下一颗粒子。

11.import random及random.uniform(0,1):按照前面10个步骤的写法,即可实现粒子跟物体比较后被冻结的效果,但是粒子冻结时的形态非常呆板,会出现很明显的线性冻结现象。为了使粒子在冻结时更随机,需要使用random函数。但是在Python中random函数并不是默认的,直接使用系统不能识别,需要调入,所以写入import random。因为是粒子的随机,所以将random.uniform(0,1加至粒子z轴位移的参数中。

完成效果如图所示。

如何利用RealFlow的脚本功能制作结冰效果

其实利用realflow的脚本来制作结冰效果可以说是非常简单且方便的了,也希望大家在今天的基础上,学会用脚本制作出更多有意思的效果吧!

室内生长动画制作方法

室内生长动画制作方法

返回列表>
关于我们
关于我们