学习笔记MAX_SCRIPT_01

学习笔记 MAX_SCRIPT_01

关于max script的脚本编辑一直想系统的学习一下,在网络上找到zihahage 的学习笔记,非常感谢,学习并记录了自己的学习历程

首先需要掌握的一些词汇:

  • $
  • show
  • move
  • rotate(eulerAngles x y z)
  • scale
  • in coordsys
  • for
  • where
  • classOf
  • random
  • #() 和 []
  • at time

$

$ 的意思表示我们当前所选择的物体

修改一个圆的大小:$.radius = 6;

修改圆的相对大小:$.radius += 6; // 用 += , -= , *= 和 /= 来表示在当前值之上进行加减乘除

可以控制物件名的相关属性

修改一个名字为“Sphere01”圆的大小:$Sphere01.radius = 6;

注意:如果物体名称中存在空格,要在名称两端加上单引号,例如 $'my box'

show

显示物体下面的属性名称

show $  //查看当前物体的属性名称

.height : float  //冒号左边的单词是属性名,冒号右边的词指出该属性所需的数值类型

常用数值类型的名称含义

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 $.material

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

实战应用举例:

$Box01.height = $Box02.height  // 将Box01的高度设置为与Box02相同

$Box01.height = $Box01.length = $Box01.width = 10 //把Box01设置为边长为10的正方体

$Sphere01.radius = $Box01.height/2 //将Sphere01的半径设置为Box01高度的一半

$Box*.height = 10 //把场景中所有名称以Box开头的物体的高度值设置为10

$Omni*.multiplier /= 2 //把名称以Omni开头的所有灯光的亮度设置为原来的一半

$Box*.material = $Sphere01.material //把Sphere01的材质赋予所有名称以Box开头的物体

注意:

$Spot*.on = false //把名称以Spot开头的灯光关闭(这个例子的脚本不会正常运行,原因稍后详细解释,这里只是为了使你了解MAXScript可以自动操作这类任务)

move, rotate,scale,in coordsys

移动
move $Box01 [10,0,0]   // 将Box01沿X轴向移动10个单位。注意这是一个相对位移。
$Box01.position = [10,0,0]  //Box放在世界坐标的10,0,0位置上
旋转
rotate $Box01 (eulerAngles 90 90 0) //将物体沿X和Y轴各旋转90度。(注意这里也是相对旋转)
缩放
scale $Box01 [.5,.5,.5]  //需要注意的是100%的缩放值是用1来表示的,因此假如做一个50%的均匀缩放
坐标系
现在物体的各种运动方式的做法我们都知道了,默认情况下它们都使用世界坐标系。如果想要使用局部坐标、上层物体坐标等其他坐标系统,就需要在我们的运动命令前面冠以 in coordSys 某坐标系,例如将前面第一个移动物体的例子改为:
in coordSys local move $Box01 [10,0,0]  //这样就是把Box01在局部坐标Local上移动了10个单位了

where 

在一个for循环中,where 为我们提供了一个过滤开关,它可以在循环运行中的每一次操作之前对物体属性是否“合格”进行判断。如果判断为“是”,则进行指定的操作,否则就将该对象忽略掉。

for i in selection where (false) do 

for i in selection where (true) do 

实战举例

for i in $Box* where (i.height > 10) do i.height = 10

//找出名称以Box开头并且高度大于10的所有物体,将其高度设置为10

for i in $Box* where ((i.height > 9) and (i.height < 11)) do i.height = 10

//找出名称以Box开头并且高度在9和11之间的物体,将它们的高度设置为10

for i in geometry where (i.material == undefined) do i.isHidden = false
//将所有未赋予材质的几何体取消隐藏状态
for i in shapes where (i.baseobject.renderable == ture) do i.name = "RS_" + i.name
//将所有可渲染样条曲线的名称前加上“RS_”前缀(以便于按名称选择)

classOf

类别名

classOf $Box01 // MAXScript返回值:Box

与show的最大不同在于它是可以用于表达式中做真假判断运算的:classOf $Box01 == Box
实战举例
for i in geometry where (classOf i == Box) do i.height *=2 //将所有Box类别的物体高度翻倍,无论它们的名字叫什么。
注意:如果,我们的box被加上了一个修改器,比如Bend弯曲,那么:classOf $Box01 返回值就成了 Editable_mesh而不是Box了。因为默认情况下所查询到的是物体当前的状态,而不是它的原始类别(除非我们将修改器关闭)。如果需要忽略修改结果查询物体的原始类别,这样做:classOf $Box01.baseobject 此时(相当于查询物体所具有的baseobject属性)MAXScript就会着眼于修改堆栈的最底端的物体状态返回所需的值了。
posted @ 2014-05-15 09:50  childtime  阅读(265)  评论(0编辑  收藏  举报