许昌公务员二期房:MAX脚本语言简介

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 03:36:26

Topic: //MAX脚本语言简介 //

  Print this page
1.//MAX脚本语言简介 // Copy to clipboard Posted by: ice
Posted on: 2005-05-22 09:39

MAX Script是3D Studio MAX中的脚本语言。它为用户提供了以下功能:

·描述3D Studio MAX的全部用途,如造型、动画、材质、渲染等;
   ·将脚本集成在用户应用面板卷展栏工作界面上,给脚本一个标准的MAX用户接口;
   ·使用插入的文件的I/O,建立用户输入/输出工具;
   ·写入可以访问全部场景状态的过程控制器;
   ·建立批处理工具,例如批处理渲染脚本;
   ·通过OLE Automation,与外部系统建立活动接口。

MAX脚本语言是为完成3D Studio MAX功能专门设计的。它是像3D Studio MAX一样面向对象的,有许多对于MAX用户界面中特征和结构,带动画关键帧的动画模式,并通过层次改变场景对象对应于MAX的对象层次。

脚本语言的语句非常简单,并且标点和格式规则非常少,从未学过编程的用户也可以很快学会。

MAXScript在应用面板中的卷展栏形式,如图所示。

2.Re://MAX脚本语言简介 // [Re: ice] Copy to clipboard Posted by: ice
Posted on: 2005-05-22 09:40

MAX Script编辑窗口如下图所示,在这一窗口中可输入新的脚本内容。

3.Re://MAX脚本语言简介 // [Re: ice] Copy to clipboard Posted by: ice
Posted on: 2005-05-22 09:40

MAX Script脚本语言输入行,被设置在用户界面的左下方,如图

4.Re://MAX脚本语言简介 // [Re: ice] Copy to clipboard Posted by: ice
Posted on: 2005-05-22 09:41

MAXScript菜单项设置在菜单栏中,如图

5.Re://MAX脚本语言简介 // [Re: ice] Copy to clipboard Posted by: ice
Posted on: 2005-05-22 09:44

脚本语言的应用

·Open Listener(打开录入):打开MAXScript的输入窗口。

·Open Script(打开脚本):打开脚本选择对话框,选择已存在的脚本,MAX Script编辑器显示所选择的脚本,脚本文件选择对话框。如图

6.Re://MAX脚本语言简介 // [Re: ice] Copy to clipboard Posted by: ice
Posted on: 2005-05-22 09:44

· New Script(新脚本):用于打开MAX Script编辑窗口,在此窗口中可输入一个新脚本。

· Run Script(运行脚本):打开脚本选择对话框,选择已存在的脚本。然后读出和执行所选择的脚本,所有的输出都显示在录入窗口中。

用户要根据自己的需要编写脚本语言就要在MAX Script Listener中编写,我们可以通过用户界面中的MAX Script控制面板或命令菜单MAX Script>MAX Script Listener…打开一个脚本录入窗口,如图

7.Re://MAX脚本语言简介 // [Re: ice] Copy to clipboard Posted by: ice
Posted on: 2005-05-22 09:44

MAX Script Listener是一个命令编辑和执行窗口,在窗口中可以编写新的脚本语言或已有的脚本语言进行修改。
8.Re://MAX脚本语言简介 // [Re: ice] Copy to clipboard Posted by: ice
Posted on: 2005-05-22 09:46

实例:
使用脚本语言创建几何体

单击菜单MAX Script > MAX Script Listener
在对话框中键入

1. The Sphere = Sphere (*,*)
2. The Cone = Cone Radius 1:0 Radius 2:20
3. The Helix = Helix Height:100 Pos:[100,100,0]
   以上三段语言分别建立了球体、锥体与螺旋线。
   执行第一行建立一个球体,球体的参数为变量。
   执行第二行建立了一个半径1为0;半径2为20的锥体。
   执行第三行建立了一个高为100;坐标位置为[100,100,0]的螺旋线。效果如图。

