水面结冰可以说是我们日常生活中较为常见的一种形态,特别是在冬天的北方。而大家会制作冰块,可是结冰的这一个动作要怎么做呢?相信许多小伙伴也是非常的疑惑,那么今天我们就通过realflow的脚本运算,来制作结冰粒子形态的变化吧!
要知道,结冰效果的实现是通过粒子形态的变化而产生的,所以脚本也必然在粒子解算的过程中逐帧运行,而在Batch Script (批处理脚本)编辑器中写入的脚本只能运行一次, 对于该案例便不再适合,需要使用表达式编辑器,执行菜单Layout>Simulation Event (布局>模拟事件)命令,打开Simulation Events (解算事件)对话框。
01.如何检查输入的语法格式是否正确:在Simulation Events (解算事件)对话框中,执行菜单Script>Check Syntax (脚本>检查语法)命令,弹出对话框提示“Syntax is OK (语法正确)”,表示语法正确;弹出对话框提示“Syntax error at line# (第#行语法错误)”则表示语法错误 。
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 (解算事件)对话框。
◎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 自带了一个空物体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
解读
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的脚本来制作结冰效果可以说是非常简单且方便的了,也希望大家在今天的基础上,学会用脚本制作出更多有意思的效果吧!
热门课程
专业讲师指导 快速摆脱技能困惑相关文章
多种教程 总有一个适合自己专业问题咨询
你担心的问题,火星帮你解答你有没有想过游戏设计师和游戏程序员的区别是什么?因为有时他们被称为游戏工程师或软件工程师,而且你经常听到开发者、程序员、工程师......
创作《环太平洋》里的机甲特别复杂。这个过程得靠SGI的精细设计,还得小心地跟实景拍摄的画面融合在一起
你要相信,任何行业或领域,都是有一套学习方法的。找对方法,事半功倍。 今天就给大家分享以下平时做短视频时用得比较多的剪辑干货。
《英雄联盟》官宣新赛季打法:火了这么多年,这款游戏咋做出来的?
今天下午,夏尔天逸公司来火星举办专场人才招聘会,招聘游戏原画、3D模型、角色动画、游戏特效等岗位。该公司目前在职游戏制作人已经......
在短视频大火、越来越多人投身自媒体后,剪辑这项技能,也逐渐变得像开车和做饭一样,成为当代打工人的必备日常技能之一。
023年以来,在版号审批、出海政策等影响下,新品游戏大量涌现,这也为游戏市场带来了一些新变量、新现象。