为什么要学习 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 里面每一个字串符的使用方法和他的作用。举个很简单的例子:“()
小夸号”和“[]中夸号”有什么区别呢?他们可以在什么地方使用?两个符号可以结合在一起
使用吗?怎么结合在一起使用更加科学合理?其实就是这样的几个问题解决好了,你甚至可
以模仿出一些美国大片级别的视频特效!(以上的几点我会在接下来的杂志中进行详细讲解)
第一讲: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:
完成了上一个例子.好,有人又说了:“丁,怎么样把那些房子都做成不一样的颜色?”最简单
的方法就是一个一个的点击物体,然后一个一个的对他们的线筐颜色进行调整。(— | | |)
—凸—)~_~)——_—)。这个这个。呵呵。。倘若想使用 MAX Script,仔细想一下,其实
这也是很简单的,学会一个属性命令——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.。如果想要把几条表达式合并成一行,也可以使用分号隔离.比如
如图.