9.Re://MAX脚本语言简介 // [Re: ice] Copy to clipboard Posted by: ice
Posted on: 2005-05-22 09:47

使用脚本添加控制器

利用以上三条命令所创建的物体来完成一个锥体转向球体,球体沿螺旋路径运动的动画。

打开脚本录入窗,在以上三条命令后继续键入以下程序段:

  1. The Cone .Target = The Sphere
   2. The Sphere.Position.Controller = Path Path: The helix
   3. -- To Follow is The Helix
   4. The Cone.Position.Controller = Look-At Look-At:Sphere
   5. Refs.Dependents The Sphere
   6. Refs.Dependents The Cone
   7. Refs.Dependents The Helix
   执行第四行,将球体指定为锥体的目标
   执行第五行,指定路径控制器给球体并确定路径为螺旋线。
   执行第六行,使球体跟随螺旋路径。
   执行第七行,将Look-AT控制器指定给锥体并确定Look-AT目标为球体。
   完成这段程序后效果如图

10.Re://MAX脚本语言简介 // [Re: ice] Copy to clipboard Posted by: ice
Posted on: 2005-05-22 09:52

END
11.Re://MAX脚本语言简介 // [Re: ice] Copy to clipboard Posted by: zmy_cn
Posted on: 2005-05-22 20:03

小弟第一次来完美动力,对max script语言有一定研究,希望能和大家一起学习。
MAX Script是用来扩展MAX功能的工具,用户可以使用它添加新的特征或设置自定义的MAX,这样它被定制成符合你的要求的样式。还可以用MAX记录用户的动作,这样以后可以使用它们减少重复的动作。还可以用Script告诉MAX你需要的场景的类型让MAX提供合适的场景,或者告诉MAX你所的事,或着输入你希望执行的指令的时候告诉它希望发生什么事情。
OK,现在我们就来讲一讲MAX Script语言的基础知识。

一:变量
MAX Script中的变量代表其他的值。当在公式中提到一个变量时,实际上指的是变量存储的值。而且除了数字以外,MAX Script中的变量还可以存储其他的内容。变量命名可以用任何名称。最好把它们命名成能帮助你记住变量代表什么含义的名称。
要把一个值赋予一个变量需要使用符号。MAX计算符号右边的表达式并把结果存储在名为X的变量中。然后只要在Listener窗口中输入X,按下Enter,就能看到X的值是多少。
例如:X=25
变量可以存储字符串,字符串是一组字符。例如:student36=”ZouMingYu”或者grouchy=”My name is”+student36
Point3数据类型代表三维点。下面是使用点的几个例子和注释:
POS=[0,0,0]——在(0,0,0)创建新的点
POS.X=7——把X坐标改成7
POS=POS+(6,6,6)——把它移动(6,6,6)
除了这些基本数据类型外,场景中的每个对象都有自己的数据类型。在较大对象内的数据片段被称为成员或属性。大多数场景对象都有name。Position两个变量描述对象的名称。MAX还有一个内置的特殊变量,它代表当前被选定的任何对象。这个变量用$表示。

二:流程图
当MAX开始执行脚本时,它从脚本的第一行开始处理它,然后移到下一行。对脚本的执行一直继续下去直到在脚本文件中再也没有代码行为止。MAX允许你在脚本文件中嵌入注释或注解,帮助理解正在发生的事情。要插入注释,需要文件中加两个连字符(——)。当MAX遇到双连字符时,它跳过注释和该行上的其他任何内容,移到脚本下一行。
常用的流程结构如下:
条件:
条件是控制脚本中的程序流程的一个方法。正常情况下,MAX处理每一行,无论这一行是什么,然后退出。但是当有了条件,如果表达式是Ture,则MAX只执行某些行。
条件语句遵循下面的格式:
Ifthen
是要计算的表达式,是表达式等于True时要执行的一些MAX Script。还可以用关键字else指定,如果表达式等于false,则发生什么事件。如:
if (student36=”ZouMingYu”)then

score=100

else

score=80


