以下主题介绍了表达式流控制语句中常见错误的解决方案。
在测试条件下修改变量值
如果在表达式中使用 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. ");
else
print("This doesn't equal 0. ");
表达式将显示以下文本:
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. "); else print("This doesn't equal 0. ");
表达式将显示以下文本:
This equals 0.
检查 $x 是否介于 -0.0001 和 0.0001 之间,以确保执行适当的打印语句。cosd (90) 返回的值与 0 非常接近,因此位于 if 语句的数值比较中指定的较小数值范围内。
,