max脚本低级教程_第1页
max脚本低级教程_第2页
max脚本低级教程_第3页
max脚本低级教程_第4页
max脚本低级教程_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

入门教程内容结构本教程内容分为五个部份,用几个具体的例子讲解大多数的脚本操作和语法知识。一、MAXScript简介1、说明什么是MAXScript和它有什么功能,能给用户带来什么益处。2、访问脚本,熟悉脚本访问的界面。二、大体操作:创建和修改简单的对象,给对象赋材质,从而引出下面的概念构造器:创建对象的语法称为构造器;途径名;数据类型:它们是数字,字符串,数组。对象和类(层级树);属性和方式;变换;函数和方式的联系;通用属性和动态属性;显示属性的函数;一些经常使用的方式;三、创建和操作具有复杂关系的对象,从而引出下面的概念变量,变量和属性的关系;对象引用:引用另外一个对象的属性值作为自己的值;数组和集合等:数组,数组和变量的关系;运算符和表达式;表达式:求值的规那么。流程操纵:选择和循环,条件选择。制作简单的动画:"attime",动画操纵器。四、换一角度——从大伙儿熟悉的操作流程来学习脚本这是对前面知识的总结,前面是对语法大体概念的学习,此刻是从大伙儿操作流程的角度来学习,一纵一横,让咱们对脚本有个相对全面的了解,理论和实际彼此联系。有了前面的基础才勤学下面的内容。第一步:创建物体一些经常使用物体的创建方式。第二步:选择物体select途径名,变量名引用条件选择用类和集合选择物体组Group:是一个虚拟对象,不是集合。第三步:变换物体变换:postion,move,scale,rotate,变换坐标系和变换中心第四步:修改器第五步:材质和贴图第六步:制作动画五、大体的语法知识此刻来学语法恐怕可不能那么头痛了吧一、MAXScript简介1、MAXScriptMAXScript语言是为了扩展3dsMAX功能而专门设计的一种脚本语言,是面向对象编程语言中的一种。用它创建的场景物体和材质与在3dsMAX界面中创建的场景物体和材质完全对应。能够生成自动关键帧的动画模式,并能够通过层级途径名来访问场景中的物体。有记录在3dsMAX界面中的交互操作进程的能力,在利用界面操作的同时能够利用MAXScript来自由创作。能够实现3DStudioMAX的全数用途,如建模、动画、材质、渲染等。MAXScript能够运用各类数学工具来完成高级复杂的程序设计任务。能够对含有大量对象的集合进行操作。例如在复杂的场景当选择物体,能够把大量物体放置在精准的位置上,例如在山或路边放置一些树木,利用MAXScript操作起来是超级的方便。它也能将一些功能概念为界面元素,例如工具栏按钮、菜单、浮动窗口,程序面板卷帘窗。能够建行批处置操作提高工作效率。例如成立一次能够渲染多个场景文件的脚本程序。能够自概念输入输出工具,能够概念修改器,渲染成效插件等。2、访问脚本、熟悉MAXScript界面:包括MAXScript卷帘窗,脚本监听器窗口,脚本编辑窗口。、MAXScript卷帘窗单击命令面板中的按钮,打开应用程序面板,再单击MAXScript按钮,在应用程序面板显现MAXScript卷帘窗,如图1-1所示。图1-1、脚本监听器窗口脚本监听器又叫脚本跟踪器,单击MAXScript卷帘窗中的OpenListener按钮,也可选择菜单栏中的MAXScript/MAXScriptListener命令,快捷键F11。如图1-2所示。图1-2也可右击用户界面左下方的Mini-Listener(迷你监听器)打开脚本监听器窗口,如图1-3所示。图1-3脚本监听器窗口是一个命令编辑和执行窗口,它由两部份组成,上半部份为宏记录窗口,下半部份为脚本运行结果输出窗口。如图1-4所示。图1-4运行脚本时,脚本监听器窗口会输出脚本的运行结果,运行正确就显示为蓝色,运行错误就显示为红色,希望你的脚本不要显现红色啊。在窗口中能够编写新的脚本语言或对已有的脚本语言进行修改,用户输入的脚本显示为黑色。选择主菜单中的宏记录MacroRecorder/Enable命令,若是现在进行操作,在窗口中淡红色部份将记录所进行的操作,这确实是宏记录,选择菜单栏中的File/Saveas命令能够将记录保留为一个脚本。、脚本编辑窗口单击MAXScript卷帘窗中的NewListener按钮,或选择菜单中的MAXScript/NewScrip命令打开脚本编辑窗口,如图1-5所示。图1-5脚本编辑窗口是一个文本编辑窗口,你能在3dsMAX内部打开、创建或编辑扩展名为"*.ms"、"*.txt"和"*d21"格式的文本文件。调试文件时大键盘中的回车键与在记事本中的用法一样的,用来换行,当鼠标光标出此刻某一行时,敲一下小键盘区的回车键,就能够够执行本行程序。若是选择多行程序,敲下小键盘区的回车键,能够执行选择被选择的程序。如图1-6所示。图1-6按住鼠标左键不放,把选择的一行或多行程序拖到3DSMAX工具栏里,将生成一个宏脚本按钮,单击此按钮,就能够够运行那个宏脚本。在脚本编辑窗口或脚本监听器窗口里挪用0~让()函数,能够打开脚本编辑窗口,语法是:edit"脚本文件名称"。例如打开文件:输入edit"",运行就能够够打开那个脚本文件。二、大体操作:创建和改变对象1、创建简单的对象传奇天地未创建之时,是为无极,及有太极,那么宇宙处于浑沌状态,就象鸡蛋一样盘旋着,在空间上无大无小无内无外,在时刻上追溯到远古时期也无法明白其起源,因此把这种状态称为盘古,后来又不知那个好事者把盘古这种状态变成了一个传奇——“盘古开天地”,结果“盘古”变成了一个宇宙开创人。老子给它起了个玄之又玄的名字——道。盘古一斧头就把这混混沌沌蛋给劈开了,结果太极判为天地,一气分为阴阳,中国就有了太极八卦和阴阳学说。自从盘古开辟天地以后,那么万物具有,轻清者上升为天,重浊者下降为地。在天成象,在地成形,仰观天有日月星辰,俯察地有人鱼鸟兽,花草树木,种类繁多,数量庞大,不可计数。人类为了征服大自然,把握这些事物,就给它们进行了分类,把相同的对象归类到具有相似特点的类当中,类与类之间若是还有相似的地址,那么就把这些归纳到更高层次的类中,例如把植物类和动物类归纳到生物类。面向对象编程中类和对象的概念确实是试图对上面这些比较符合人类熟悉规律的概念进行描述。好吧,此刻就来看看在MAXScript中谁是宇宙万物的制造者——“盘古”。选择菜单中的MAXScript/NewScrip命令打开脚本编辑窗口,若是想调试程序,跟踪程序执行结果,也能够把脚本监听器窗口打开,输入boxlength:100width:100height:2sphereradius:10segments:16按Ctrl+E键或选择脚本编辑窗口菜单中的File/EvaluateAll命令执行程序,还能够用鼠标全数选定,敲小键盘上的回车键执行程序(以后都按此方式,再也不说明)。结果创建了一个盒子和一个球体,如图2-1所示。此刻单击工具栏按名字选择对象按钮,在弹出的对话框中会显现那个盒子的名字“Box01”和球体的名字“Sphere01",这是默许的名字。图2-1boxlength:100width:100height:2这一行代码确实是一个box构造器,它创建了一个长度为100、宽度为100、高度为2的box。弄了半天,原先构造器确实是“盘古”啊,伟哉,万物之始!什么是构造器在MAXScript帮忙中常常看到Constructor那个单词,中文意思确实是构造器。可是帮忙中只是说明构造创建对象的语法,但并无专门的内容来讲明构造器那个概念。我把它归纳如下:在MAXScript中创建对象的语法就叫作构造器,其实质确实是挪用函数来创建对象,因此能够把它看做是一个函数挪用。也能够说是用一个抽象的类产生一个具体的对象。那个函数的名称确实是基类的名称,所谓基类确实是不能再分的类。咱们创建对象都是从基类开始的。Box确实是个基类,它的上一级确实是几何类,再上一级确实是节点。若是学过JAVA,那么明白创建一个box对象的语法是:BoxBox01=newbox();呵呵,学习MAXScript可舒畅了,只需输入box()就能够够构造一个box了,面且大小写,分号都能够不用注意。当咱们手工单击创建面板中的8。*按钮然后在视窗中完成一个长度为100、宽度为100、高度为2的Box时,在程序内部就挪用了Box()函数,确实是把咱们在界面中的操作转换成了boxlength:100width:100height:2这行内部代码。构造器由两部份组成,基类名和创建参数。整个构造器确实是一个函数挪用,函数名box确实是基类的名字。创建参数由参数名后跟一个冒号:和参数值组成,如图2-2所示。图2-2若是挪用函数没有输入任何参数,那么必需在类名后加上一对英文()括号,例如box(),将创建缺省参数的盒子。明白构造器原理后就明白怎么创建其它的对象了,例如创建球体,输入sphereradius:10就能够够了。注:由于对象和类、层级关系等详细概念的内容比较复杂,将另立一文讲述。请看>>2、改变对象创建了盒子和球体对象以后,咱们想明白适才的长度、宽度等参数是不是正确,应该如何办呢那就要访问对象的属性。诸如长度、宽度、名字、线框颜色半径等等对象所具有的特性通通称为对象的属性(Properties工访问对象属性的语法是由对象的途径名(PathName)后跟小数点.和属性名组成,途径名由美元符号$后跟对象在场景中的名称组成,$表示当前场景。例如访问box01的长度,输入$,在脚本跟踪器窗口中返回访问Sphere01的半径输入$返回。改变Sphere01的线框颜色,输入$=blue或输入:$=(color00255)都一样。那么要改变属性呢只需给这些属性赋值,输入$=20,box01的长度变成20。咱们以前数学里的等号在MAXScript中只能看成赋值符号用了。值的数据类型有几种,此刻简单介绍几个典型的不同数据类型,它们是数字,字符串,数组。数字:MAXScript区分两个数量类型:integers(整型)和floats(浮点型)。整型确实是整数,例如0、1、802。浮点型确实是小数,如期而至、、。当MAXScript执行数字操作时返回和运算参数相同的类型。例如4+5返回9、而+返回。字符串:字符串是一个常量,需用引号标识。输入^印。",MAXScript返回"Hello"。若是输入时没有加引号那么返回undefined未概念。改变SphereOl的名字,输入$="球体01",此刻打开修改器面板,能够看到如图2-3所示的样子。图2-3再把名字改回来,输入:$球体="sphere01"注意双引号不能忘掉输入。数组:数组是一些有序的元素的集合。每一个元素能够是任何类型的值,而且所有的元素都能够单独的访问。一个数组能够有两种表现形式,第一种是:#(),这是一个空数组,数组概念必需用一个数量符号#和一对括号()组成,括号里面是数组的元素名,元素能够为一到多个,多个元素之间用逗号分开,例如,#(1,“hello”,。想要初始化数组中的元素的时候数组有适当的形式,每一个元素的值能够是数值,一个表达式(例如、30*2),或是一个字符串(例如,“hello”),元素的名称是不能有同名,而且元素的数量没有限制。关于数组的具体操作,以后的例子中会涉及,那个地址只作个简单的介绍。输入命令#(100,"hello",pi),MAXScript返回#(100,"hello",。那么咱们怎么能够获取更多的创建参数呢方式有两种:其一是在创建面板中找到对应的创建参数名,创建好的对象也能够在修改器面板中找到创建参数。如图2-4A所示。其二,依照属性来,因为创建参数实质确实是依照对象的属性而定的,没有那个属性就不可能有那个创建参数。显示对象的属性的函数是showProperties(),输入showProperties$box01,结果在脚本监听器窗口中返回以小数点开头属性名称,冒号后面是值的类型,此刻不要管它。如图2-4B所示。三者之间的关系如图2-4所示。图2-4细心的读者会发觉,像name、wirecolor这些属性怎么没有显示出来呢这就涉及到节点的通用属性,能够观看另文撰写的文章“面向对象编程中的对象和类”中的“类的继承”内容,此刻不要管它,随着学习后面的文章,就会明白的。3、变换对象改变位置:想把那个球体放在Box01上面,先看看这两个物体的坐标吧。输入$返回[0,0,0],输入$也返回[0,0,0]。Box01的高度是2,Sphere01的半径是10,要向Z轴移动球体12个单位才能达到目的。输入move$Sphere01[0,0,12],结果球的底部恰好在盒子的上面。伶俐的读者也可能会输入$=[0,0,12],结果也达到了目的。那么move和pos有什么不同呢咱们试着别离把$=[0,0,12]和move$Sphere01[0,0,12]别离持续输入三遍,结果区别就出来了。pos是绝对坐标,move是相对坐标。[0,0,12]是什么它是个三点值,在那个地址,方括号中的三个值别离是X轴、Y轴、Z轴坐标值。缩放尺寸:听说地球以前是圆的,后来人一多就给踩扁了,变成此刻的椭圆形了。此刻看看咱们创建的球是不是也能踩扁它。输入$看看结果,返回了[1,1,1],再输入$=[1,1,],结果Box01沿Z轴方向被压扁了一半重复输入几回,可不能再有转变了。输入$=[1,1,1],恢恢复状,此刻输入scale$Box01=[〃1],它沿XY轴方向缩小了一半,继续输入就更小了。$是绝对的,scale$Box01[,,1]是相对的。输入$=[1,1,1]恢复到原先的状态。数值1表示原始大小即100%,2表示200%,表示50%,其它如此推算。方括号中的三个值别离对应于X轴、Y轴、Z轴。旋转角度:那个盒子比球大,却被球压迫在底下,很不服气,发出$=(eulerangles9000)命令,来了个侧翻身,结果如图2-5所示。图2-5(eulerangles9000)这是欧拉角度值,eulerangles表示欧拉角度,后面三个值别离表示X轴、Y轴、Z轴。上面称动和缩放都有两种操作方式,一种是为属性赋值而变换,另外一种是同意一个动作而变换,那么角度也不例外,输入rotate$Box01(eulerangles9000),结果又把那个盒子给摆平了。也能写成比较好记的方式如rotate$Box0190x_axis旋转X轴90度,rotate$Box0190y_axis旋转Y轴90度,rotate$Box0190z_axis旋转Z轴90度。像上面move、scale、rotate等都是函数(Function,能够完成对象的特定功能,在MAXScript中被称为对象的方式(Methods工函数和方式实质是一样的,属于对象特有的函数都称为方式。凡是通过改变对象属性来变换的都是绝对值,通过对象的方式来变换的都是相对值。4、复制对象那个世界有辛辛苦苦的实干家,那么就有快快活活的投机者。此刻咱们也来个偷懒的做法,嘿嘿,不要以为是仿照啊。输入copy$sphere01pos:[30,30,12]name:"球体2":,结果在盒子的斜角处产生了一个新的名字为"球体2"球体。如图2-6所示。图2-6copy也是对象的方式,它挪用了另外一个函数作为参数,那个函数确实是前面提到的构造器。把被挪用的函数称为位置参数(PositionalArguments),把被挪用的参数称为关键词参数(KeywordArguments)因为位置参数只能放在固定的位置上,因此称为位置参数,关键词参数是成对显现的,写法就像“关键词:值”,和上面提到的创建参数一样,没什么区别。概念是真多,把人给弄晕了,其实弄通了只是是那么回事。关联和引用复制确实是把copy别离替换为instance、reference。5、其它方式:select选择对象、deselect取消选择、delete删除对象、hide隐藏对象,unhide取消隐藏、freeze冻结、unfreeze取消冻结。例如:select$Box01--选择Box01deselect$80*01--取消选择Box01delete$*--删除场景中所有对象6、给予材质自从有了你,世界更漂亮。给盒子铺上几块地砖,输入:$=standardMaterialdiffusemap:(tiles())showInViewport:true结果如图2-7所示图2-7$是Box01的材质属性,材质也是一个对象,因此标准材质的构造器是standardMaterialdiffusemap:(tiles())showInViewport:truestandardMaterial是标准材质类名称,关键词参数diffusemap:(tiles())是材质的diffusemap贴图,其值tiles()是平铺贴图类型,showInViewport:true表示是不是在视窗中显示。其值是true或false,true(真)表示显示,false(假)表示不显示。那个材质并无在材质编辑器24个球中显现,但点击获取材质按钮在场景选项中能够找到它。若是想把材质编辑器插槽中的材质球中的一个赋给Sphere01,输入$=meditmaterials[1]--[1]表示第一个,[2]表示第二个$--设置diffuse的颜色为黄色$--设置高光级别为20结果如图2-8所示图2-8窍门:参数太多不易把握,可选择主菜单中的宏记录MacroRecorder/Enable命令,然后手工在界面中操作,再观看宏记录,现在不由心中窃笑,哈哈,MAXScript你想难倒我,没门!关于材质方面的知识太多,不是一时所能把握的,在此只作过初步了解吧。7、修改对象addmodifier$box01(bend())$=10m$$$像对象的修改器、空间变形等属性,并非对象所固有的,而是后来通过另外的对象附加上去的属性,MAXScript中把它称为动态属性(dynamicproperties)8、概念自己的脚本上面输入的脚本能够保留下来,以备以后再利用。选择脚本编辑器菜单中的File/Save命令,保留到指定的文件夹中,等以后要历时选择File/Open命令能够进行编辑,也能够选择File/Run命令运行脚本。三、创建和操作具有复杂关系的对象常量;变量,变量和属性的关系;运算符和表达式;表达式:求值的规那么,输入的每一行代码都是表达式,因为它老是返回一个值。对象引用:有的书叫双词模式(引用另外一个对象的属性值作为自己的值。);数组和集合等:数组(一个系列的数据组合),数组和变量的关系;流程操纵:选择和循环,条件选择。闻着春天里散发出来的花香味,忍不住去欣赏那些漂亮的花朵,它们被一些长得井然有序的绿叶衬托着;穿太长着杂乱小草的林间小道,惊动了树上正在戏耍的鸟儿,它们飞向两旁看似有序又无序的青松翠竹林中,刹时不见了踪迹;走在马路上,两旁定有一排排梧桐或扬柳,若是你的眼力好的话,发觉树的皮肤上有好多忙忙碌碌的蚂蚁;白天工作了一天,夜晚来到一个幽静的小河边,抬头望着满天繁星,垂头看着水中的倒影,心情好多了,不由思潮起伏。不管是四时花草树木,八方飞鸟走兽,不管是静止着的、运动着的,哪怕是无序的事物,都存在有必然的内在关系。那么究竟是怎么样一个内在关系呢要有具体的内容啊!最简单最多见的是对称关系,例如昆虫的翅膀,羊头上的角;还有直线关系,例如路边两边的树;最没规律的关系是那些运动着的和杂乱无章的事物,例如飞动着的鸟儿,忙碌着的蚂蚁,水中冒出的气泡,就把它们称为随机关系吧;既没有规律又很杂乱的关系是噪音关系,蝴蝶翩翩起舞的轨迹,杂乱的野草的散布状态;最漂亮的关系是那些按必然的曲线而存在的事物,例如波澜起伏的水面,它是正弦波或正弦波的叠加关系,小朋友向天空方向扔出的石块的运动轨迹,确实是一条抛物线;还有起伏不平的崇山峻岭、狐狸摇动着的尾巴,曲折前进的蛇类等等无不存在着某种关系。既然能找出这些事物的内在关系,可否用MAXScript来再现这种关系呢答案确实是一个字:能!1、常量和变量要实现复杂的程序,第一要把握数据的表现方式,在脚本顶用常量和变量来表现。现实生活中有些事物是相对固定的,有些那么是常常转变的。就拿人来讲吧,人的性别是不变的,年龄是每过一年就增加一岁;拿咱们用的电脑硬盘来讲,总容量是不变的,但可用磁盘空间常常是转变的。在MAXScript中,把那些不能改变的量称为常量(LiteralConstants,字面常量,简称常量,能够转变的量称为变量(Variables)例如15,“Hello”等,从字面上一看就明白这些值是不能改变的,因此把常量又叫做字面常量,用age来年龄,而那个age是在转变的,因此age是变量。那么他人问李四的age是多少,去年问的时候李四或许回答是21岁,今年有人问李四,固然确实是回答是22岁了。若是他回答age,那他人就不明白他的年龄了,他必需说出具体的数字出来。age是变量名,22岁是变量值。那么在MAXScript中该怎么表示那确实是给变量赋值,等于号是赋值符号,输入age=22,脚本监听器中返回22,又如李四的银行存款,建行的是20000元,输入money1=20000,工行的是36000,输入money2=36000,请问用money表示李四这两个银行存款的总和,程序代码应该怎么写没学过编程的人或许可能输入money=56000,呵呵,那个也没有什么错,只是输入money=money1+money2,结果如何一分钱也少不了,照样返回56000,程序自己完成了加法计算,减轻了咱们大脑的负担。变量就像一个容器,能够存储不同类型的数据。数量,字符串,数组,对象都能够寄存在变量中。此刻就来详细讲解变量。在程序运行期间,系统会在内存中为程序分派一块内存单元,用来存储各类不同类型的数据。而想访问那个内存单元,就要利用一个标识符来标识它,就像你到单位去找一个人一样,先要告知那个人的名字。那个标识符确实是变量名,内存单元中装载的数据确实是变量值。程序能够通过变量名来读取数据。把数据放到内存中确实是为变量赋值,二是赋值符号。咱们把上面的写在一块,如下:money1=20000money2=36000money=money1+money2当程序运行第一句代码时分派一块内存用money1作为这块内存的变量名然后把2000装入这块内存中作为变量的值,第二句同上,运行到第三句时,分派一块内存,取名为money,程序掏出money1和money2中的数据让它们相力口,把相加的结果56000装入名为money的内存单元中。此刻回忆一下以前是如何改变对象属性的。例如前面提到改变box01的长度,语法是$二20,这和给变量赋值的语法是一样的。从那个地址能够看出,对象的属性实质上也是一个变量,只因为是对象特有的变量,就称为属性了,访问变量直接用变量名,访问属性要在属性名前加上对象名,中间用一个小数点隔开,称为点语法,这确实是变量和属性的关系。既然能够把一个变量分派给另外一个变量,就能够够把一个对象的属性分派给一个变量,也能够把一个变量分派给一个对象的属性,还能够把一个对象的属性分派给另外一个对象的属性,有的人把它称为双词模式。有的人会想,此刻到了这一步,索性来个一不做二不休,把整个对象分派给一个变量,以后访问时加倍方便,这也是许诺的。举例如下:height=50myBox=boxlength:20width:20height:heightzPos=+10mySphere=sphereradius:10pos:[0,0,zPos]结果如图3-1所示图3-1--第二句中height:height是把变量height分派给那个box的height属性,第三句是算出Z轴的坐标,预备分派给后面要产生的球体的Z轴坐标,第四句pos:[0,0,zPos]是把变量zPos的值分派给球体的Z轴。注:鉴于要有必然基础,变量的作用范围(即全局变量和局部变量)和增量放在第五部份了。2、数组和集合数组(array,是一系列有序数据的集合,每一个数据确实是一个元素,它有两种表现形式:(表达式1,表达式2……)()--空数组例如把常量15,,80这几个数据放在一路,就能够够用数组寄存:#(15,,80)把变量放到数组中:x=10y=20z=30(x,y,z)--返回#(10,20,30)把数组分派给一个变量:arr=#(x,y,z)--返回#(10,20,30)访问数组元素:arr[2]--第二个元素,返回20改变数组元素的值:arr[1]=236arr--再次访问数组时,其内部元素的值已经改变了,返回#(236,20,30)选择集(selectionSet)那个对应于手工在场景中命名的选择集,也能够用脚本命名选择集。先创建几个对象,输入:b01=boxpos:[-50,-50,0]b02=boxpos:[50,-50,0]sp01=spherepos:[0,0,0]sp02=spherepos:[50,50,0]sp03=spherepos:[50,50,0]下面的代码创建一个名字为"盒子集"的选择集,它包括有适才创建的两个box:selectionSets["盒子集"]=$box*下面的代码创建一个名字为"球体集"的选择集,它包括有适才创建的两个sphere:selectionSets["球体集"]=$sphere*在工具栏中点击命名选择集按钮,能够看到适才创建的选择集,如图3-2所示。图3-2输入selectionSets["盒子集"][1],访问第一个元素,结果返回:$Box:Box01@[,,]输入moveselectionSets["球体集"][0,20,0],整个“球体集”向Y轴移动了20。集合(collections)在利用MAXScript时有许多值都是一系列的集合,很明显的有数组、通配符途径名选择集,内置对象集。集合不用你特意去指定,它是系统自动完成的。例如咱们此刻用下面的代码创建一些对象:box()boxpos:[60,0,0]boxpos:[-60,0,0]spherepos:[0,70,0]omnilightpos:[0,-100,150]circle()既然是自动完成的,那咱们就直接访问了。访问场景中的对象能够利用途径名,前面讲过用途径名,访问单个对象用美元符号$加上对象的名字就能够够了,但如果是要把适才创建的三个box一路向Y轴移动100,应该如何办呢利用带有通配符的途径名:$box*.=100$box*表示场景中所有以box开头的对象,*表示任意个字符。若是把那三个box和一个球体一路操作呢它们都是内置几何体对象集:selectgeometry--选择所有的几何体=[0,0,0]-把所有的几何体移动到时原点选择所有的对象,下面提供有两种方式:select$*--以途径名的方式选择所有的对象selectobjects--之内置对象集的方式选择所有的对象下面把内置对象集列出,以供参考:对象集(ObjectSet)对象集是描述主场景对象种类的。objects--全数对象geometry--标准的3dsMax分类(categorie)lights--灯光cameras--摄像机helpers--帮忙物体shapes--二维形状systems--系统对象spacewarps--空间扭曲selection--当前选择的对象集合的属性接着上面的内容进行操作。输入selectionSets["盒子集"].center返回"盒子集"中心[0,-50,]输入selectionSets["球体集"].count返回"球体集"总数3输入selectionSets["盒子集"].max返回"盒子集"最大范围[,,25]输入selectionSets["盒子集"].min返回"盒子集"最小范围[,,0]这四个属性适用于对象集(ObjectSet),途径名(PathName\选择集(selectionSet)等集合变量、数组和集合之间的关系从数组、对象集、途径名、选择集等之间的概念能够明白,它们都是寄存的数据,这些数据类型能够是数量,字符串,也能够是对象,这和变量是一样的用途,这么说来,它们的实质是变量的集合,因此把它们统称为集直collections1集合中的每一个元素都是一个变量,因此访问集合中的元素能够像访问数组中的元素一样来访问,关于数组中的每一个元素能够像对待变量一样。输入:Box()Sphere()然后选择它们,再输入:selection[1]监听器窗口中会返回第一个元素的途径名和位置。3、表达式要取得想要的值,就要对数据进行计算,计算规那么不同,其结果也就不一样。例如2和3两个数据,按减法规那么来计算,结果是-1,按加法来计算,结果是5。像这种按某种计算规那么来求值的公式,MAXScript把它称为表达式(expressions,简写为expr),表达式是一种求值的规那么。从语法的角度来看,用操作符把操作对象连接起来的式子称为表达式,有的编程语言也叫语句(statements),意思一样。咱们以前在学校里学的加减乘除四那么运算也能够看做是最简单的表达式了,也确实是说咱们没有编程之前就会利用表达式了。前面提到的常量,变量,数组,构造器,函数和输入的任何一句代码,都是表达式,因为总会返回一个值。MAXScript有大多数编程语言常见的表达式,例如数学表达式(MathExpressions),比较表达式(comparisonexpressions),逻辑表达式(Logicalexpressions),和MAXScript特有的关联表达式(Contextexpressions),后面的教程会涉及。下面是有效的表达式:x=1y=2*3+5printy--输出丫的值到屏幕上上面的代码能够写成一块,这确实是块表达式(block-expression):(x=1y=2*3+5printy)还能够把这三行代码写成一行,用分号;把它们分开:(x=1;y=2*3+5;printy)几个经常使用的表达式比较表达式(ComparisonExpressions)比较表达式老是返回两个布尔值中的一个,true和flase,true(真)表示条件成立,flase(假)表示条件不成立。那个表达式专门有效,很多情形下都会用到,常常和if……then……结合利用。比较表达式在小学数学中就有了,确实是那些大于,等于,小于号连接起来的式子,有一点要注意,那确实是等于号要用两个=表示,一个是表示赋值符号。例如如下:10==10--条件成立,返回true11==10--条件不能成立,返回flase11!=10--条件成立,返回true11>=10--条件成立,返回true11<=10--条件成立,返回truex=8y=36x>y--条件不能成立,返回flase逻辑表达式(LogicalExpressions)逻辑表达式有or、and和not三种,同比较表达式一样返回一个布尔值true和flase之一,它是对照较表达式的进一步组合计算,也确实是说对true和flase的从头组合,取得一个新的布尔值。or(或),只要二者有一个成立,那么整个都成立,例如在中国发觉了外星人或在美国发觉了外星人,只要有谁发觉了一个,那么就说明那个宇宙上还有另外的生命。例如:x=8y=36x==8ory==8--有一个成立,返回trueand(与),二者要同时成立,才能整个成立,不然都不能成立。真是有福共享,有难同当的患难之交啊,一损俱损,一荣俱荣,关系紧密。从中也能够看出些人一辈子道理出来,那确实是两个人合股做事必然要同心合力,任何一个怀有异心,就办不成事。例如:x=8y=36x==8andy==8--有一个成立,另一个不成立,返回flasex==8andy==36--二者同时成立,返回true门。1(非),对立派,老是唱反凋,你要上山,它就要下水,你说是对的,它偏要说是错的。例如:a=13a>10--返回truenota>10--因为a>10是true,因此nota>10返回flase4、流程操纵通过以前的学习,咱们明白利用构造器来创建单个的对象,此刻就来大量创建对象,轻松地完成手工要费专门大的力气才能完成的事。for循环输入:foriin1to4doboxpos:[i*50,0,0]看看下面的flash动画能够形象的明白得for循环。for循环动画if条件x=20y=65ifx>ythenprintxelseprint"x没有y大”--第三句的中文意思是:若是x大于y那么打印x不然打印“没有丫大",结果返回“没有丫大"。继续输入:x=70ifx>ythenprintxelseprint"x没有y大”--结果返回70综合利用fc=freecamerapos:[-100,0,0]rotatefc(EulerAngles900-90)movefc[-100,0,0]foriin1to6dospherepos:[i*30,0,0]segments:16radius:10输入上面代码,生成场景对象备用,结果如图3-3所示。图3-3此刻依照物体离摄影机的距离调整物体的分段数,摄影机在X轴-100位置上,离它最近的一个球体在X轴30的位置上。测量两个对象之间距离的函数是distance,输入:distancefc$sphere01返回,说明摄影机和左侧的第一个球体之间的距离是130。输入:foriin$sphere*doifdistancefci>160then=4距离摄影机大于160的球体分段数精简到4,结果如图3-4所示。图3-4输入:foriin$sphere*do(ifdistancefci>180then=8ifdistancefci>240then=4)注意,代码块要用()包起来,不然程序只执行第一个if语句。这段代码使距离摄影机大于180的球体分段数精简到8,大于240的球体分段数精简到4,结果如图3-5所示。图3-54、动画原理设置两个不同的关键帧就能够够动画了。输入下面的代码创建球体没乂轴的运动的动画:s=Spherepos:[-50,0,0]radius:10animateon(attime0attime100)代码与界面的对应关系如图3-6所示。图3-6四、换一角度——从大伙儿熟悉的操作流程来学习脚本这是对前面知识的总结,前面是对语法大体概念的学习,此刻是从大伙儿操作流程的角度来学习,一纵一横,让咱们对脚本有个相对全面的了解,理论和实际彼此联系。有了前面的基础才勤学下面的内容。第一步:创建物体创建目标摄影机方式见例如栏目中《地面和树-混合材质的用法》一文第二步:选择物体那个地址说的是广义上的选择,即操作指定的对象。以前要改变场景中的对象,第一要选择那个对象。在MAXScript中能够在对象没有被选中的情形下改变对象。这要综合运用前面讲到的途径名,选择集,内置对象集,流程控件等等。遍历选择集先随意创建几个对象,然后选择它们,例如输入:box()box()sphere()cylinder()sphere()结果如图4-1所示。图4-1先用手工把它们全数选择,现在这些被选择的对象被称为选择(selection),这是对象集之一。输入下面的代码进行遍历选择的第一个对象,把它们的名字显示出来:foriinselectiondoprint返回结果如下:"Box02""Cylinder01""Box01""Sphere02""Sphere01"输入,结果返回5,说明选择的总数是5个。输入selection[1],结果返回$8。”8。*02@[,,],说明第一个元素是Box02。这和前面的for循环有什么区别前面的是foriin1to4doboxpos:[i*50,0,0],变量i的范围在1到4,那个地址是对象集合selection,集合已经存在变量的范围了,那个变量i确实是那些对象本身,遍历的次数确实是选择的总数5,当第一次循环时,程序就找到选择集中的第一个元素Box02,相当于$0匕^^”1],其它以此类推。下面的代码进行更复杂的操作,把它们沿X轴距离为40个单位进行分开:foriin1todo结果如图4-2所示。图4-2那个地址的i是数量,selection是元素,是元素的索引,依照i的值指向对应的元素,在那个地址是指向那五个对象之一。依照指定条件选择继续利用上面创建的对象。例如1:依照对象是不是具有某种属性来选择foriingeometrywherehasPropertyi"radius"do=10在创建的几何体中把具有半径属性的物体选择出来,并改变半径大小。结果那两个球体和一个圆柱体的半径变成10。where是表示指定的条件,hasPropertyi"radius"是条件,用来判定对象i是不是具有radius属性,返回true或false。例如2:依照对象是不是符合指定类来选择foriinGeometrywhereclassOfi==boxdo=+[0,30,0]两个box在原先位置向Y轴移动30,结果如图4-3所示。图4-3例如3:依照对象的属性值是不是符合指定值来选择foriinGeometrywhere==0do=+[0,30,0]Y轴坐标为0的对象都向Y轴移动了30,结果如图4-4所示。图4-4第三步:变换物体1、变换方式:postion,move,scale,rotate,前面已经讲过。2、变换坐标系和变换中心变换坐标系统:coordsys关联表达式[in]coordsysworld利用世界空间坐标系统[in]coordsyslocal利用对象自身的坐标系统[in]coordsysparent利用对象的父坐标系统[in]coordsysgrid利用网格坐标系统[in]coordsysscreen利用屏幕坐标系统[in]coordsys<node>利用指定的节点对象坐标系统,相当于在界面中以拾取的对象作为坐标系统变换中心:about关联表达式aboutselection以选择集为变换中心aboutpivot以对象的基准点为变换中心aboutcoordsys以当前利用的坐标系统的原点为变换中心about<node>以拾取的节点对象的基准点为变换中心例如一:大体功先创建两个对象作为例如物体:cy=cylinder()b=boxlength:10width:50pos:[100,0,0]结果图4-5所示图4-5然后别离执行下面的代码:rotateb(EulerAngles0090)--box旋转了自身90度,如图4-6所示。图4-6incoordsysworldrotateb(EulerAngles0090)--box旋转了自身90度,和上面相同,这是因为变换中心默许是利用对象自身的基准点。incoordsysworldaboutcoordsysrotateb(EulerAngles0045)--围绕世界坐标系旋转了45度,变换中心是世界坐标系中心,如图4-7所示。图4-7incoordsyscyaboutcoordsysrotateb(EulerAngles0090)--变换坐标系是圆柱体cy,b以圆柱体cy坐标系原点为变换中心旋转了90度,如图4-8所示。图4-8例如二:小应用--一张桌子四条凳zhuozi=cylinderradius:80height:60wirecolor:whiteforiin1to4do(dengzi=boxlength:50height:40pos:[100,0,0]wirecolor:whiteincoordsyszhuoziaboutcoordsysrotatedengzi(EulerAngles00(90*i)))结果如图4-9所示。图4-9我家就这么简陋,若是不嫌弃的话,欢迎到我家来作客啊,粗茶淡饭仍是有招待的。五、大体的语法知识11、注释注释在程序执行时会跳过,可不能执行注释部份代码,它有助于明白得代码的作用,也能够用来讲明作者、程序版本等信息。单行注释,用两个--(减号)开头,后面跟注释内容。例如:--下面是创建一个box的代码box()多行注释,以/*开头,以*/结尾,中间放入注释内容。例如:/*程序名称:入门教程mediastime时刻:2005年1月7日*/a=10b=9--下面是if表达式,用途专门大,必需花心思把它把握ifa>bthenprintaelseprintbi=i+2i=i+22、代码布局缩进,选择要缩进的代码,利用Tab键能够使它向右缩进,同时按住Shift+Tab键可使它向右缩进。换行,每一行代码用回车键终止,若是把多行代码写在一行,之间要用分号隔开。例如:x=1;y=2;z=x+y若是是一行很长的代码,是不能用回车键的分行的,可用右斜杠连接两行代码为一行,如下:boxlength:100width:100height:20wirecolor:(color0125222)lengthsegs:10widthsegs:10\name:"地面"pos:[0,0,0]3、变量的范围分为全局变量和局部变量在程序运行进程中一直起作用的变量称为全局变量,只在某一代码块内有效的变量称为局部变量。声明全局变量globali=10声明局部变量locali=10例如:globali=6ifi==6do(localj=20j=i+jprintj)然后输入printi返回6,输入printj返回undefined,这说明j是局部变量,只在if代码块中有效。一样情形下,声明能够省略,程序自动判定是全局变量仍是局部变量。4、增量在每一次循环进程中变量自己增加必然的量。i=i-2i=i-266i=i*2i=i/2能够简写成i+=2i-=2i*=2i/=2例如:j=0foriin1to4do(j=j+2printj)结果返回:02488OKOK5、数量值整数(Integer):例如1,-8浮点数(Float):实数,例如,注意点:12与的区别,例如输入12/100,结果返回0,输入100,结果返回,输入10/,结果也返回,12/100满是整数,因此返回结果也是整数。整数和浮点数之间能够转换,输入12asfloat,结果返回,输入asinteger,结果返回12。--第一步--创建数组为后面雕刻八卦用arr8=#(#(0,0,0),#(0,0,1),#(0,1,0),#(0,1,1),#(1,1,1),#(1,1,0),#(1,0,1),#(1,0,0))--创建八卦的文本atext=#(嚷","兑","离","震","坤","艮","坎",蜜")--创建一个倒角修改器bev=bevelLevel_1_Outline:Level_1_Height:2Use_Level_2:1Level_2_Outline:0Level_2_Height:30\use_Level_3:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论