首页 百科知识 用表达式修改粒子属性值

用表达式修改粒子属性值

时间:2022-10-16 百科知识 版权反馈
【摘要】:所以很容易得出这样的结论:Creation expression是为粒子的属性进行初始化操作的;Runtime expression则是真正在时间上对粒子进行控制的表达式。整个表达式编辑器非常容易理解,在Selection栏目里面,左边是选中的例子物体,右边是粒子的可编辑属性名称,在下面SelectionObj&Att后面就是你所选中的粒子属性的表达式写法。表示颜色)格式表示的。回车并不意味着一句表达式的结束,只是换了行而已。分析前面的表达式:第二句是给变量$pos赋值,第三句是给粒子属性particleShape1.

第四节 用表达式修改粒子属性值

这一节,我们将学习怎样为粒子的每个属性进行赋值或者叫修改。本节内容相当非常重要,请读者尽量详细阅读本节的内容。

在了解了粒子的几个通用属性以后,我们就可以开始着手为这些属性进行赋值工作了。首先要知道在哪里进行赋值,给物体的某个属性进行修改或赋值很简单,只要直接在通道盒(channelbox)里面用输入的就可以了。那么在粒子的PerParticleAttributes属性面板里面,每个属性的后面都不是文本框,不能直接输入。为什么呢?原因很简单,这里的属性是每个粒子的,也就是说这里的属性可以针对场景里每一个粒子进行不同的设置,所以怎么可以用简单的输入一个数值就可以做到的呢。

要针对每一个粒子进行不同的设置,有两种办法,其中最常用的就是表达式(Expression)。

下面我们为粒子属性创建表达式:在属性后面的条文框里面鼠标右键单击,在弹出菜单里面关于expression有三个选择:Creation expression;Runtime expression before dynamics;Runtime expression after dynamics;

img61

其中第一项(Creationexpression)意味着这里的表达式只是在粒子产生的那一刻执行一次,以后就不再执行了(注意:这里的执行一次实际上是场景里有多少个粒子就进行多少次的运算,也可以说是执行“粒子数量次”);

第二项(Runtime expression before dynamics)和第三项(Runtime expression after dynamics)意味着这里面的表达式在时间轴的每一帧都会执行“粒子数量次”的表达式,所不同的是执行的顺序是在动力学解析之前和之后。

所以很容易得出这样的结论:Creation expression是为粒子的属性进行初始化操作的;Runtime expression则是真正在时间上对粒子进行控制的表达式。

我们先选择Creation expression进入粒子表达式编辑器,就会发现,其实三个表达式编辑器都是在一起的,通过三个单选框进行切换就可以了。

img62

整个表达式编辑器非常容易理解,在Selection栏目里面,左边是选中的例子物体,右边是粒子的可编辑属性名称,在下面SelectionObj&Att后面就是你所选中的粒子属性的表达式写法。要为他赋值就很简单了,把它拷贝下来,在最下面的文本编辑栏里面进粘贴然后用等号进行赋值运算就可以了。

比如你选择的是particleShape1粒子的Position属性,那么在下面的文本编辑框里面的输入就会是“particleShape1.position= …;”这意味着把等号右面的东西赋值给等号右面的属性或者叫变量里面去,那么右面写什么呢?怎么写呢?

在前一节我们已经了解了属性的值的格式,position这个属性是矢量的,所以在这里可以写成particleShape1.position=<<5,0,0>>;意思是在粒子产生的一刻粒子的位置是在x坐标为5,y坐标为0,z坐标为0的空间位置上面的。

如果你制造一个粒子发射器(不会创建?选择Particle菜单Create Emitter),选择粒子,创建这个表达式particleShape1.position=<<5,0,0>>;(注意是Creationexpression表达式),单击create,播放场景,可以看到粒子并不是从发射器发出来的,而是从距离发射器5的X轴上发射出来的。

img63

(注意:写了表达式的属性后面会有Expression …的文字说明。)

如果写在Runtimeexpression表达式里面,播放后你会发现粒子全部挤在一个点上,这个点的位置是<<5,0,0>>。为什么?自己想一下?

如果你想到了,请往下看,如果你没有想明白,就请会过头再看一下前面的知识,因为这很重要。

刚才的表达式是particleShape1.position=<<5,0,0>>;,因为Position属性是矢量的,矢量的值就是以<<X,Y,Z>>或者<<R,G,B>>(还记得么?表示颜色)格式表示的。

