泡沫可以说是在日常生活中非常常见的,也是大家在制作特效的时候经常会做的,因为泡沫的易逝,导致拍摄时难以获取心怡的效果,因此人们才会在特效的领域中,研究泡沫的设计与制作,而小编今天就是要带大家实用脚本来生成液体泡沫。
◎Step 01:在场景中创建一个杯子(杯子可以用之前案例中的杯子模型,也可以创建一个新的)、一个Plane (平面)、一个Gravity (重力场)、一个Circle (圆环)发射器。
◎Step 02:进行解算,使粒子倒入杯中。
◎Step 03:设置Circle (圆环)发射器的Scale (尺寸)为0.5、 Resolution (分辨率)为2、Speed (速度)为4、V random ( V向随机)为1,并再添加一个Container (容器)发射器。
想象一下,在真实的生活中,水中的泡沫是如何产生的?例如啤酒或是加入了洗衣粉的水,平静的时候通常是不会产生泡沫的,但是当你向一个容器内倾倒的时候,泡沫就产生了。所以从某种意义上说,泡沫是由于碰撞而产生的,水与容器发生碰撞时,紧贴容器壁的水的压强会在瞬间达到一个极值,我们就可以利用这个瞬间的压强作为泡沫产生的条件,利用表达式控制泡沫产生的数量。
打开Simulation Events (解算事件)对话框,写入:
def onSimulationStep():
par-Circle01.getParticles()
for p in par:
pr-p.getPressure()
if pr> 50000:
for i in range(5):
Container0l.addParticle(p.position,p.velocity)
Circle01.removeParticle(p.id)
pass
解读:
01.par=Circle01.getParticles():获取Circle (圆环)发射器的粒子,并命名为"par”。
02.for p in par:用字母p来循环par。
03.pr=p.getPressure():计算每一个粒子的压力, 命名为pr。
04.if pr> 50000:如果pr (某个粒子的压力)大于50000。
05 .or i in range(5):对其子语句进行循环运算,也就是重复运算5次,这是为了使每-颗水粒子在死亡的时候都能够生成5颗泡沫粒子,这样泡沫才会更加丰富。
06.Container01.addParticle(p.position,p.velocity): 添加Container (容器)粒子,
也就是重复运算5次,这是为了使每-颗水粒子在死亡的时候都能够生成5颗泡沫粒
子,这样泡沫才会更加丰富。
06 Container01 .addParticle(p.position,p.velocity):添加Container (容器)粒子,即泡沫粒子,同时继承Circle(圆环)粒子的位置和速度。
07 Circle01 removeParticle(p,id):移除(即消灭) Circle (圆环)粒子。
◎Step 04:调整两套粒子的颜色,以便观察。
◎Step 05:下面调整Container (容器)的参数,使泡沫粒子更加真实。提高Surface Tension (曲面张力)的值可以使泡沫粒子聚集成球状;Viscosity(黏稠)值可以用来控制泡沫的拉伸效果;适当调低泡沫粒子的Int/Ext Pressure (内压/外压)可以使泡沫粒子之间间距更小,使粒子聚集得更紧密;适当减小Density(密度)值,可以减小粒子的密度,使其向水面漂浮。
可以根据自己的场景来不断尝试进行属性设置,直到达到合适的效果。
在现实生活中,泡沫在生成之后会很快逐渐消退,这一效果该如何实现呢?事实上泡沫是水的一部分,只是在经过碰撞之后含有杂质或碳酸的一部分水,被水中含有的气体膨胀起来,形成很多气泡(这就是我们在前面制作时让一个水粒子消失之后生成3个泡沫粒子的原因) ,然而在气泡破裂之后,包裹气泡的水膜又会重新融入到水中。喝过啤酒的人都会发现,即便倒啤酒时用力很猛,倒了满满一杯子的泡沫,等待一段时间后,泡沫逐渐消失,而水体也慢慢上涨,也许会填满杯子的1/3, 甚至更多。
下面就来继续编写脚本,将泡沫重归于水,打开Simulation Events (解算事件)对话框,写入:
def onSimulationStep():
import random
par = Circle01.getParticles()
for p in par
pr= p.getPressure()
if pr> 70000:
for i in range(3):
Container01.addParticle(p.position, p.velocity)
Circle01.removeParticle(p.id)
foam = Container0l.getParticles()
for f in foam:
fp = f.pressure
fage = fage
if fage > random.uniform(0.5,1):
iffp < 40000:
if(fid%3==0 ):
Circle01.addParticle(f.position, f.velocity)
Container01 removeParticle( f.id)
pass
解读:
01.foam = Container01.getParticles():获取泡沫粒子,将其命名为“foam”
02.for fin foam:用字母f来循环计算每- -个泡沫粒子。
03.fp= fpressure:获取泡沫粒子的压强,这里省略了get。
04.fage=fage:获取泡沫粒子的年龄,同样省略了get。这两句中获取的压强和年龄都是为后面的i语句做准备的。
05.if fage > random.uniform(0.5,1):如果泡沫粒子的年龄大于15~ 30帧。在前面讲过,random函数在Python中是不能直接使用的,需要先导入,所以才有了最开始的那句import random。random函数 在Python中的写法是random. uniform(),Age的单位是秒,所以0.5秒就是15帧,1秒就是30帧。
06.if fp< 40000:如果fp (即泡沫粒子的压强)小于40000。
07.if(fid%3==0):如果f.id (即所有的泡沫粒子的id)除以3等于0时,方能执行后面的命令。学过Maya中Mel的朋友对除以的概念一定不陌生, 这其实只是一种过滤,对符合条件的内容再进行一次过滤后再执行,今天我们就是在符合条件的粒子中,只选取1/3来执行。简单来说,除余几,就只执行几分之一。而%3= 0是一种固定格式。本句在本案例中,可以看做是for i in range(3):这句的逆运算,但两句的原理毫无相似之处。
08.Circle01.addParticle(f.position, f.velocity):每消灭3颗泡沫粒子时,添加一颗水粒子,并继承泡沫粒子的位置和速度。
09.Container01.removeParticle(fid):移除(即消灭)泡沫粒子。
◎Step 06:设置好后,进行解算,解算-段时间后,将主体粒子的Speed (速度)设置为0,使其不再发射,然后继续解算,使粒子发射完毕。
◎Step 07:观察发现,此时部分黄色泡沫粒子会被压在杯子下方无法快速浮上水面继而消失,这里可以将泡沫粒子的Density (密度)值降低,也可以为其添加一个重力场,将其Strength (强度)值设置为一30,将Bounded (边界框)设置为Box (立方体),并将其移动到合适的位置。
◎Step 08:继续进行解算,观察效果,如果觉得不合适,还可以继续根据自己的场景进行设置,直到达到合适的效果。
用脚本来创建液体泡沫是不是直接比大家建模更简单呢?大家也可以通过这个方法尝试去建立一些别的素材哟。
热门课程
专业讲师指导 快速摆脱技能困惑相关文章
多种教程 总有一个适合自己专业问题咨询
你担心的问题,火星帮你解答023年以来,在版号审批、出海政策等影响下,新品游戏大量涌现,这也为游戏市场带来了一些新变量、新现象。
学习游戏开发班可以帮助游戏爱好者从零基础成为游戏开发专家,掌握全面的游戏开发技能。
火星时代教育为您提供专业的界面设计实战班,在实践中掌握界面设计的核心技巧和最新趋势,成为优秀的UI设计师。
了解UI交互设计培训的最佳选择,比较不同培训机构的优势和特点。
火星时代教育为您推荐专业的学影视后期培训机构,提供高质量的培训内容及资深导师指导,助您成为优秀的影视后期剪辑师或合成师。
火星时代教育是一家专注于交互设计培训的机构,为学员提供专业的交互设计培训课程,并帮助他们成为优秀的交互设计师。
1. 打开微信扫一扫,扫描左侧二维码
2. 添加老师微信,马上领取免费课程资源
同学您好!