近期热门
粉丝909
关注 205
获赞 1007
一条很少有人去走的路——3DMAX SCRIPT教程

[脚本] 一条很少有人去走的路——3DMAX SCRIPT教程

 !heats_icon! [复制链接]
9310 6 0 4 16年前 举报
开始访问MAXScript
MAX脚本语言是基于3DS-MAX2.0以上版本的,所以你只能在3D-MAX运行的时候使用脚本语言。这里有很多种方法从内部访问MAX的脚本语言。最简单的方法是从MAX的菜单中选择MAX脚本语言编辑器。开始脚本的另外一个方法是:
1 在命令面板上选择UtilIty并点击MAXScript会出现一个面板。
2 点击Open Listener.MAX脚本语言编辑窗口就会出现。
MAX脚本语言编辑窗口是一个交互式的语言翻译,它的工作方式就如同DOS的命令窗口.输入MAX脚本语言中的命令,并且回车就可以立即执行命令。
一次只有一个MAX脚本语言编辑窗口可以被打开。当你在使用的时候,你可以在MAX和脚本语言编辑器之间互相切换。如果你关闭了语言编辑窗口然后再打开它,先前的命令和文字将被保留下来。
语言编辑器分为两格。顶部粉红色的窗口是宏记录器窗口;底部白色窗口是输出窗口。如果当语言编辑起启动以后,宏记录面板是关闭的,那么可以把分隔条向下拖曳来打开它。
当宏记录器处于可运行状态的时候,每一条可以记录的命令都会显示在宏记录窗口里,而输出的结果就会在白色的输出窗口里输出。从宏记录器窗口中输出的执行代码会被显示在输出窗口里以防止错误或混乱的记录。两个窗口都允许你进行剪切、复制、拖曳、编辑、选择或执行命令(代码)。你可以拖动分隔条来调整两个窗口之间的大小。
在状态栏的左边界包括了可定义大小的小型编辑窗口。
如果小型编辑窗口不可见,可以拖动状态面板左边的分割条来让它显示出来。THE MINI LISTENER PANES ACT ASSINGLE-LINE IN CORRESPONDING LISTENERPANES。小型编辑窗口总是显示你正在输入的东西或者是你把光标放置于编辑窗口的位置。反过来说,任何你输入到小型编辑窗口的内容都会输入到光标所处位置的编辑窗口中。
  
怎样把编辑器安装到一个视图中
1、右击视图标签(viewport label)
2、选择 Extended
3、选择 MAXScript Listener.
  
源代码输出
MAX脚本语言代码的输出不同于大多数的程序语言。MAX脚本提供给你具有自由形式的语言,就如同C和C++那样,没有数量庞大的标点符号。
MAX脚本语言让你打破变量声明、公式的限制,并且可以在任何你需要的地方进行跳行执行。语句的断点可以设在表达式的中间。MAX脚本语言会解读你的代码直到每一行的终点,不管这行代码是否完整。如果不完整的话,它回继续解读后面的代码,只到代码结束为止。
  
怎样有效的打断一条命令
a+b*c/d-e
+f*g/h
这个表达式的打断是无效的,因为MAX语句会把a+b*c/d-e看成一个合法的运算而把独立的"+f*g/h"看成一个错误的表达式.
但是我们可以用反斜杠来使其合法,比如:
a+b*c/d-e \
+f*g/h
这样MAX脚本语言就可以正确的识别这个语句了,它的运算结果同a+b*c/d-e+f*g/h
无论何时,MAX脚本语言都把XX作为一条命令的最后一个元素(除了空格.TAB.和注释文字),它回继续解读下一行,虽然这个断点并没有显现出来.对于把复杂的和很长的语句行变的简单易读,行的有效打断是非常重要的.
MAX脚本语言也允许你把几条表达式或声明语句合并为一行.表达式与表达式之间用分号来分隔.
比如说:
1+2;2^3 ;sin 0
3
8
0.0
有时候在语句的旁边添加注释文字来让你明白程序上下文之间的含义是十分有用的。你可以用两个-号来注明你的注释文字。
比如:
1+2+3 --you don't really need MAXScript to do this,do you?
6
  