循环
循环是另外一种MAX Script语言结构(呵呵,无论哪一种计算机语言都有循环语句啊),让你能无视正常的执行流程。而不是每次处理脚本中的每一行,然后退出,而是MAX Script循环结构对一件事情重复做几次。例如下面所有不及格学生的成绩可以改为及格:
student=1
for score<60 do

score=60


集合阵列
MAX Script有一些非常有用的特性用来帮助用户操纵一组对象。一组对象被称为一个集。集中的变量没有特别的顺序,只是被组合在一起。下面设置了所有的名字为box开头的物体的颜色为蓝色:
A=$box*
A.wirecolor=bule

三:表达式
表达式是MAX用来做出决定的内容。表达式比较两样东西,根据比较的结果做出简单的结论。
表达式”10>1”是一个简单的表达式,它询问:“10大于1吗?”,表达式总是在提问“是or不是”类型的问题。当你在MAX Script一窗口中(或脚本内)输入表达式时,MAX计算表达式。如果表达式是正确的,则打印Ture,如果不正确,则打印false
有时需要一个对不仅有两个数据的表达式进行判断。MAX Script有and、or和not运算符帮助你构建这样的表达式。
and运算符组合两个表达式,询问“这两个表达式都是Ture吗?”如果两个都为Ture,则整个表达式等于Ture。但只要其中一个表达式为False,则整个表达式是False。而且可以使用括号来组合表达式,所以有and运算符的表达式可能是下面的样子(a<b)and(a<b)。
or运算符类似于and,但是如果其中一个表达式为Ture或两个都是Ture,则表达式的结果为Ture。如:(a==b)or(a<b)
not运算符把表达式的值从ture翻转成false或者从false翻转成ture。

四:函数的使用
MAX Script一个特性是函数。函数是小的MAX Script块,像是建立分程序的程序。例如,如果你想计算所有数值的平均值,使用函数不仅在需要计算许多数字的平均值时使脚本非常短,而且也使它更容易被阅读。如果函数不正确,那么可以在脚本的顶端对它进行修改,如果没有使用这个函数就必须查找你的脚本,找到计算平均值的每处代码,然后解决问题。

五:脚本的制作和使用
1:记录脚本
在Listener窗口中,进入Micro Reconder菜单,选定Enable。Macro Reconder现在是打开的,可以准备开始编写MAX Script。对场景中的物体进行为了一系列的操作以后,完成脚本了,在MAX Script Listener窗口中,选定Micro Reconder Enable,关闭Micro Reconder。

2:执行脚本
我们开始检查MAX Script成果。给场景添加一个其他物体,确保在进行下一步之前选定它。MAX Script Listener窗口顶端的面板中,选定所有的文本然后按下“shift=enter”告诉MAX执行MAX Script。你制作的Script就可以起作用了。
12.Re://MAX脚本语言简介 // [Re: ice] Copy to clipboard Posted by: zmy_cn
Posted on: 2005-05-22 20:22

下面是我翻译Borislav Petrov的教程!
MAX脚本语言公共教程---第一章
目标:
根据我自己的经验,MAX脚本语言比人们想象中的还要简单,最大的问题是开始学习和使用它时找到一个想法。在讨论之后将不是教你MAX脚本语言的每个方面,它将向你展示一些基本的,所以没有什么可怕,MAX脚本语言对于非程序员也是非常简单,灵活和有趣。
目录:
我们现在开始来编写一个简短的代码,来读取位图和创建的几何物体的像素信息。
我们也将看到相同的代码可以被用来创建多个效果,只需要改变一行代码。
第一步,我们将写一个基本的功能代码,不是用户界面(这个将在第二章中介绍)。
在第一个版本中,许多值都是基于硬件代码。但是在以后的版本中用户可以自己定义。
下面是一个显示字母“M”的源文件代码。这个位图的大小是 (40x40x32bit) 。
--打开一个新的MAX场景
--载入脚本
--按 Ctrl+E 来执行脚本文件

