APP下载

Mel语言及其表达式在MAYA动力学特效中的应用研究

2022-08-19谢函邑

电子测试 2022年15期
关键词:发射器表达式语句

谢函邑

(中国船舶第七一三研究所,河南郑州,450000)

0 引言

三维动画现如今已经得到各行各业的广泛运用,从传统的电影特效、电视片头、游戏等,到如今的教育教学、军事、医疗、飞行模拟等各个方面。Maya 作为动画学界、业界的必备软件,集中了最先进的动画及数字效果技术,成为电影级别的高端制作软件代表。作为一个功能很强大的三维动画软件,不仅为创作者提供了基本的属性控制,还提供了高级控制方式—Mel语言(Maya Embedded Language)及表达式,使创作者可以通过Mel语言及表达式进行Maya的基础操作,如通过执行一段Mel脚本创建一个球体模型,也可以完成更为复杂的效果,如通过表达式控制群体动画中个体之间的运动差异,还可以完成一系列基础操作的快捷批量处理如通过Mel语言编写骨骼绑定插件。

1 MAYA动力学中的MEL语言及其表达式

动力学是理论力学的分支学科,研究作用于物体的力与物体运动的关系。Maya中的动力学系统在Dynamics模块中,该系统主要由粒子、流体、刚体、柔体、毛发、布料等模块构成。在三维动画制作的流程中,动力学需要与动画、灯光、渲染合成等部门紧密的配合(见图1),综合运用这些模块才能制作出逼真的动画效果。粒子作为动力学特效的最小单位,其显示、动画处理、渲染都与常规的物体有所不同。粒子的出生是通过“发射”来实现的,所以粒子的动画制作离不开粒子发射器的建立。粒子发射器通常用于创建将在粒子系统内运动的粒子。Maya中可以将无数的粒子组合起来使其形成固定的形态,再通过控制粒子颜色、数量、空间分布、运动状态等属性模拟现实中的一些自然现象或宏大的场景,如龙卷风、下雪、爆炸、烟花、群组动画等。这些逼真的效果往往需要大量的粒子组成,通过改变粒子在时间与空间上的属性形成。因此每个粒子都可以被赋予如质量、位置、速度、受力、生命周期、颜色、形状、空间大小等的各种属性。

图1 三维动画制作流程图

很多常用的三维软件都提供了内嵌脚本语言,可以通过各种算法来实现复杂的动画效果。Mel语言,就是Maya的嵌入式语言,是Maya使用最方便和控制最灵活的编程接口。在场景中选择一个物体或显示一个对话框就是执行Mel命令的直接结果。表达式,即使用Mel语句将属性动画化的程序。通常通过创建一系列的关键帧,可以将任何属性在Maya中做动画。表达式也可用于将一个属性做动画,但不是通过关键帧,而是通过Mel命令定义属性的值实现。这些Mel命令在每一帧进行求值,然后将结果存储在表达式所分配到的属性中。这种技术通常称为过程式动画,即由程序(Mel命令)而不是由关键帧来控制动画。表达式可用于创建复杂的动画,而不涉及或很少涉及手动操作。这是一种将属性动画化的强大方法。通常情况下,任何属性都可由语句进行控制。简单来说,Mel与表达式的区别就是Mel是一种语言,基于这种语言,可以完成一件事情,而表达式是使用Mel语句编写的将属性动画化的脚本程序,是根据时间的变化做一系列事情。因此,Mel语言及表达式作为一种高级粒子控制方式,对于关键帧很难做到的工作,可以轻松完成,通过编写程序,可以实现想要的效果。例如通过一个模型在三维空间中形成一个矩阵,传统的复制效率低,速度慢。通过粒子形成矩阵,模型替换粒子的方法效率更高,速度更快。而这里所说的粒子替代是以实体模型来替换粒子,适合做大规模的群体动画,比如人群、鸟群、鱼群等。被粒子替代的物体(即原始物体)称为源物体,可以替换多种元素来实现不同的效果,它可以是一个单一的物体(有动画或没有动画的都可以),也可以是不同位置和外形的一系列物体,例如一群几乎相同的鸟在不同的位置拍动翅膀。以下案例就是通过Mel语言及其表达式控制粒子替代,创造随机性,来模拟乱箭齐发的真实景象。

2 Mel语言及其表达式控制粒子属性案例分析

2.1 创建粒子替代

创建一个体积发射器,在Particles菜单下单击Create Emitter后的属性按钮,设置发射器名称为fx_base_emitter1,发射器类型为Volume,比率为50,体积发射器形状为Cube。将particle1更名为baseParticle1。调整Cube粒子发射器的形状和角度,再将发射器fx_base_emitter1的远离中心调整为10。沿轴调整为100,使baseParticle1快速从体积发射器中向一个方向发射出去。