把信息输入到MAXScript
  
     有几种非常有代表性的不同类型数据是你要输入到MAX脚本语言编辑窗口中去的信息。包括数字变量,字符串变量和数组。通常输入信息的方法是输一个值或者是一个表达式并且按下回车键。无论怎样,各种类型的信息必须用一种稍微与众不同的方法来输入。
  
     MAX脚本语言对两中类型的数据进行区分:整型变量和浮点型变量。整型变量就是一整个的数字,就像0,1,2,10,527。浮点型变量就是带小数点的数字,比如2.5,72.0和0.33
  
当MAX脚本语言进行数字运算的时候,计算结果的数据类型一般和计算类型相同。比如说
1+2
3
2.0+3.0
5.0
当MAX脚本语言进行包括整数和浮点数的混合运算的时候,无论怎样它都会把这个整数看成浮点数。
比如说:
3+4.0
7.0
  
      MAX脚本语言是一种基于正常语言的表达方法。它的所有构成都能产生一个值。字符串变量是MAX脚本语言的构成,他们被插入脚本内部作为记号使用。输出一个字符串变量的命令,意味着在MAX脚本里产生的一个字符串变量是字符串本身。
1、在MAX脚本编辑窗口打开的情况下,输入HELLO到MAX脚本编辑窗口然后按回车。
  
MAX脚本回答"undefined"(未定义)
  
       这是因为MAX脚本语言无法识别HELLO这个词,它不是一个命令,变量或者是任何可以识别的东西。
2、再次输入单词"HELLO",这次要在这个词旁边加上双引号,然后按回车。这个时候“”就是输出命令。
  
现在看上去MAX脚本可以识别这个字符串变量“HELLO”因为它非常友好的用“HELLO”来回答你。实际上它仅仅知道你输入了一个字符串,并且输出命令的回复值总是你输入的字符串的值。
  
在MAX脚本语言里输入数组。
  
你可以使用数组来对几个元素进行编组。一个数组是几个值(元素)的有序集合。在MAX脚本语言里每一个数组里的元素可以包括任何类型的值,并且所有的元素都可以被个别的存取。
  
一个数组可以表达成两个部分,第一个部分是#()
这是一个最基本类型的数组:一个空数组。要注意,所有的数组在使用前都必须使用一对括号定义。
  
当你想要定义一个或者多个初级元素的时候这个数组的模式是十分恰当的。每一个数组的元素可以是一个数或者是一个表达式。(比如说,SIN,PI,6.2^3)("hello,你好").元素没有必要一定是相同类型的信息,并且在一个数组里有多少元素没有限制.比如:
#(5,PI,"STRING",6+2^3)
#(5,3.14159,"STRING",14)

变量的赋值
在先前的例子中,你在MAX脚本程序中输入了字符串"HELLO",于是MAX脚本显示了相同的字符串作为它的命令输出.当你输入其他字符串的时候,MAX脚本语言会显示你后来输入的字符串而忘记了先前的.要让MAX脚本记住一个字符串的值的时候你就需要给变量赋值.在MAX脚本语言中给变量赋值的通常语法是:
variable_name = variable_value(变量名=变量名)
以一个字母,文字或者下划线"_"开头,跟上任何的文字的或者是数字的字符.可以是字符串变量,数字,或者其他任何的表达式.
  
给一个变量赋予一个字符串:
1、在编辑器内输入如下命令:
mystring = "This is my string"
注:其中"mystring"是变量名, "This is my string"是变量值.
  
于是MAX脚本语言就会返回这个字符串变量的值:
mystring = "This is my string"
"This is my string"
现在你就可以输入变量名来随时查阅这个变量的值了.这种方法比你重新输入这个字符串要快很多.MAX脚本语言在开启的过程中会始终记忆这个字符串变量,直到你改变了这个字符串变量的值为止.
  
给一个已经存在的变量赋予新的值.
1.输入 mystring = "This is not your string."回车
当你做到这一步的时候,MAX脚本语言已经为这个变量记忆了新的值.现在你再输入mystring的时候,计算机会回复
"This is not your string"
  要注意MAX脚本语言不能区分大小写字母不同的变量名,MAX脚本语言的命名不是很敏感.
  
MAX脚本语言里的数据流转
除了字符串以外,你还可以把其他类型的数据输入MAX的脚本语言里.MAX的脚本语言不仅可以识别数字型字符,也可以对它们进行精确的数字运算.和字符串一样,如果你只输入数字本身,MAX脚本语言只会把这个数字回复给你,它评估这个数据,并且显示数据的值.数据运转更加的有趣.
  
              基本的数据流转.