work_bmp = openbitmap "c:\\mxstut\\m.tga"
--打开我提供的m.tga文件
--如果你的路径不一样,你必须改变上面的路径

bmp_w = work_bmp.width
--读取位图的宽度并把值赋给变量bmp_w

bmp_h = work_bmp.height
--读取位图的高度并把值赋给变量bmp_h

progressstart "Generating Objects..."
--显示程序执行进度

for h = 1 to bmp_h do
--在位图中循环所有行
(
pixel_line = getpixels work_bmp [0,(h-1)] bmp_w
--储存单个行到数组

progressupdate (h as float /bmp_h *100)
--更新进度指示

for w = 1 to bmp_w do
--在当前的行中循环所有的象素
(
size_value = 100 + (pixel_line[w].r+pixel_line[w].g+pixel_line[w].b)/3
--计算象素的发光度(R+G+B)/3的值

new_object = box length:100 width:100 height:size_value
--创建一个新的立方体,它的高度根据上面的象素值来创建

new_object.pos = [w*100, (-h*100), 0]
--放置这个新创建的物体到一个新的位置,这个位置基于像素的坐标
--注意在MAXK中,0,0是左下角,在位图中是左上角
--这个说明符号在 (-h*100)
--100 是物体之间的距离。

new_material = standardmaterial diffuse:pixel_line[w]
--创建一个新的材质,漫反射的颜色是象素的颜色

new_object.material = new_material
--assign the new material to the new object
把这个新创建的材质赋给新物体
) -- 结束 w 循环

) -- 结束 h 循环

progressend ()
--结束进度显示

close work_bmp
--关闭位图
这儿有使用脚本语言的习惯用法:
你可以使用脚本语言像DOS那样的命令提示行,输入一个命令,像
box()
再按下数字键盘中的回车键,一个新的立方体将在默认的坐标位置 [0,0,0] 显示出来。
你能在一个脚本文件中创建一个顺序的命令,并且保存它们随后使用。要执行一个脚本,在Utility/MAXScript/Open Script中打开它,安Ctrl+E执行它,它不提供用户界面。
你能创建脚本程序来为MAX的插件提供用户界面类型。(这个将在第二章中介绍)
还可以用MAX脚本编写动画控制器。

login.tga (15.82k)
13.Re://MAX脚本语言简介 // [Re: ice] Copy to clipboard Posted by: zmy_cn
Posted on: 2005-05-22 20:23

接着上面的:
现在让我详细的讲解一下刚才脚本的详细用法:
work_bmp = openbitmap "c:\\mxstut\\m.tga"
**在MAXScript中,所有的物体都储存在变量中。openbitmap(打开位图)命令可以打开一个存在的图像。文件的类型可以是任何MAX支持的类型。包括动画(多帧位图)就像AVI,MOV和IFL等文件类型。
注意:在MAXScript中你必须要指定清楚文件的路径。
bmp_w = work_bmp.width
bmp_h = work_bmp.height
**bmp_w ,bmp_h这两个变量用于储存当前载入图象文件的宽和高。如果你改变路径,载入另外的一个图像,这个脚本仍然可以正确的工作。用户变量work_bmp 代表位图物体。在MAX中每个物体都有自己的属性。属性可以通过在当前物体名字的后面加上一个“.”来引用。要查看某个物体的可用属性,你可以查看帮助文件或者用showproperties object 这个命令。
例如:
my_box = box () [Enter] --创建一个立方体
showproperties my_box [Enter] --显示这个物体的可用属性,以下是立方体的各项属性
.height : float --高度值:浮点型
.length : float --长度值:浮点型
.lengthsegs : integer --长度片段数:整型
.width : float --宽度值:浮点型
.widthsegs : integer --宽度片段数:整型
.mapCoords : boolean --图形坐标:布尔型
.heightsegs : integer --高度片段数:整型