接下来进行粒子实例替代,选择要作为源物体的arrow再加选baseParticle1,在Particles菜单下选择Instancer(Replacement)命令,使用默认值即可。通过观察可以发现,替代物体arrow的尖头处始终是指向×轴正方向的,那么现在就来调整一下它的尖头处的指向。将替代物体arrow的X轴指向粒子的运动方向。选择baseParticle1打开它的属性编辑性,为每粒子属性添加一个directionPP属性。为directionPP属性写入表达式,directionPP=<<1,0,0>> ;因为只需要用替代物体 arrow 的×轴做为指向轴,所以Y轴和Z轴不做操作,值设置成0即可。打开baseParticle1的Instancer(Gemerty Replacement)卷展栏,设置实例节点为instancer1,AimDirection(指向方向)为粒子的速度方向velocity,指向轴为directionPP,意思是用替代物体arrow的Y轴指向粒子的速度方向。(见图2)

图2 修改粒子替代

2.2 Mel语言及其表达式创建粒子随机性

首先是箭打到墙上(物体上)掉落的随机性。创建一个平面,调整形状放到适当位置做为墙面,重命名为wall(见图3)。选择baseParticle1和wall,执行Make Collide命令,设置Resilience为0,Friction为1。发生碰撞后,箭成整齐的水平方向。这时就需要创建粒子碰撞事件,选择粒子baseParticle1,执行粒子碰撞事件编辑器命令,在这里什么设置也不做,只是要一个什么也没发生的碰撞事件,以碰撞事件为条件判断什么时候箭落下来,什么时候乱箭钉上去。

图3 创建一个Poly的Plane

选择baseParticle1再加选wall,单击Particles菜单下的Goal命令,由于粒子(箭)在碰撞前的飞行过程中是不用Goal到wall上的,所以在这里我们需要使用一个if-else语句来判断goal值,先在Creation下为goalPP创建一个初始值baseParticleShape1.goalPP=0(意思是一开始不受墙壁的吸引);在Runtime before dynamics 下写入:

意思是当碰撞还没产生时(即baseParticle-Shapel.event==0)粒子的goalPP为0,否则当碰撞产生时粒子的goalPP为1。接下来,为其添加新的属性,选择baseParticle1添 加 goalU、goalV、collisionU、collisionV四 个 属性到每粒子属性中。为goalU、goalV添加表达式,用collisionU、collisionV碰撞一瞬间的UV坐标来指定粒子的goalU、goalV,在Runtime before dynamics 下写入:

baseParticleShapel.goalU = baseParticleShapel.collisionU;

baseParticleShapel.goalV = basePar-ticleShapel.collisionV;

这样粒子(箭)就得到它的goalU和goalV值,baseParticleShapel.goalU = baseParticleShapel.collisionU; 和 baseParticleShapel.goalV =baseParticleShape1.collisionV;应该写在碰撞之后的语句中,在碰撞产生时执行。

其次,解决箭打到墙的角度的随机性。为baseParticle1添加自定义的每粒子属性aimD,用它作为一个粒子速度/速度方向的变量。为AimD写入表达式,将粒子还没有产生碰撞时的速度/速度方向传递给Aim D,在Runtime before dynamics下写入表达式(见图4)将baseParticleShape1.aimD= baseParticleShape1.velocity;写入没有产生碰撞时的语句中,也就是在没有碰撞之前目标方向为粒子的速度方向,再将AimDirection重新设置成aimD。

图4 添加表达式

现在乱箭钉到墙上后,还在继续旋转,这是因为没有指定旋转是在碰撞前还是在碰撞后,那么将语句最上方的自定义箭旋转的表达式放入到还没有碰撞时的语句中,让它在没有产生碰撞时执行(见图5)

图5 改变表达式位置

最后需要让某些箭打到墙上后掉落下去,未必非要指定必须哪个箭掉落,随机便可,使用随机还可以控制掉落的多少。为baseParticle1添加自定义的float型的每粒子属性falIPP。为fallPP创建表达式,在Creation下写入:base ParticleShapel.fallPP=rand(0,1);之后会用这个随机值做为一个判断下落的条件。在Runtime before dynamics下写入表达式(见图6)。这里的意思是, 如果产生碰撞并且fallPP的随机时大于0.1时,箭会钉在墙上,执行之前的操作。否则替代物体箭的速度方向仍然是粒子的速度方向,再由于重力作用下落。再调整碰撞参数,Resilience为0.3,Friction为0。将Friction设置为0可以让乱箭有一种碰撞时抖动的冲力感觉,而调整Resilience是为了使箭弹得更远一些,也是为了表达箭的冲力。

图6 添加表达式

3 结语

对基于动力学和粒子系统模拟自然景象进行了研究,总结出最大实现粒子的可控制性,既不是单纯靠粒子发射器发射粒子,也不单纯用场来干扰粒子,而是粒子系统与Mel表达式结合。通过Maya中的粒子系统和MEL表达式来模拟自然景象,不仅可以自主编程形成小插件直接利用,还可以后续升级迭代,更可以在多个客户端多人同时进行角色或场景的设计。MEL语言高效的通信和协同设计能显著缩短动画作品的开发周期,降低成本,增强动画作品的个性化、开发的互动性及共创性。

猜你喜欢

发射器表达式语句
美海军陆战队队员发射M32型榴弹发射器
灵活选用二次函数表达式
中国LG6型40毫米半自动榴弹发射器
蜘蛛丝发射器
乌克兰推出RGSh30手持式30毫米自动榴弹发射器
寻找勾股数组的历程
基本算法语句
我喜欢
议C语言中循环语句
作文语句实录