MAX脚本语言有许多内置的函数可以让你把它作为计算机器来使用.
比如
36.5*2
73.0
MAX脚本语言也能识别少数的几个数学常量. 比如:
PI
3.14159
MAX脚本语言识别出了PI的值并且返回了这个值
你可以在更多复杂的运算中使用这个值.比如说,如果你想知道一个半径为2.5英寸的球体的容积,那么就用正方体的半径的三次方乘以PI,然后乘以4再除以3.
4/3*PI*2.5^3
49.0874
字符串的运算.
你也可以用字符串执行一些简单的数学运算.比如说你对变量a 和变量b进行如下定义.
a="MAXScript";b="is fun!"
那么变量a加上变量b的最终结果就是
"MAXScript is fun!"
更多的关于字符串的运算规则会在以后的“字符串值”中加以详细的说明。

额外的数据运算。
MAX脚本语言可以执行很多数学运算,包括三角函数(SIN,COSH,ATAN)和对数函数(EXP,LOG,SQRT).这一章节介绍了两种最有用的运算:随机数和增量。
创建随机数
在MAX脚本语言里一个非常有用的数据运算是随机数函数.它返回指定的两个值之间的随机数.例如:
random 1 100
返回的随机整数在1与100之间.返回值的类型(整型和浮点型)和函数中第一个定义的数据类型相同,所以如果你输入:
random 1.0 100
MAX脚本语言就会返回一个在1与100之间的随机浮点数
注意,这个命令在运行中有可能产生相同的数字.如果关闭这个软件然后重新启动脚本,这样的情况就有可能发生.但是千万不要一次又一次的运行脚本.如果你想要软件在每次启动的时候都会产生不同的数字.你可以用以下的命令:
seed <number>
这个数字可以是整型数或者是浮点数,每次你改变这个值的时候.MAX脚本语言都会生成新的随机数.
  
增量
另外一个有用的数据运算是MAX脚本语言提供的增量.这是一个可以快速改变赋予值的方法.如下例所举:
X=X+1
有4种数学运算可以分配相应的算子.(+,-,*,/)
比如我们先给X赋值
X=1
然后我们可以通过X+=1对X进行加1的动作.
这个时候输入X+=1,那么X=2.
再输入X+=2,那么X就等于4,等于号后面的值可以是数字或者是变量,比如我们输入X+=X,那么X就会等于8.
X-,X*和X/与X+同理.

用MAX脚本语言画一个BOX
在先前的课程中,你可以看到MAX脚本语言的一些有用的能力;但是在界面里我们却什么都看不见.MAX脚本语言对普通的物体的操作也是十分有用的.就好象六面体和圆柱体.你可以用MAX脚本语言来画一个六面体,只需要输入如下命令:
BOX()
这条命令可以创建一个默认参数的六面体.一般情况下,把一个物体赋予一个变量能更好的练习.因为你可以通过变量名来方便的查找到它.比如:
mybox=box()
当你使用MAX脚本语言来创建一个没有指定任何参数的物体的时候,使用一对空的括号是十分重要的,代表没有参数,或者可以理解成参数是"".这两个引号告诉MAX脚本程序这个物体使用默认参数.如果你想在穿件的时候指定任何参数,比如物体的大小和位置,你就不需要这对括号了.
比如说:
mybox = box length:20 width:20 height:20
MAX脚本语言返回这个六面体的名称和位置.
请点击下载附件:1878826-BMP.bmp

这个例子创建了一个六面体,并且提供了三个参数:这个六面体的长,宽,高.参数的名字后面跟着冒号和这个参数的值.你可以不加任何标点符号输入所有的参数.MAX脚本语言返回以下数据段
$Box:Box01 @ [0.000000, 0.000000, 0.000000].
  
数据段的第一个部分称为路径名.MAX脚本语言里的路径名和WINDOWS里面的路径名相似.就像c:\3dmax\examples\file.max一样,它描述了文件的详细的层级和路径.在MAX脚本语言里,使用了一个类似的路径概念.但是在MAX脚本语言里的路径不是针对于文件的,而是针对于物体的.MAX脚本语言里的路径总是以"$"开头
  
数据段的第二个部分是物体名,在这个例子中,这个名字显示在物品选择对话框里,当你使用 Select by Name(按名称选择)钮的时候.它不是你的六面体的变量名.这个参数只是一个指向这个物体的占位符.
在中括号里的值对应着六面体的中心位置所处的坐标.
  
