飞浪脚本零起点入门系列(五)
MAXScript的数组,循环语句和重命名脚本写法
著作:飞浪制作:【WEWE】
声明:本教程为CG++原创,未经本人允许,禁止一切形式的转载,谢谢合作:)
查看上一节:MAXScript对物体的初步控制
飞浪脚本零起点入门系列(五)MAXScript的数组,循环语句和重命名脚本写法本节关键词:Array Values数组for loop selection objects uniquename
Array Values数组Array Values在线手册
数组,即有序数据的集合。这个数据可以是任何数据类型,甚至表达式。
语法:#(<value>,<value>,...)
#()--空数组
例子:#(1,2,"cgplusplus",5+6,123as float)--注意,括号,引号等字符要在英文半角状态下输入。
那么,我们用数组就可以把一些相干或者不相干的数据都统一起来,放到一起,这样操作起来非常方便。比如说刚才那个数组,你可以一个一个的赋值:a=1,b=2,c="cgplusplus"...,然后调用。如果用数组,可以很方便:数组引用<array>[<integer>],其中<array>就是数组,<integer>就是序号。数组调用的序号用中括号[]括起来。比如如果想调用第5个的值是这样:
#(1,2,"cgplusplus",5+6,123as float)[5]。这样还是很麻烦啊,先赋值再调用,就简单多了。
a=#(1,2,"cgplusplus",5+6,123as float)
a[1]就是第一个值,a[2]就是第二个值,依次类推。但是序号不能超出数组数据的最大数目,如a[6]就是错误引用,返回错误代码。其他相关操作讲解:<array>.count:Integer--数组元素的个数,只能读取。Integer表明执行此命令返回整数。如a.count返回5,说明这个数组一共有5个元素。
<array>[<integer>]=<value>--修改某元素的值。如:a[1]= 100,再看一下数组a变成了#(100,2,"cgplusplus",11,123.0)即第一个值发生了改变。
<collection>as array--把集合转变成数组。如:b=lights as array即把场景所有灯光存储为数组并赋值给b。
append<array><value>--向数组里面增加元素,如:append a "cg++"即向数组a里面增加元素"cg++",
得到新数组,增加的新元素排在数组最后面,这样数组a变成了:#(100,2,"cgplusplus",11,123.0, "cg++"),a.count也返回了6。字符串转数组在线工具
deleteItem<array><number>--删除数组某个元素。如:deleteitem a4即把数组a的第4个元素删除,数组序号自动往前移动一位。这时我们得到:
#(100,2,"cgplusplus",123.0,"cg++")
findItem<array><value>--寻数组里面是否有某元素。如:finditem a"cgplusplus",如果到了某元素,返回第一次到此元素的序号(因为数组里面的元素是可重复的),如果不到,则返回0。
数组还有其他一些操作语句,这里一次不讲太多,在以后的实例中本人会详细讲解,这里只是想让大家对maxscript数组有个大致了解。
循环语句
for loop for loop在线手册
for循环可以逐个计算一列数值,集合,数组等等,刚刚说的数组正好派上了用场。
语法:for<var_name>(in|=)<sequence>(do|collect)<expr> <var_name>是循环中的每一个单独的变量,<sequence>是循环的源数值,<expr>是表达式,|号左右表示可选项。看实例吧:
例一:for i in1to10do print i--输出1到10
print输出函数,后面接所有类型数值,如:print selection[1].name--输出选择的第一个物体的名字刚才那句执行的顺序是:首先赋值i=1,然后执行print i就输出1,再i进行自加,变成了2,又执行print i输出2...一直到i=10输出10才算完。这样就进行了循环。而且是每隔1个数值输出一个值,下面来扩展:
例二:for i in1to10by2do print i--每隔两个数来输出i,于是我们就得到了奇数1,3,5,7,9。by就是控制每隔多少数值再执行do后面的表达式。默认不用by,则都是每隔1个数值执行一下。
下面来看这句程序:
例三:for i in selection do i.name+="new"
selection即所有选择的物体,相当于美元符号“$”,但是用法有时候不同。unt即选择物体数量,selection[i]即选择中的第i个物体,selection类似于一个数组。上面那句的意思是,把所有选择物体的名字后面加一个"new",你再看看你选择的物体名称。上面那句还可写成:for i in$do i.name+="new"在程序中建议尽量使用selection,因为如果你没有选择物体,那么这句就出错。
这两句是直接访问数组元素,从第一个开始,而不像前面的for i in1to10。。。还要数元素序号。这一句就跟平常简单的英文会话一样,可以翻译成:如果i(变量)在selection(选择物体)里面,那么就do(做)什么什么。
例四:for i in lights =false这句意思是说,把场景所有灯光关掉,i.on是开,i.off是关,跟日常开关一样。有人也许会问,你怎么知道所有灯光是用lights表示呢?MAX工具栏上有个过滤器,想必大家都用过,里面有
All,Geometry,Shapes,Lights,Cameras,Helpers等,比如你想改所有for i in 就是对所有摄像机操作了。但是All在脚本里并不是所有物体。再回来看例四,你打个有目标点的灯光试试,再用那句就会出错了,因为lights把灯光目标点也算在内,而目标点是没有开关的啊,那怎么办呢?这就要把它过滤掉。再来看,
例五:for i in lights where classof i!=targetobject =false 这里面加了一句where classof i!=targetobject这句相当一个过滤器,当变量i在lights里面逐个执行的时候,先要过这一关,如果classof i!= targetobject返回true就继续执行do后面的语句,如果返回false就直接跳到下一个元素。这里用到了maxscript的比较运算符!=,maxscript比较运算符即把两个数据进行比较,返回true或者false,所有比较运算符有:比较运算在线手册:plusplus/online-reference/maxscript-reference/source/
comparison_expressions.htm 假设a和b是分别要比较的两个数据,下面即把a,b进行比较:
a==b--相等,如果相等就返回true,不相等就返回false,下面道理相同a!=b--不等于
a>b--a大于b
a<b--a小于b
a>=b--a大于或等于b
a<=b--a小于或等于b
例如:1>2返回false,1>=1返回true
这里还用到了类别运算classof,classof是用来判断一个max节点的类别的,用法是直接classof+节点,如果我们不知道一个物体的类别,就直接选择它然后classof$,即判断选择物体的类别,比如上面我本来不知道灯光目标点的类别,于是我选择一个目标点,再运行classof$,就返回了它的类别targetobject,这样,就可以过滤掉所有类别是targetobject的物体,以免出错。
下面来讲一个重命名脚本,我们看到一些脚本里都有重命名功能,其实这个
功能要写出来非常的简单,简单到让人惊讶。上面已经牛刀小试,例三:for i in selection do
i.name+="new"就是一个重命名功能,是在所有选择物体后面加个"new"。真正的重命名脚本如下:
例五:for i in objects do i.name=uniquename"cgplusplus"
这里无非是用到一uniquename,uniquename在线手册:最下面有它的功能。
它的原理跟你创建物体的命名一样,把物体以所给字符串为基础进行命名,后面跟数字序号。比如我执行上面那两句之后,再看场景中的物体名字分别变成了cgplusplus01,
objects--即场景所有物体,unt即场景所有物体数量。objects[i]即场景中的第i个物体。objects也类似一个数组。
再把上面那句改一下:
例六:
newName="cgplusplus"
for i in objects do i.name=newName+"_"+i.name
这里就是将所有物体objects的名称加个前缀“cgplusplus_”,这个下划线"_"并没有先赋值,这里是想说,newName+"_"+i.name这一句可以是任意的字符串,可以用加号进行调整。上面是先把名称"cgplusplus"赋给变量newName再调用它,建议大家以后也这样做先赋值再调用,因为这样程序修改起来非常方便。
下面进行扩展:
例七:for i in cameras do i.name=uniquename"MyCamera"--把场景摄像机名字改成MyCamera01,
例八:for b in$box*do b.name=uniquename"MyBox"--把场景所有名称以“box”开头的物体重命名,$box就是名称为box的物体,后面加一个通配符“*”就表示任意字符,$box*就是指名称以“box”开头的物体。注意变量b前后要一致,小心都写成了i。
例九:for vl in lights where classof vl==VRayLight do vl.subdivs

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。