对于所有静态每粒子属性,Maya 均保持一个名称以 0 结尾的对应属性。例如,静态属性位置、速度和加速度具有对应的 position0、velocity0 和 acceleration0。
以 0 结尾的属性名称保存属性的初始状态值。当为初始状态使用保存粒子对象的当前属性值时,Maya 会为初始状态属性指定这些值。
若要为初始状态使用保存粒子对象的属性值,请从“动力学”(Dynamics)菜单集中使用其中的任一命令:
将为选定的“粒子形状”(particle shape)节点或刚体保存所有每粒子属性值。
将为场景中的所有动力学对象(换句话说,即所有“粒子形状”(particle shape)节点和刚体)保存所有每粒子属性值。
当通过在“属性编辑器”(Attribute Editor)的“添加动态属性”(Add Dynamic Attributes)区域单击其中一个按钮来动态添加每粒子属性时,,Maya 还会添加一个名称以 0 结束的对应的初始状态属性。例如,如果在“属性编辑器”(Attribute Editor)中单击“不透明度”(Opacity)按钮并添加每粒子不透明度属性,Maya 还会添加 opacityPP0。
尽管初始状态属性未显示在“表达式编辑器”(Expression Editor)中,但可以读取其值(例如使用打印语句)来检索初始状态。
在使用“添加属性”(Add Attribute)窗口向“粒子形状”(particle shape)中添加自定义“每粒子(数组)”(per particle (array))属性时,必须选择在添加时是否启用“添加初始状态属性”(Add Initial State Attribute)。如果选择启用,Maya 将为添加的属性创建相应的初始状态属性。
如果选择禁用,Maya 不会为添加的属性创建相应的初始状态属性。如果没有该相应属性,则无法为初始状态使用保存粒子对象的当前属性值。如果您决定在回放动画时初始化自定义属性的值,则必须编写创建表达式。
每粒子属性在“添加属性”(Add Attribute)窗口中称为数组属性。这两个词的含义相同。详细信息请参见指定给自定义属性。
使用 Maya listAttr 命令可以确定添加自定义属性时是否启用了“添加初始状态属性”(Add Initial State Attribute)。(详细信息请参见 MEL 命令参考。)
您可能要读取表达式中的初始状态属性的值,例如将其原始(回放)值用于某些计算。如果您为初始状态属性指定一个值,并为初始状态使用保存该属性值,Maya 会覆盖该值。
在向“粒子形状”(particle shape)中添加自定义属性时,请不要以字符 0 结束名称。您将推翻 Maya 用于与属性关联的初始状态属性的命名方案。
对于任何属性,如果不使用创建表达式初始化其值或为初始状态使用保存其值,Maya 将在动画的第一帧处为该属性提供默认值。它通常为属性指定值 0 或 <<0,0,0>>,取决于数据类型。在其他情况下(例如,opacityPP 和不透明度),Maya 将为该属性指定默认值 1。
如果您知道要为自定义属性编写创建表达式,则可在添加该属性时将“添加初始状态属性”(Add Initial State Attribute)设定为禁用。否则,请在添加自定义属性时将“添加初始状态属性”(Add Initial State Attribute)设定为启用。
当创建表达式为属性指定值时,对于年龄为 0 的所有粒子,该值会覆盖属性的初始状态值。
假设您使用“粒子工具”(Particle tool)围绕棋盘格锥创建少量红色粒子。该粒子对象命名为“Squares”。它显示在点较大的“点”(Points)渲染类型中,使粒子看上去像不透明的大方块。
下列步骤显示如何为 opacityPP 指定值,以使每个粒子具有不同的随机不透明度。
该操作将向“方形”(Squares)的“粒子形状”(particle shape)节点添加一个“opacityPP”属性。可以设定“opacityPP”的值,以为每个粒子提供不同的不透明度。
SquaresShape.opacityPP = rand(1); print("Hello\n");
由于“opacityPP”是每粒子属性并且在“表达式编辑器”(Expression Editor)中选择了对象的“粒子形状”(particle shape)节点,因此,该表达式会对对象中的每个粒子执行一次两个语句的执行循环。
由于表达式为创建表达式,因此它在编译后执行。它还会在播放动画后回放时执行。
对于每个粒子,第一个语句为“opacityPP”属性指定一个介于 0 和 1 之间的随机浮点数。随机函数每次执行时会返回不同的随机数,所以每个粒子具有介于 0 和 1 之间的不同“opacityPP”值。因此,每个粒子在生成时都具有不同的不透明度。有关随机函数的详细信息,请参见有用的函数。第二个语句在“脚本编辑器”(Script Editor)中显示 Hello,对每个粒子显示一次。
在播放动画时,创建表达式不执行。因此,粒子会保留在回放时接收的不透明度。
每次播放然后回放动画时,每个粒子都会接收随机的新不透明度。每次回放时,创建表达式都会执行随机函数。
如果要使用前面的表达式作为运行时表达式而非创建表达式,则每个粒子的不透明度会在动画播放时更改每个帧。在每一帧,运行时表达式将执行,为每个粒子的“opacityPP”指定介于 0 和 1 之间的不同随机值。
假设您使用“粒子工具”(Particle tool)创建了名为“Squares”的新粒子对象,该对象与前一示例开头介绍的对象相似。以下步骤显示如何为“方形”(Squares)中的所有粒子给定单个不透明度,该值可在五秒的动画时间内从透明变为不透明。
SquaresShape.opacity = linstep(0,5,age);
运行时表达式在播放期间会执行每个帧。该表达式中的语句对于每个粒子执行一次,并根据 linstep 函数为不透明度属性指定介于 0 和 1 之间的一个相同值(详细信息请参见 linstep)。在对象存在的前 5 秒,该值会从 0 逐渐增加到 1。