语句的最后还有一个;号,为什么?我只能说这是语法,表达式是写给电脑看的。就好像英语有语法,汉语也有语法一样,如果语法不正确,就无法表达你想表达的意思;或者听众会听不懂你在说什么。所以如果expression的语法错了,电脑就不能理解你要表达的意思,直接表现就是报错。在commandline里面会有红色的提示语以warn开始的。(注意:如果表达式没有错误,那么创建了以后表达式编辑器的create按钮就会变成edit,要删除一个表达式需要用delete按钮,或者删除一句话再使用edit按钮)。

表达式(expression)和MEL都有自己的语法,不过还好他们的语法和C++基本一致,所以非常容易学。

img64

如果你有过编程经验,那么可以匆匆阅读下面的内容,如果没有就请你不要太快了,因为可能会比较难以理解一点:下面就说一下表达式的语法。

还是以刚才的表达式为例:particleShape1.position=<<5,0,0>>;

首先,语句的最后有一个;号意味着一句话的结束,每一句表达式的后面必须有一个;号。回车并不意味着一句表达式的结束,只是换了行而已。

其次,等号右面是<<X,Y,Z>>格式,意味着等号右面的变量是矢量的(vector),那么怎样理解变量呢?这个表达式可以被写成这样:

vector $pos;//声明一个矢量变量$pos

$pos=<<5,0,0>>;//为$pos赋值<<5,0,0>>

particleShape1.position=$pos;//将$pos赋值给particleShape1.position

你可以用这个表达式替换掉前面的表达式,编辑一下(点edit按钮)看看是不是有不一样,结果是一样的。

那么这个表达式就是一个标准的工业表达式了,它几乎包括了所有的语法特点在里面了,对于语法我们只能死记硬背了:

第一句vector$pos;意思是声明了一个矢量变量,变量名是$pos。那么这个变量里的数据就都是矢量类型的,也就是<<X,Y,Z>>格式的。注意:这里的变量名$pos,第一个字符是$号,这是maya语法的一个特点,那就是任何可一个自定义的变量都必须以$开头,如果没有$那么就会认为是一个属性。

那么除了矢量,maya还有浮点数float;整数int;还有布尔量bool;

img65

在这里特别指出“布尔量”数据类型,它的值表示“是”或“非”,也就是说不是对就是错,0或1,true或false。物体的属性visibility就是布尔量的类型,你可以试着在属性值里面输入0或1,或者是true或false,默认的是on或off。

定义一个变量的语法是“戴帽子”,也就是在一个变量名前面写上变量类型的描述就可以了,例如:

float $a;//定义一个浮点数变量$a

int $b;//定义一个整数类型的变量$b

定义了一个变量有什么用呢?定义了一个变量以后我们就可以为它赋值了,赋值操作就是表达式最基本的功能。

分析前面的表达式:第二句是给变量$pos赋值,第三句是给粒子属性particleShape1.position赋值,在这里我们通过变量$pos来给粒子属性particleShape1.position赋值,有个好处就是只要我们改变第二句$pos的值那么particleShape1.position的值也相应的改变了。也就是说我们通过变量$pos来传递一个矢量的数值给particleShape1的position属性。

那么到现在你应该知道声明变量和利用变量传递数值的概念了。为了能够将这一抽象的概念,形象的表现出来,我们可以通过ScripEditor了解表达式每一步的结果:

通过windows→Generaleditor→ScripEditor可以打开该窗口:

使用窗口里菜单Edit→Clearhistory将乱七八糟的东西清理干净。然后就可以在下面的文本框里输入我们的表达式了:

img66

之前你做的每一步操作,在这里都会有一条条的命令结果出现。这一条条的命令行就是你做的操作传达给电脑的命令,换句话说你可以将里面的命令拷贝,然后再粘贴到命令行里(下面的空白文本编辑框)里,然后按下小键盘的回车,那么这些命令所代表的操作就会在窗口里重现。

使用窗口里菜单Edit→Clearhistory将乱七八糟的东西清理干净。然后就可以在下面的文本框里输入我们的表达式了:

img67

输入vector$pos;小键盘的回车文本框里的文字消失,上面的显示区里出现了刚才的表达式,说明变量声明成功。

img68

输入$pos=<<5,0,0>>;小键盘的回车文本框里的表达式消失,上面的显示区多了两行:

img69

第一行是我们输入的表达式,第二行就是这句表达式结果。

接下来我们可以对这个变量进行操作:$pos=$pos+<<5,5,5>>;结果是:

img70

(注意:如果你只是输入$pos+<<5,5,5>>会有错误,因为计算必须有赋值操作)

这句表达式的结果,充分说明了矢量是怎么进行加法的。你自己可以试一下乘法,除法的结果。