progressstart "Generating Objects..."
**MAXScript提供了许多命令用于显示和控制进程指示。我们创建了一个,它显示提示文本,但不能动态更新。
for h = 1 to bmp_h do
(
**这是一个由变量的开始值和结束值控制的循环体,这个变量不断的改变初始值并在最终的值达到的时候停止改变。变量 h 在开始的时候是 1 ,结束的时候是位图的最后一行(bmp_h).在括号中的所有的状态将不断的改变,直到最终的那种值达到。
使用一个注释是一个非常好习惯,比如:"--end x loop",它能非常容易的指示结束语句,而且可以清楚的指明整个循环语句 。你可以点击一个临近的括号,并且按下Ctrl+B来调用另外的一个括号。在脚本中将显示这对括号,并选择了它们和它们中间的代码。
注意:MAXScript中的循环语句可以在许多不同的情况下使用,比如收集场景中的物体等。
pixel_line = getpixels work_bmp [0,(h-1)] bmp_w
***现在我们开始读取位图。
"pixel_line"是一个数组的用户名,它将储存整行的像素。这个数组是一维数组,通过数组的索引值可以存取数组元素的值。在MAXScript中,所有的数组的第一个元素的索引是1。比如:在我们创建的这个数组中的第一个元素pixel_line[1]。MAXScript使用动态数组,改变数组元素的值或添加新的元素,内存管理将自动改变数组列表。如果你想初始化一个空数组,你可以键入my_array = #(). 在MAXScript中只要变量是一个场景物体,字符串或数字,你能创建一个场景物体的列表,通过它们的名字,或它们的一些数字属性。
在图像物体中用getpixels操作命令,需要两个值X,Y来读取象素的数值, 这个相对缓慢的功能,用一个数组来储存大量的像素是个非常好的方法,存取数组元素代替采集单个元素。
注意:二维数组是一个基于零的列表,它的第一个元素是 [0,0]而不是[1,1].
在循环读取图像时要注意这点,这也是为什么我们使用[0,h-1]来代替[1,h].
progressupdate (h as float /bmp_h *100)
**我们已经开始了一个新的进程指示。现在我们将更新它。它接受0到100的数值(%)。如果用浮点型数值是0.0到1.0。这个进程也能使用用户输入的Esc/Cancel,但是我们今天跳过它,下次在详细说明。
for w = 1 to bmp_w do
(
**这是一个二次循环,也可以说是一个内循环,从1到行的最后一个像素来循环。
size_value = 100 + (pixel_line[w].r+pixel_line[w].g+pixel_line[w].b)/3
**这个一个现行规则通常用于获得我们将创建的几何体和像素之间的关系。
在以后,我们将用到不同的公式在相同的脚本中去获得许多功能。
在这里,我们把单个的像素的红、绿、蓝的变量值保存到数组中。我们把它们加到一起在除以3。接着在加100,这样我们的几何体当像素是黑色时 [0,0,0]. 至少有100个单位。这个值是基于像素的发光度(灰度级别)。你能简单的改变公式像size_value = 100 + (pixel_line[w].r) 这样只有红色的值将被使用。纯红,紫色和黄色的值变为355 (100+255).
其它的一些颜色减少红色成分,下降100。(100+0)
new_object = box length:100 width:100 height:size_value
**现在我们创建一个新的立方体,长宽为100,它的高为我们已经计算的变量值size_value。这个新的物体将变成一个新的变量(像每个MAX物体)。我们现在能存取物体的属性通过变量名,点,特性名称:
new_object.pos = [w*100, (-h*100), 0]
**这个 .POS (或者 .POSITION)属性定义几何物体在3D空间中的位置。我们使用3个点的值[X,Y,Z]来指定3D坐标。
注意:在MAX中,从顶视图中看时[0,0,0]这个坐标左下角。在图像中 [0,0]这个坐标在左上角,这个解释了符号(-h*100),100是物体之间的距离。
new_material = standardmaterial diffuse:pixel_line[w]
**我们创建了一个新的标准材质,并且漫反射的颜色是像素的颜色。材质也是MAX物体,它保存在变量中,也有自己的属性。
new_object.material = new_material
**我们改变了新物体的 .MATERIAL 属性,赋给了它一个新的材质变量。
)--end w loop
**在 w 循环之前结束,这个脚本将不会进一步执行
)--end h loop
**每当 w 结束时,h 将增加 1 ,过后它将结束,这个脚本将继续。
progressend ()
**现在我们隐藏了显示进度。
close work_bmp
**我们也关闭了位图。
OK,一样都准备好了,你可以按下Ctrl+E来执行这个脚本。
在下一章中,我们将在实用程序栏中创建一个用户界面,并定义许多变量用来完成不同的效果。
14.Re://MAX脚本语言简介 // [Re: ice] Copy to clipboard Posted by: zmy_cn
Posted on: 2005-05-22 20:24

