马上注册,加入CGJOY,让你轻松玩转CGJOY。
您需要 登录 才可以下载或查看,没有帐号?立即注册
×
转自:http://illn.blog.163.com/blog/static/1203743820087412247268/
3D网络 作者:丁熏 点击:4902 责任编辑:南粤设计 整理时间:2006-8-28为什么要学习3D MAX脚本?
3D MAXScript是我迄今为止见过编程语言最自由的一种脚本开源环境,他的自由程度远远超过了Sun的JAVA,她没有大小写的区分,以及固定的公式和程序工作流程树,MAXScript一旦被编写,人们就可以从任何一行进行代码的编译,不需要符合格式的束缚。而且MAX Script的功能相当强大。
详细的说明一下MAX Script功能到底有多强大:MAXScript是完全基于OpenGL开源以及VC核心制作出来的,而当今世界上任何一款CG制作软件也主要依赖这两点编写,也就是说如果MAXScript使用的好,我们完全有那个能力在3DMAX里面集成Maya的所有功能!这不光光是二次开发的乐趣,我想她更是一次CGer思维的革命,很多使用传统制作方法难以完成的任务,在使用了MAXScript后就会变的非常简便、快捷!
我认为想要学好MAXScript不在于你前面有多少编程的基础和学习经验,关键在于是否能很好的理解MAXScript里面每一个字串符的使用方法和他的作用。举个很简单的例子:“()小夸号”和“[]中夸号”有什么区别呢?他们可以在什么地方使用?两个符号可以结合在一起使用吗?怎么结合在一起使用更加科学合理?其实就是这样的几个问题解决好了,你甚至可以模仿出一些美国大片级别的视频特效!(以上的几点我会在接下来的杂志中进行详细讲解)
第一讲:MAX Script基础片
认识MAX Script界面:
按下键盘上的F11,或者按照图示单鸡按钮,即可弹出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之间随机变化。”讲到这里,你已经豁然开朗了吧?
其实原理是很简单的,关键在于你能不能想的到。
第一讲第三部分:实例2:
完成了上一个例子.好,有人又说了:“丁,怎么样把那些房子都做成不一样的颜色?”最简单的方法就是一个一个的点击物体,然后一个一个的对他们的线筐颜色进行调整。(— | | |)—凸—)~_~)——_—)。这个这个。呵呵。。倘若想使用MAXScript,仔细想一下,其实这也是很简单的,学会一个属性命令——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 250150。回车执行代码后,发现是错误的。而我就觉得这些人在我前面说的内容还是没有理解?。Color后面既然想表达3个数字分别对应RGB,能这样表达吗?是3个数字,不是一个数字。50 250150,这是什么值?虽然可以表达RGB,但是格式不对。前面的内容我已经详细的讲解过了一点了:小夸号()的使用方法,小夸号()里面用来表示一个具体的数值。所以在这里,写成Color (50)(250)(150),就显的更加合理?
跟上前面的表达式连起来看一下。for a inselection do a.wirecolor=color(random 0 255) (random 0 255) (random 0255)显然,我把已选择的物体的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)。而实际上3DMAXScrip中的——()小夸号,里面只能存一个固定的数值,0 255255虽然是“RGB”色彩代码的表示方法,但是不符合语法,小夸号内必须存一个固定的数值,在MAXScrip中“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 ain selection doa.wirecolor:后出现了错误,”意思是这个“等于”号不能这么打,而输入“=”就比较合理了。(我上是用“冒号”代替“等于号”的)
3:我胡乱打的虾米…...看看他告诉我什么:undefined。意思是有定义。
解决办法比较传统,入下:“没有定义的变量或者名称”=*即可(*可以是任何数值或者表达式,总之必须是一个已经被定义过的语句。)
4:这是在MAX Script中一个比较典型的错误,如何判断一个有效的表达式。MAX Script中运行代码的时候,是从上向下依次逐行运算,仔细观察,发现错误代码为:
a+b/c
+d
MAXScript在进行运算的时候,在第一行,会把他当成a+b/c进行运算然后直接输出结果,执行第二行的时候,就会提示“+号”使用错误,这是一段断开的代码,没有从头到尾的连续性。VC和JAVA在这方面都使用了——{}大夸号来表示一段完整的程序代码。然后一段代码中还能继续使用{}大夸号继续定义子程序树。在MAXScript,加上反斜杠\就显得比较合理了
a+b/c\
+d
这样效果就等同于a+b/c+d.。如果想要把几条表达式合并成一行,也可以使用分号隔离.比如如图.
|