常见问题

 
 
 

以下主题介绍了表达式流控制语句中常见错误的解决方案。

在测试条件下修改变量值

如果在表达式中使用 while、do 或 for 循环,请记住更改正在该循环的测试条件下测试的变量或属性。否则,Maya 操作可能停止。

示例 1

假设您创建了一个名为 Balloon 的对象,并决定在动画播放三秒后使用 while 循环来增加 Y 轴缩放。

while (time > 3)
	Balloon.scaleY = time;

您可能认为该表达式会将 Balloon 的 scaleY 属性设定为动画播放超过三秒后增加的时间值,但实际上,Maya 操作会在播放时间超过三秒时立即停止。这是由于 while 条件此时为真,因此,while 循环语句 Balloon.scaleY = time 将反复无休止地执行。

即使语句在表达式内设定属性,Maya 也仅在表达式执行完毕后对属性进行更新。由于表达式从不结束执行,因此 Maya 将停止。

除非您在 while 循环内将 Balloon.scaleY 更改为一个小于或等于 3 的值,否则该语句将无限地执行下去。

若要获得所需结果而不停止 Maya,请使用此表达式:

if (time > 3)
	Balloon.scaleY = time;

示例 2

假设您创建两个对象,分别命名为 Cone 和 Ball,然后使用 while 语句将 Ball 的“translateY”属性关联到 Cone 的“translateY”属性:

while (Cone.translateY > 0)
	Ball.translateY = Cone.translateY;

乍一看,只要 Cone 的“translateY”大于 0,该表达式似乎都会将 Ball 的“translateY”位置设定为 Cone 的“translateY”位置值。

实际上,只要您将 Cone 平移到一个大于 0 的 Y 位置,表达式将立即停止 Maya。这是由于 while 条件此时为真,因此,while 循环语句 Ball.translateY = Cone.translateY 将无休止地执行。

您在用户界面执行的任何操作都无法更改 Cone 的“translateY”位置。它始终位于 0“translateY”值处。

除非您在 while 循环内将 Cone.translateY 更改为一个小于或等于 0 的值,否则该语句将无限地执行下去。

若要获得所需结果而不停止 Maya,请使用此表达式:

if (Cone.translateY > 0)
	Ball.translateY = Cone.translateY;

使用 == 将浮点值与 0 进行比较

如果使用 == 运算符将浮点变量或属性与 0 进行比较,表达式可能无法正常工作。当您假设内置函数(如 cosd)返回的值正好为 0 时,通常会发生这种情况。

示例

float $x = cosd(90);
if ($x == 0)
	print("This equals 0.\n");
else
	print("This doesn't equal 0.\n");

表达式将显示以下文本:

This doesn't equal 0.

虽然 90 度余弦的数学值为 0,cosd (90) 函数返回的值为 6.123e-17,已经非常接近于 0,但仍不完全相等。尽管实际使用时该数字与 0 相同,但由于计算机处理浮点数的方式的原因,在计算机中它却存储为大于 0 的小数。

若要解决此问题,请使用此表达式比较值:

float $x = cosd(90);
if (($x > -0.0001) && ($x < 0.0001))
	print("This equals 0.\n");
else
	print("This doesn't equal 0.\n");

表达式将显示以下文本:

This equals 0.

检查 $x 是否介于 -0.0001 和 0.0001 之间,以确保执行适当的打印语句。cosd (90) 返回的值与 0 非常接近,因此位于 if 语句的数值比较中指定的较小数值范围内。