MAXSCRIPT 公共教程--第二章
目录:
在这章中,我们将编写一个用户界面。
用户通过UI(用户界面)元素控制自定义变量。从而改变了一些“机器代码”的值。
MAXSCRIPT 中用户界面物体:
MAXSCRIPT提供给你非常简单地使用和自定义用户界面元素像角度、位图、按钮、复选框、复选按钮、拾取颜色、组合框、曲线控制、下拉列表、文本编辑框、分组框、超链接、图片标签、标签、列表框、贴图按钮、材质按钮、多选列表框、拾取按钮、弹出菜单、进度条、单选按钮、滑动条、微调器、子卷展栏、定时器、卷展栏UI控制共同属性和布局参数。
这里有若干公式命令位置和排列这些元素到用户界面上,这非常类似商业插件。
MAXSCRIPT允许创建自由的浮动面版和命令面版卷展栏。
你能在MAXSCRIPT帮助文件中阅读更为详细的关于各种元素的使用方法。
现在我们开始写自己的脚本:
--打开新的场景
--载入下面的这个脚本
--按下 Ctrl+E 执行脚本
--从下拉列表中选择所制定的项目
--以下是源代码
utility lesson02 "Lesson02"
(

group "About..."
(
label lesson_label01 "Lesson 02 Script"
label lesson_label02 "by zmy_cn"
label lesson_label03 "QQ:397465209"
)

group "Settings:"
(
dropdownlist effect_mode "Effect Mode" items:#("Luminosity","Red Channel","Green Channel","Blue Channel")
spinner base_size "Base Size:" range:[1,1000,100] fieldwidth:40 align:#right
spinner multiplier "Size Multiplier:" range:[0.1,10,2] fieldwidth:40 align:#right
spinner nth_pixel "Every Nth Pixel:" range:[1,10,1] fieldwidth:40 align:#right type:#integer
button get_image "Get Image File" width:140
edittext bmp_name "File" text:"c:\\mxstut\\m.tga"
)

button start_process "LET'S DO IT!" width:140 height:30

on get_image pressed do
(
pick_image = selectBitmap caption:"Get Image File"
if pick_image != undefined then bmp_name.text = pick_image.filename
)

on start_process pressed do
(
work_bmp = openbitmap bmp_name.text
bmp_w = work_bmp.width
bmp_h = work_bmp.height

progressstart "Generating Objects..."

for h = 1 to bmp_h by nth_pixel.value do
(
pixel_line = getpixels work_bmp [0,(h-1)] bmp_w
progressupdate (h as float /bmp_h *100)

for w = 1 to bmp_w by nth_pixel.value do
(

case effect_mode.selection of
(
1: size_value = base_size.value + multiplier.value*(pixel_line[w].r+pixel_line[w].g+pixel_line[w].b)/3
2: size_value = base_size.value + multiplier.value*(pixel_line[w].r)
3: size_value = base_size.value + multiplier.value*(pixel_line[w].g)
4: size_value = base_size.value + multiplier.value*(pixel_line[w].b)
)

new_object = box length:base_size.value width:base_size.value height:size_value
new_object.pos = [w*base_size.value, (-h*base_size.value), 0]
new_object.name = uniquename "2nd_Lesson"
new_material = standardmaterial diffuse:pixel_line[w]
new_material.name = new_object.name
new_object.material = new_material

)

)

progressend ()

close work_bmp

)

)
15.Re://MAX脚本语言简介 // [Re: ice] Copy to clipboard Posted by: zmy_cn
Posted on: 2005-05-22 20:25

