本文转载自http://jiurong995294.blog.163.com/blog/static/195133243201192531546490/
方便以后须要时候使用
为什么要学习3D MAX脚本?
3D MAX Script是我迄今为止见过编程语言最*的一种脚本开源环境,他的*程度远远超过了Sun 的JAVA,她没有大写和小写的区分,以及固定的公式和程序工作流程树,MAX Script一旦被编写,人们就能够从不论什么一行进行代码的编译,不须要符合格式的束缚。并且MAX Script的功能相当强大。
具体的说明一下MAX Script功能究竟有多强大:MAX Script是全然基于OpenGL开源以及VC核心制作出来的,而当今世界上不论什么一款CG制作软件也主要依赖这两点编写,也就是说假设MAX Script使用的好,我们全然有那个能力在3D MAX里面集成Maya的全部功能!这不光光是二次开发的乐趣,我想她更是一次CGer思维的革命,非常多使用传统制作方法难以完毕的任务,在使用了MAX Script后就会变的非常简便、快捷!
我觉得想要学好MAX Script不在于你前面有多少编程的基础和学习经验,关键在于能否非常好的理解MAX Script里面每个字串符的用法和他的作用。举个非常easy的样例:“()小夸号”和“[]中夸号”有什么差别呢?他们能够在什么地方使用?两个符号能够结合在一起使用吗?怎么结合在一起使用更加科学合理?事实上就是这种几个问题解决好了,你甚至能够模仿出一些美国大片级别的视频特效!(以上的几点我会在接下来的杂志中进行具体解说)
第一讲:MAX Script基础片
认识MAX Script界面:
按下键盘上的F11,或者依照图示单鸡button,就可以弹出MAX Script窗体?
第一讲,第二节:基础应用片:
用实例解说MAX Script的基础符号.
非常多人感觉MAX Script非常难,事实上我认为他们认为非常难的原因是由于基础没有学好,而我认为的MAX Script基础就是符号,倘若能把几个基本符号理解的非常好的话,相信非常多问题就能够迎刃而解. MAX Script真的不难,关键是在于你对他的理解.
如今我開始解说MAX Script中最基础的符号,希望大家认真学习,由于在这一节学好了,接下来的学习就会显的非常轻松?
MAX Scrip中:使用—— $、””、()、[]、和. 的理解。
接下来我向大家演示两个样例,而且在此例中向大家解说以上几个符号的用法,和怎样理解.
首先,来看一张效果图:比較抽象些,仅仅是表达个意思
一张大数量,宏观城市景观,共15376个BOX,如何制作速度最快?
最简单的方法就是——制作许很多多个BOX,然后一个一个的对他们进行高度、大小设置(— | | |)—凸—)~_~)——_—)。。。只是这个。。这个这个。。呵呵,冷不?好冷。。。
而我使用了MAX Script后,仅仅要一句就能够高定!
1:随便拉一个BOX
2:阵列一下(我的是30*30一共900个BOX)
3:选中全部物体!写入脚本
4:渲染,完毕局部的制作。
我使用的语句是:for a in selection do a.height=(random 0 10)
有人说:“老师,你写的那句话是什么意思?”好,我如今说明一下。
首先是:for a in selection。什么意思?for a in selection是一个固定搭配,表示“被选择的物体”而被选择的物体就是用——a来表示。
然后是——do,这个不用多解释了,“做,做一件事情” 被选中的物体去做一件事情;那是去做什么事情?这就是代码运算的结果——a.height=(random 0 10)
a. height=(random 0 10):
表示被选择的物体——a的 高度等于(0到10之间的一个随机数)
random是随机的意思; 0 10表示范围;height表示物体的高。他应该=…………
有了上面的这些解释,以下我们返回这一讲的主题:
细致观察上面所给的代码,首先我们发现一个有趣的表达式a.height,非常有意思,a表示已选择的物体,而height表示物体的高度,而者怎么联系到一起去的呢?原来是中间的一个 . 号。这个符号是关键,怎样理解?你能够把他理解成——“什么什么的属性”这个后面再跟详细属性,比方这个a.height,他的意思是说a的高的属性。然后再继续接表达式。a.height=什么什么(一个可选的数)
再细致观察,有没有发现什么?呵呵——小夸号!小夸号()怎么理解?不能说理解了,应该说怎么使用,在这里小夸号的用法为——“(加可选的客观数值,或者运算表达式)”向在这里,小夸号()里面就是一个表达式,他的取值范围在0到10之间。连接上前面的a.height,意思就是“被选择的物体高度在0到10之间随机变化。”说到这里,你已经豁然开朗了吧?
事实上原理是非常easy的,关键在于你能不能想的到。
第一讲第三部分:实例2:
完毕了上一个样例.好,有人又说了:“丁,怎么样把那些房子都做成不一样的颜色?”最简单的方法就是一个一个的点击物体,然后一个一个的对他们的线筐颜色进行调整。(— | | |)—凸—)~_~)——_—)。这个这个。呵呵。。倘若想使用MAX Script,细致想一下,事实上这也是非常easy的,学会一个属性命令——wirecolor就能够做到了,这个属性命令我是在——亓鑫辉老师的公开讲课中学到的。在此非常感谢火星培训部的亓鑫辉老师!也希望大家支持亓鑫辉老师!
1:这里有100个BOX,选中他们。
2:然后脚本
3:然后完毕,我这里有100BOX他们的颜色都是不一样的。
来看一下代码:for a in selection do a.wirecolor=color(random 0 255) (random 0 255) (random 0 255)
有人说:“老师,什么意思?”在这里for a in selection不说了,do 后面跟的是a 及wircolor两个关键词。Wirecolor是线筐颜色的意思,中间 . 号连接表示a的线筐颜色,后面是一个新的表达式:color
如今我来说一下color的用法。
Color+RGB是理论表达式,RGB都用0到255之间的数字表示,好了这样就有人写出了这种表达式:Color 50 250 150。回车运行代码后,发现是错误的。而我就认为这些人在我前面说的内容还是没有理解?。Color后面既然想表达3个数字分别相应RGB,能这样表达吗?是3个数字,不是一个数字。50 250 150,这是什么值?尽管能够表达RGB,可是格式不正确。前面的内容我已经具体的解说过了一点了:小夸号()的用法,小夸号()里面用来表示一个具体的数值。所以在这里,写成Color (50)(250)(150),就显的更加合理?
跟上前面的表达式连起来看一下。for a in selection do a.wirecolor=color(random 0 255) (random 0 255) (random 0 255)显然,我把已选择的物体的RGB都在0到255上面进行随机取值,这样就能够做到颜色都不一样了。
以上是MAX Script常常出现的几中情况错误,细致观察。红色的文字告诉你是什么地方出了问题。
1:-- Error occurred in a loop
-- Frame:
-- a: $Box101
-- Argument count error: Color wanted 4, got 1
这个提示应该还是比較好理解的,他告诉你BOX101没有办法依照代码被赋予正确的线筐颜色。并且也告诉了你是在“Color”这一指令后出的问题,非常明显这个就说明Color的表达有问题。
细致观察,发现错误语句中的Color表达是:Color(0 255 255)。而实际上3DMAX Scrip中的——()小夸号,里面仅仅能存一个固定的数值,0 255 255尽管是“RGB”色彩代码的表示方法,可是不符合语法,小夸号内必须存一个固定的数值,在MAX Scrip中“Color”指令后确实是要跟三个数字来表达R、G、B的,此时我们使用3个小夸号:()就比較合理了。
2:-- Syntax error: at keyword parameter, expected name
-- In line: for a in selection do a.wirecolor:color
出错了没有关系,MAX Scrip中的错误是最好排除的,细致观察红色的提示代码,要认认真真的找下在什么地方出错。他告诉你咯,这个“for a in selection do a.wirecolor:后出现了错误,”意思是这个“等于”号不能这么打,而输入“=”就比較合理了。(我上是用“冒号”取代“等于号”的)
3:我胡乱打的虾米…...看看他告诉我什么:undefined。意思是有定义。
解决的方法比較传统,入下:“未定义的变量或者名称”=*就可以(*能够是不论什么数值或者表达式,总之必须是一个已经被定义过的语句。)
4:这是在MAX Script中一个比較典型的错误,怎样推断一个有效的表达式。MAX Script中执行代码的时候,是从上向下依次逐行运算,细致观察,发现错误代码为:
a+b/c
+d
MAX Script在进行运算的时候,在第一行,会把他当成a+b/c进行运算然后直接输出结果,运行第二行的时候,就会提示“+号”使用错误,这是一段断开的代码,没有从头到尾的连续性。VC 和JAVA在这方面都使用了——{}大夸号来表示一段完整的程序代码。然后一段代码中还能继续使用{}大夸号继续定义子程序树。在MAX Script,加上反斜杠\就显得比較合理了
a+b/c\
+d
这样效果就等同于a+b/c+d.。假设想要把几条表达式合并成一行,也能够使用分号隔离.比方如图.