加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MaxScript学习③

(2011-06-14 00:00:00)
标签:

杂谈

分类: 计算机图形
“Show” 命令

  我们怎样才能知道一个物体所具有的属性名称呢?从上面的例子可以看出不同的物体具有的属性名称可能远远超出了我们的记忆能力,这就是show命令的用武之地了。show可以在MAXScript Listener中显示一个物体的属性名称列表。例如选择一个box之后输入 show $,就可以看到Listener返回了这样的信息:

 .height : float
 .length : float
 .lengthsegs : integer
 .width : float
 .widthsegs : integer
 .mapCoords : boolean
 .heightsegs : integer
false

  冒号左边的单词是属性名,冒号右边的词指出该属性所需的数值类型(末尾的那个false是MAXScript在打嗝,我们就当没听见好了)。如果我们试图为某个属性赋予一个错误类型的值,比如 $Sphere01.radius = true,那MAXScript就会抱怨出一行的红字的错误信息。

  提示:常用数值类型的名称含义

integer:整数

float:浮点数(即允许带小数)

string:字符串,数值外要带有双括号,例如 "hello world"

boolean:真\假 值,也用来表示打开和关闭,可以使用 true,false,on,off

point2:二维坐标,两个数字之间用逗号分隔,外加方括号,例如 [10,20]

point3:三维坐标,三个数字之间用逗号分割,外加方括号,例如 [10,22,133]

color:颜色RGB数值,在圆括号以 color开头,加三组数值分别表示RGB值,以空格分隔,例如纯白色为 (color 255 255 255)

  必须指出的是并非物体的全部属性都会按show的命令显示出来,事实上为了使“搜索结果”清晰明了,所有物体以及特定类型的物体所共有的属性如 name, material,和renderable等等,都不会在这里显示出来。同时,物体被附加的修改器、材质等等的属性也不会显示。如果需要一份绝对完整详尽的属性列表,可以去MAXScript参考手册中的"General Node Properties"章节(埋藏很深,最好使用帮助系统的“索引”功能)此外还有Properties, Methods, Operators, and Literals 条目记载着关于物体类型的信息(瞧见了吧,我前面说离不开参考手册可不是开玩笑的).

  当一个物体的属性中还有次级属性的时候,我们也可以通过show命令来查看次级属性的清单.例如要查看一个box的材质,就可以输入 show $Box01.material ,如果要进一步查看它的凹凸贴图属性列表,根据上个命令所返回的属性列表可以找到凹凸贴图的属性名为bumpMap,因此输入 $Box01.material.bumpmap ,以此类推。
 
“双词模式”进行工作

  让我们看看现在我们都可以做些什么了,每次只需使用 MAXScript中的两个词,就能做到许多以前做不到的事:

在场景中寻找并修改任意物体的任意属性,即使它被隐藏、冻结或者深藏在群组之中。
迅速设置任何物体的任何参数,包括使用表达式将一个物体的设置复制到另一个物体上。
通过在物体名中使用通配符( * 和 ? ),一次性设置一堆物体的某种属性。
  两个词的作用就不错,是吧?现在根据你所掌握的词汇,看看能否分辨出下列单行脚本的作用:

$Box01.height = $Box02.height

$Box01.height = $Box01.length = $Box01.width = 10

$Sphere01.radius = $Box01.height/2

$Box*.height = 10

$Box*.isHidden = false

$Omni*.multiplier /= 2

$Box*.material = $Sphere01.material

$Spot*.on = false

  用简体中文翻译过来是这样的:

将Box01的高度设置为与Box02相同

把Box01设置为边长为10的正方体

将Sphere01的半径设置为Box01高度的一半(换句话说,让它们一样高)

把场景中所有名称以Box开头的物体的高度值设置为10

取消所有名称以Box开头的物体的隐藏状态

把名称以Omni开头的所有灯光的亮度设置为原来的一半

把Sphere01的材质赋予所有名称以Box开头的物体

把名称以Spot开头的灯光关闭(这个例子的脚本不会正常运行,原因稍后详细解释,这里只是为了使你了解MAXScript可以自动操作这类任务)
"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 的典型应用)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有