接下来我们边做实验边学习float,int,vector三种变量之间的关系::

在文本编辑框里面输入:float $float;

img71

这很简单,声明了三个变量,分别是$float、$int、$vector,即浮点、整数和矢量。接下来边做边看边学:

第一步操作:$float=3.1415;//为浮点数$float赋值3.1415。结果是:

img72

这个我们都可以预料到。

接下来的操作是:

$int=$float;//将浮点数赋值给整数类型的变量

这个结果会是什么?浮点数是有小数点的,而整数是没有的,这样的操作会是什么结果呢:

img73

本来是3.1415,现在变成了3,意味着整数类型的变量只接受整数类型的值,如果强行赋值一个浮点数,那么就会损失小数点后面的所有数据。也就是说$int里面的数值是3。

再接下来我们使用这个操作:

$vector=$float;//将浮点数据赋值给矢量变量

这意味着什么呢?看结果:

img74

结果是矢量$vecto的三个方向的值都被变成了3.1415。强行赋值的结果就是这样的了。

再接下来我们使用更夸张的操作:

$float=$vector;//将矢量值赋值给浮点类型的变量

这个结果是:

img75

这是什么意思?这个值是什么?这个值就是矢量$vector的长度,也就是离世界坐标轴中心距离。用这种方式很容易就能够得到物体之间的距离了。

再来一个操作:

$vector=<<1,2,3>>;//给矢量$vector赋值<<1,2,3>>

$float=$vector.x;//将矢量的x代表的值给浮点变量$float

这是什么意思?意味着什么?看看结果:

img76

可以知道$vector.x就是1。那么$vector.y就是2,$vector.z是3了,这是又一个很重要的知识点,我们可以通过类似$vector.x的方式将矢量的某一个分量拿出来,有什么用?我们可以通过拿出position的y分量,来得到粒子的高度进行判断看是不是要它消失或者爆炸等等。

好了,简单的赋值就讲到这里,前面都是为一个变量赋一个值,这个值都是我们自己创造的,下面我们就是用一些函数来返回一些有规律的值进行赋值运算:

提到函数,在表达式编辑器里面有maya所有的函数名称,在编辑器的菜单InsertFunction里面,我们常用的函数只有以下这几个:

time,返回当前时间;

frame,返回当前帧数;

rand($int),返回一个小于括号里面整数的随机数;

sin($float),cos(),tg(),ctg(),三角函数这就不用多说了;

下面我们就用我们就用这些函数为particleShape1.position进行赋值来学习一个这些函数都能带来什么:

新建一个场景,创建一个粒子反射器(是用默认设置)。

首先是time:我们为粒子的position创建Runtime表达式:

vector $pos;//定义变量$pos

$pos=<<0,time,0>>;//将time函数赋值给$pos的y分量

particleShape1.position=$pos;//将$pos赋于particleShape1.position

img77

播放运行的结果是:粒子挤作一对然后匀速沿着Y轴向上移动:

img78

也可以说是随着时间的增加,position的y分量在不断增加,这是因为position的y分量是time,那么time是什么很明白了,time就是时间。

接下来是frame:把上面的表达式里的time换成frame,我们发现粒子上升的速度明显加快了,当前是第几帧,粒子就上升多少的单位。所以frame就是返回了当前的帧数。

到此为止,粒子都是挤作一团的,因为我们把每一个粒子的位置属性都设置成一样的,所以每个粒子都是在同一个位置的。下面就让他们分开,就是为每一个粒子设置不同的位置了。

Rand($int),随机数:我们再把上面的表达式第二行改成:

$pos=<<0,rand(5),0>>;

我们看到粒子在Y轴上面高度为5的范围内,成一条直线的随机移动:

img79

这是因为rand(5)在每一次运行都会产生一个不同的小于5的数字,所以每一帧电脑运算这个表达式的时候就会为每个粒子赋值一个不同的Y轴向的值。

想一下要想产生一面5×5面积的粒子墙应该怎么做?

img80

对了,把第二句改成$pos=<<Rand(s),Rand(s),0>>;

粒子在X轴方向和Y轴方向上面的位置都是随机的,而且每一帧都在发生变化,所以就产生了这种情况。

最后是三角函数以sin函数为例子:将表达式第二行改成$pos=<<0,sin(time),0>>;

time是时间,时间不断增大,sin(x)函数随着x的不断增大,返回值是-1到1的循环,不是么?所以粒子的运动就是在Y轴上面来回运动:

img81

这时候将这句表达式改成$pos=<<cos(time),sin(time),0>>怎么样了?为什么?

(高中的知识都忘掉了,快点补习一下)

img82

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