MAX脚本语言同时也在视图中画出了这个六面体.它在透视图中显示如下:
0.jpg

编辑六面体
在上面的课程里,你用变量赋值的方法创建了一个六面体.因为你把六面体赋予了一个变量,你现在可以非常容易的编辑和存取这个六面体的所有参数.变量名就如同是这个六面体的把手一样,在变量名后加一个点(.)再加参数名.比如mybox.height 可以解读成mybox的高度.
  
所有的3DSMAX物体都有创建参数,就像六面体的长,宽,高.或者是圆形的半径,这些物体也有转变参数,比如scale(比例),rotation(旋转),position(位置).和普通参数比如名字,颜色等等.要改变任何属性,你可以给这些参数设定一个新的值.
比如,你想要改变物体的大小:
  
输入mybox.scale=[1.5,1.5,1.5]可以看到六面体比原来的尺寸等比放大了1.5倍.
比例属性要求给予X,Y,Z轴各一个缩放元素.在这个例子里,你没有必要把同样的值给予六面体缩放元素.除非你想均衡的调整六面体的大小.
如果你只想要改变物体的宽和高,而不改变长.可以使用以下语句:
mybox.scale = [1,3,2]
当你用任何元素来缩放你的原始六面体(长20,宽20,高20)的时候,六面体的参数始终是长20,宽20,高20.你可以在编辑面板里看到六面体的参数没有被缩放改变
如下图
1.jpg

                                                                                       


虽然改变六面体的高度和宽度参数可以在视觉上达到相同的结果,但是上面的缩放结果和我们使用下面两条命令的结果是不一样的.
mybox.height = 40
mybox.weidth = 60
产生这种情况的原因是因为用参数来改变六面体高度的时候,被改变的是创建参数.使用缩放参数来改变物体的高度的时候不会改变创建参数.
此外,不管使用任何方法来改变物体的大小,在通常的情况下是一样的,但是,当你想要保持一个物体的创建参数的时候(那样的话你甚至可以在对物体进行一连串不同的变形之后仍然可以改变物体),你必须使用缩放属性来熟练的改变物体的大小,而不是单独的改变他们的创建参数.


怎样寻找物体所有的附加的参数
参数展示面板显示了六面体在创建时的所有参数.你可以用参数展示面板里的微调钮来改变这些参数.如果你想要改变长,宽,高的段数,或者是在MAX脚本语言里设置生成贴图坐标,你就需要知道改变这些属性的语法.为了找到所有属性设置的语法,这里有两种不同的检查函数.第一个是"."
这个函数会显示3DSMAX指定的级别信息.在圆括号里输入的信息是一个字符串和一个统配符来和3DMAX的级别名,超级别名和参数名来对应.
MAX脚本语言显示了六面体的所有属性,相当于你可以在参数展示面版里看到的,包括了六面体所属的级别和每一个属性的数据类型.
2.jpg