这是是第二章后一部份。
MAX Script 提供了16种类型的UI控制条目来构建卷展栏,其共同的语法是:
[][]
其中为那16种类型。用来命名一个自动创建的卷展栏局部变量,这个局部变量保存着代表控制条目的数值,并且用来联系控制条目和事件手柄函数。可选项,用做控制条目类型的标题、条目标签或者文本内容。可选项是一系列用来设置选项或者影响控制条目布局的关键字参数。每一个UI控制条目类型都有相应的属性。它定义一系列控制条目后,MAXScript自动按默认方式在卷展栏中放置这些条目,并按其在脚本中的定义顺序一个接一个地放置。可以利用布局参数来调整布局。
utility lesson02 "Lesson02"
(
--创建一个变量名为Lesson02的实用工具程序,在卷展栏标题中显示单独地名字和字符串。
group "About..."
(
label lesson_label01 "Lesson 02 Script"
label lesson_label02 "by zmy_cn"
label lesson_label03 "QQ:397465209"
)
--上面的这些语句用来在卷展栏的标签框里旋转一系列的UI控制条目,这样可以将大的卷展栏组织成组。其语法是:
--group({user_interface_item>}).
--这个group声明在一组UI元素的周围创建边界。它是一个非常好的分割器,通常可以把一组相似的功能放在一起。
--label,标签用来在卷展栏中放置静态文本。其语法是:
--label[]
--默认对齐方式是中心对齐。它没有多余的属性和方法。它通常用于显示系统信息。
group "Settings:"
(
dropdownlist effect_mode "Effect Mode" items:#("Luminosity","Red Channel","Green Channel","Blue Channel")
--dropdownlist下拉列表用来在卷展栏中放置一个下拉列表。其语法是:
--dropdownlist [ ] [ : ] \
--
-- [ : ] [ : ]
--
--一个 dropdownlist 一次只显示单个的输入行,但是它能用数组来暂存多个定义的项目。
--这个语句通过变量和标题文本来执行。
--下拉菜单被使用在从列表中选择项目。
--.selection 的性质是返回选择项目的索引。
--spinner base_size "Base Size:" range:[1,1000,100] fieldwidth:40 align:#right
--spinner UI 元素提供一个带有箭头的值域,用于设置数字值。
--range:[start,end,default] 提供超过程序设定的最值。
--fieldwidth 这个被用在许多UI元素中。这个仅是输入区域的大小。
--align:#right 让许多UI元素变成右对齐。你也能使用关键字:#left and #center
--这个微调控制项定义了几何体基本大小,现在可以自定义,在第一章中把数值改为100。
spinner multiplier "Size Multiplier:" range:[0.1,10,2] fieldwidth:40 align:#right
--这个值定义了一个增强值用于缩放立方体的高度是上还是下。
--它将增强从象素中得到的颜色值。
spinner nth_pixel "Every Nth Pixel:" range:[1,10,1] fieldwidth:40 align:#right type:#integer
--这个值定义了一个循环步骤。如果这个值高于1,这个循环跳过这第N个的象素或行。type:#integer语句是强制值转换成整形,没有小数部份。
button get_image "Get Image File" width:140
--button UI 元素让你开始动作,当按下它通过鼠标器。width:140 设置按钮水平尺寸的大小,这个按钮将被用于选择一个图像 路径/文件 在script中使用。
edittext bmp_name "File" text:"c:\\mxstut\\m.tga"
--edittext 区域提供用户文本输入的地方。它的文本值是预先设置使用的默认位图的名字,并且允许用户手工改变它。
)
button start_process "LET'S DO IT!" width:140 height:30
--这个按钮将开始执行第一章的代码。它的高度设为30是为了在主面板中给它一个很好看的位置。
on get_image pressed do
(
--ON 语句为用户动作提供一个扫描方法。在这种情况下,它监视按钮 get_image 并且执行执行DO以后的语句。
pick_image = selectBitmap caption:"Get Image File"
--selectBitmap 命令武打标准的MAX选择位图对话框并有各自的标题。变量pick_image变成等于用户选择的位图物体。
if pick_image != undefined then bmp_name.text = pick_image.filename
--if ... then...else 结构被用于在布尔值上做决策。
--当IF后的语句为TRUE时,THEN后的语句被执行。
--当IF后的语句为FALSE时,ELSE后的语句被执行。
--这儿我们仅有第一部份。if...then 结构。
--当变量值为UNDEFINED时,在这种情况下,用户将返回选择。
--如果返回的值是一个有效的位图物体,它的.name属性被赋到编辑文本区域中的文本。!= 意思是 "不等于"
)

on start_process pressed do
(
--这行监视主按钮,在它被按下时,主代码被执行。
work_bmp = openbitmap bmp_name.text
bmp_w = work_bmp.width
bmp_h = work_bmp.height

progressstart "Generating Objects..."

for h = 1 to bmp_h by nth_pixel.value do
(
--这儿我们包含进去一个额外的语句,通过定义增长循环变量值的步骤。如果nth_pixel.value的值为2,这个循环将像1,3,5,7,9...
pixel_line = getpixels work_bmp [0,(h-1)] bmp_w
progressupdate (h as float /bmp_h *100)

for w = 1 to bmp_w by nth_pixel.value do
(
--这个语句的功能和上面的一个功能相同。
case effect_mode.selection of
(
1: size_value = base_size.value + multiplier.value*(pixel_line[w].r+pixel_line[w].g+pixel_line[w].b)/3
2: size_value = base_size.value + multiplier.value*(pixel_line[w].r)
3: size_value = base_size.value + multiplier.value*(pixel_line[w].g)
4: size_value = base_size.value + multiplier.value*(pixel_line[w].b)
)
--CASE语句提供一个更紧密简洁的决策方法。它可以代替语句if effect_mode.selection == 1 then ..., if effect_mode.selection == 2 then ..., etc.
--CASE表达式用来从一组已做标记的表达式中选择一个表达式来执行,这些表达式以与标记进行比较测试值为基础。
--只有标记与测试表达式匹配的第一个表达式被赋值。所有标记必须和测试表达式比较。
--已做标记的表达式可以是块表达式。因此可以使用CASE表达式作为一个CASE语句,在代码块中选择代码执行。
new_object = box length:base_size.value width:base_size.value height:size_value
new_object.pos = [w*base_size.value, (-h*base_size.value), 0]
--旧100恒量现在被我们定义在UI上的变量base_size的值替换。
new_object.name = uniquename "2nd_Lesson"
--在这个版本,每个新物体接收一个单独名字2nd_Lesson。
--MAXScript添加最低的数值,可用它创建一个新的单独的名字。
new_material = standardmaterial diffuse:pixel_line[w]

new_material.name = new_object.name
--新创建材质的名字被设置成它赋予的物体的名字。(想想这个语句很有用的)
new_object.material = new_material

)--结束W循环

)--结束H循环

progressend ()

close work_bmp

)--结束按钮按下
--这是主代码的结束部份。
)--结束实用程序
这个实用程序定义在这儿结束。我们开始使用script!
按下Ctrl+E执行script,一个新的条目将显示在MAXScript的下拉菜单中。
从下拉菜单中选择Lesson02。
你当执行脚本仅使用Red Channel info, Base 100, Scale 3.0, Nth 4
时将发生什么这儿将显示出来。
在下一章中,我们将扩展这个实用工具的性能。
由于时间关系和我能力所限,难免有错误和不妥之处,敬请大家批评指正,多顶一下,就是对我最大的支持。