"move," "rotate," "scale," 和 "in coordsys"
现在让我们再认识四个MAXScript所用的动词。对于前三个move、rotate 和scale ,都是我们已经非常熟悉的了(移动、旋转、缩放),我们只需稍微解释它们的用法就可以;而对于Coordsys我想你也可以猜个大概了(坐标系)。
对于 move 命令,我们要在赋予它的XYZ坐标值,这个坐标值需要三个数值,它们之间用逗号分隔,外面加上方括号(MAXScript把这种类型的数值叫做point3),如:
move $Box01 [10,0,0]
这一行的意思是将Box01沿X轴向移动10个单位。注意这是一个相对位移。如果要移动到指定的绝对坐标,则实际上是在修改该物体的位置属性 position ,按照前面谈到修改属性的方法:
$Box01.position = [10,0,0]
这样就将这个Box放在世界坐标的10,0,0位置上了。
下面说说rotate——旋转。旋转的数值要显得稍微复杂一点点,因为它要我们再顺便多学一个单词。为了避免使用极度恐怖的传统真3D旋转数学算法,MAXScript为我们准备了eulerAngles旋转值输入法;即X旋转和Y旋转再加上个Z旋转……和名称类似的那个 Euler XYZ旋转控制器一样,这种旋转算法存在某些灵活性和精确方面的问题,但它在易用性上的长处使它值得使用。
rotate $Box01 (eulerAngles 90 90 0)
以上脚本表示将物体沿X和Y轴各旋转90度。(注意这里也是相对旋转)
接下来就可以谈谈缩放了。scale像move一样需要赋予的是一个point3数值,需要注意的是100%的缩放值是用1来表示的,因此假如做一个50%的均匀缩放,则脚本如下:
scale $Box01 [.5,.5,.5]
(其中的.5就是0.5,在大多数电脑数字输入中,如果小数点前为0都可以省略,直接写点接小数)
现在物体的各种运动方式的做法我们都知道了,默认情况下它们都使用世界坐标系。如果想要使用局部坐标、上层物体坐标等其他坐标系统,就需要在我们的运动命令前面冠以 in coordSys 某坐标系,例如将前面第一个移动物体的例子改为:
in coordSys local move $Box01 [10,0,0]
这样就是把Box01在局部坐标Local上移动了10个单位了。
用"for"循环实现自动化
是我们了解 MAXScript中最重要的自动化工具的时候了——"for"循环,用法格式如下:
for 某些变量 in 被操作物体清单 do 要做的事情
换句话说,在被操作物体清单 所列出的每个物体上进行一项操作(或者是一系列的操作流程。要做的事情 可以是许多命令的结合)。这就是我们开头提到的“自动化操作任务”的实际用法。
for i in selection do (i.wirecolor = color 0 128 0)
在这个例子中,某些变量 被命名为i(变量名是随意的,只不过在循环计数中使用i是电脑程序编写的习惯而已),而被操作物体清单 在这里使用了关键字selection,你大概已经猜到它的意思是"当前所选物体集合",而所谓要做的事情 是设置物体的属性为一个指定数值,在这里所做的是把物体的“网格色”(即默认无材质状态下的显示颜色)设置为绿色,如果把它翻译成简体中文就是这个样子:
for (每个物体) in (选择集) do (设置网格色为绿色)
这样看起来就很简单明了了吧?
需要了解的是,在上述循环里的每一次操作中,i 都是替操作对象物体“占位”用的,当循环进行中自动操作到每一个物体时,i 就把位置让给该物体名称 ,相当于用$或者$物体名 来替换。
上面的例子中使用了selection 来指定操作目标,而实际应用中有许多其他的情况,包括MAXScript预置关键字(objects, geometry, lights, cameras, helpers, shapes, systems, sceneMaterials, meditMaterials, 和spacewarps),带通配符的名称如($Box*),数字以及专门定义的物体列表称为arrays(梢后介绍)。现在我们有了for 这一利器,就可以开始真正进行自动化任务了:
for i in $*Omni* do (i.multiplier = i.multiplier*0.5)
上面的脚本会将名称中带有Omni字样的所有灯光亮度减半。
for i in selection do i.material = $Box01.material
这一行则是将所选择的所有物体赋予和Box01相同的材质
我们也可以在do 的后面将多个命令放在一起使用,只要在它们外面加上括号,命令之间用分号隔开就可以了:
for i in geometry do (i.motionblur = #image; i.motionBlurOn = ture)
这相当与将场景中全部的几何体打开运动模糊并将其模式设置为image方式。
提示:在使用MAXScript的 Macro Recorder即宏记录功能所得到的脚本中,它用来指代当前所选的物体的是$,常见的一种错误会出现于此,因为$ 是代表当前所选的单个物体,可是当选择多个物体时就应当使用selection 关键字,因此我们有必要把所有值得重复使用的脚本里面的$ 给清理掉。通常使用的方法就是把这段来自宏记录的脚本命令放到一个 for i in selection 循环中去(也就是do 之后的括号里),并且用i 来替换其中的所有 $ 。(这个注释提到的问题只有在使用宏记录遇到错误时才容易理解,现在可以不用深究,但它是i 的典型应用)