现在我来解释一下数据类型
float:浮点型,简单的来说就是带小数点的数字类型。但是我现在还不知道可以延伸到小数点后面的几位。:(
integer:整型,不带小数点的数据类型,范围不明
boolean:布尔型,它的值只有True(真)和False(假)两种.
注意,你可以用"*"号作为统配符来查看六面体的所有属性.如果你已经输入了,MAX脚本语言就已经列出了所有的参数和级别.
  
例子:
showclass "box*" 显示所有3DSMAX里面的级别是BOX的物体.
showclass "box.*"显示所有级别是BOX的物体的可存取参数.
showclass "*:mod*" 显示所有的编辑级别
showclass "*.*rad*" 显示参数中包括rad三个字符的所有在场景中存在的物体.

进行标准的变化
现在,你知道了如何创建和编辑六面体的基本属性了.你需要学习怎样对它进行标准的变形.(移动,缩放和旋转)
在物体创建的时候就对其指明位置,大小和方向是可行的.但是,你也同样能够在物体创建以后再对它实行这些操作.就如同你在3DMAX的标准世界里所能做的那样.
  
移动六面体
移动一个物体的MAX脚本语言非常简单:
move name_obj [<x,y,z>]      (move 物体变量名 [<x,y,z>])
你想要移动的物体的名字在那里,你想要它移动多少?要非常注意的是,你不是在手动移动这个物体,而是用数字在移动.所以,如果你要是使用移动函数不止一次的话,那么这个物体就会持续移动.这对缩放和旋转操作同样有效.与设定一个物体的初始属性来移动这个物体相比,如果你设定这个物体的位置,缩放比率和角度属性几次,这个物体不会改变,即使你每次给相同的值
比如说:
mybox.pos = [10,0,0]
mybox.pos = [10,0,0]
mybox.pos = [10,0,0]
只有第一行语句能够被执行.第二行和第三行语句对你的六面体没有进行任何位置上的改变.他们没有改变六面体的位置.
3.jpg

                                                                                       

另一方面,输入
move mybox [10,0,0]
move mybox [10,0,0]
move mybox [10,0,0]
将会把你的六面体向X轴方向移动30个单位.
4.jpg
旋转六面体
旋转不像移动和缩放那么简单.实际上,在MAX脚本语言里有三种方法可以对物体进行旋转:
Euler Angles  
Quaternions  
Angleaxis  
这里只介绍使用Euler Angles方法.如果你想知道更多的方法,请参照MAX脚本语言介绍(昏!)
要在MAX脚本语言里指定一个旋转变化,首先你必须把旋转定义为一个变量,然后指定变量到你想旋转的物体。变量可以用下面的方法来定义:
rot_obj = eulerangles x y z
可以使用任何名称和空格来表现你想要把你的物体分别按X,Y,Z轴旋转多少(以度数为单位)。比如说
rot_box = eulerangles 0 30 0
创建一个叫做rot_box的物体,它将会沿着Y轴方向旋转30度。你可以用下面的方法来把这个变量应用到你创建好的六面体上去:
rotate mybox rot_box
5.jpg

如果你给出了两个以上轴的角度:
rot_box2 = eulerangles 30 45 60
当这个变量被赋予物体的时候它会先旋转X轴,再旋转Y轴,最后旋转Z轴
注意:无论是移动,缩放或者是旋转物体,还是用默认的参数来设定物体属性,都是在世界坐标轴里的操作。关于怎样按照物体自身坐标轴系统来对物体进行变形会在以后逐渐说明。

                                                                                       

更加深入的的多边形变形
下面的几行为我们的六面体准备了更加复杂的变形。它们改变了六面体在所有面上的段数,然后生成了贴图坐标。
输入下面的四行代码:
mybox.lengthesegs = 10
mybox.widthsegs =10
mybox.heightsegs =10
mybox.mapCoords = true
MAX脚本语言已经改在编辑面版里做出了相应的改变:
6.jpg

无论什么时候你改变了3DMAX世界里的物体的参数,MAX脚本语言也会马上在视图和用户界面里作出相应的改变
  
你也可以创建编辑命令并且把他们赋予一个物体。
  
编辑命令的创建和赋予
创建一个编辑命令是非常简单的。你只要输入命令和清单中你想要使用的编辑命令的名称再加上它的参数就可以了。
比方说,要建立一个扭曲命令(Twist)并且设置扭曲度为30度并且把这个扭曲编辑赋予你的六面体,你只要输入
addModifier mybox (twist angle:30)
在透视图中,你的六面体现在已经被扭曲了,并且编辑面版界面显示了新的扭曲(Twist)编辑命令和它的参数。
7.jpg

2
8.jpg

修改编辑器里的参数
修改编辑器里的参数和创建编辑命令一样简单。因为你为你的物体赋予了一个变量名,并且你为这个物体添加了一个编辑命令,你现在可以非常容易的对你的物体编辑属性里的参数进行存取。
要把扭曲命令里的角度改变到60度,输入
mybox.twist.angle = 60
9.jpg
0
点赞
0
打赏
4
添加到收藏夹

0

点击复制链接

使用微信扫码分享
一次扣10个券
全部评论6
您需要登录后才可以回帖 登录

好长篇呀-------
14年前
回复

使用道具 举报

提示: 作者被禁止或删除 内容自动屏蔽
15年前
回复

使用道具 举报

所说的内容

所说的内容,能不能系统化,整理成一套资料呀,这种资料,不好找,也是你的工作成果呀
15年前
回复

使用道具 举报

:lol :lol :lol :lol :victory: :victory:
15年前
回复

使用道具 举报

好东西顶一下
15年前
回复

使用道具 举报

哦。讲没完吧!
16年前
回复

使用道具 举报

您当前使用的浏览器IE内核版本过低会导致网站显示错误

请使用高速内核浏览器或其他浏览器