3D脚本 maxscript入门教程
入门教程内容结构
本教程内容分为五个部分,用几个具体的例子讲解大多数的脚本操作和语法知识。
一、MAXScript简介
1、说明什么是MAXScript以及它有什么功能,能给用户带来什么好处。
2、访问脚本,认识脚本访问的界面。
二、基本操作: 创建和修改简单的对象,给对象赋材质,从而引出下面的概念
构造器:创建对象的语法称为构造器;
路径名;
数据类型:它们是数字,字符串,数组。
对象和类(层级树);
属性和方法;
变换;
函数和方法的联系;
通用属性和动态属性;
显示属性的函数;
一些常用的方法;
三、创建和操作具有复杂关系的对象,从而引出下面的概念
变量,变量和属性的关系;
对象引用:引用另外一个对象的属性值作为自己的值;
数组和集合等:数组,数组和变量的关系;
运算符和表达式;
表达式:求值的规则。
流程控制:选择和循环,条件选择。
制作简单的动画:"at time",动画控制器。
四、换一角度——从大家熟悉的操作流程来学习脚本
这是对前面知识的总结,前面是对语法基本概念的学习,现在是从大家操作流程的角度来学习,一纵一横,让我们对脚本有个相对全面的了解,理论和实际相互联系。有了前面的基础才好学下面的内容。
第一步:创建物体
一些常用物体的创建方法 。
第二步:选择物体
select
路径名,
变量名引用
条件选择
用类和集合选择物体
组Group:是一个虚拟对象,不是集合。
第三步:变换物体
变换:postion,move,scale,rotate,变换坐标系和变换中心
第四步:修改器
第五步:材质和贴图
第六步:制作动画
五、基本的语法知识
现在来学语法恐怕不会那么头痛了吧?
-----------------------------------------------------------------------------------------------------------------------------------------
一、 MAXScript简介
1、MAXScript
MAXScript语言是为了扩展3ds MAX 功能而专门设计的一种脚本语言,是面向对象编程语言中的一种。用它创建的场景物体和材质与在3ds MAX界面中创建的场景物体和材质完全对应。可以生成自动关键帧的动画模式,并可以通过层级路径名来访问场景中的物体。有记录在3ds MAX界面中的交互操作过程的能力,在使用界面操作的同时可以使用MAXScript来自由创作。
可以实现3D Studio MAX的全部用途,如建模、动画、材质、渲染等。
MAXScript可以运用各种数学工具来完成高级复杂的程序设计任务。可以对含有大量对象的集合进行操作。例如在复杂的场景中选择物体,可以把大量物体放置在精确的位置上,例如在山或路边放置一些树木,使用MAXScript操作起来是非常的方便。
它也能将一些功能定义为界面元素,例如工具栏按钮、菜单、浮动窗口,程序面板卷帘窗。
可以建行批处理操作提高工作效率。例如建立一次可以渲染多个场景文件的脚本程序。
可以自定义输入输出工具,可以定义修改器,渲染效果插件等。
2、访问脚本
2.1、认识MAXScript界面:包括MAXScript卷帘窗,脚本监听器窗口,脚本编辑窗口。
2.1.1、MAXScript卷帘窗
单击命令面板中的按钮,打开应用程序面板,再单击MAXScript按钮,在应用程序面板出现MAXScript卷帘窗,如图1-1所示。
图1-1
2.1.2、脚本监听器窗口
脚本监听器又叫脚本跟踪器,单击MAXScript卷帘窗中的Open Listener按钮,也可选择菜单栏中的 MAXScript/MAXScript Listener 命令,快捷键F11。如图1-2所示。
图1-2
也可右击用户界面左下方的Mini-Listener(迷你监听器)打开脚本监听器窗口,如图1-3所示。
图1-3
脚本监听器窗口是一个命令编辑和执行窗口,它由两部分组成,上半部分为宏记录窗口,下半部分为脚本运行结果输出窗口。如图1-4所示。
图 1-4
运行脚本时,脚本监听器窗口会输出脚本的运行结果,运行正确就显示为蓝色,运行错误就显示为红色,希望你的脚本不要出现红色啊。在窗口中可以编写新的脚本语言或对已有的脚本语言进行修改,用户输入的脚本显示为黑色。
选择主菜单中的宏记录Macro Recorder/Enable命令,如果此时进行操作,在窗口中淡红色部分将记录所进行的操作,这就是宏记录,选择菜单栏中的File/Save as 命令可以将记录保存为一个脚本。
2.1.3、脚本编辑窗口
单击MAXScript卷帘窗中的New Listener按钮,或者选择菜单中的 MAXScript/New Scrip 命令打开脚本编辑窗口,如图1-5所示。
图1-5
脚本编辑窗口是一个文本编辑窗口,你能在3ds MAX内部打开、创建或者编辑扩展名为"*.ms"、"*.txt"和"*.dat"格式的文本文件。调试文件时大键盘中的回车键与在记事本中的用法一样的,用来换行,当鼠标光标出现在某一行时,敲一下小键盘区的回车键,就可以执行本行程序。如果选择多行程序,敲下小键盘区的回车键,可以执行选择被选择的程序。如图1-6所示。
图1-6
按住鼠标左键不放,把选择的一行或者多行程序拖到3DSMAX工具栏里,将生成一个宏脚本按钮,单击此按钮,就可以运行这个宏脚本。
在脚本编辑窗口或脚本监听器窗口里调用edit()函数,可以打开脚本编辑窗口,语法是:edit "脚本文件名称" 。 例如打开 effect.ms 文件:输入 edit " effect.ms ",运行就可以打开这个脚本文件。
二、基本操作:创建和改变对象
1、创建简单的对象
传说天地未创建之时,是为无极,及有太极,则宇宙处于浑沌状态,就象鸡蛋一样盘旋着,在空间上无大无小无内无外,在时间上追溯到远古时代也无法知道其起源,所以把这种状态称为盘古,后来又不知那个好事者把盘古这种状态变成了一个传说——“盘古开天地”,结果“盘古”变成了一个宇宙创始人。老子给它起了个玄之又玄的名字——道。盘古一斧头就把这混混沌沌蛋给劈开了,结果太极判为天地,一气分为阴阳,中国就有了太极八卦和阴阳学说。自从盘古开辟天地之后,则万物具备,轻清者上升为天,重浊者下降为地。在天成象,在地成形,仰观天有日月星辰,俯察地有人鱼鸟兽,花草树木,种类繁多,数量庞大,不可计数。人类为了征服大自然,掌握这些事物,就给它们进行了分类,把相同的对象归类到具有相似特征的类之中,类与类之间如果还有相似的地方,那么就把这些归纳到更高层次的类中,例如把植物类和动物类归纳到生物类。面向对象编程中类和对象的概念就是试图对上面这些比较符合人类认识规律的概念进行描述。(呵呵 , 说的还挺玄乎~~)
好吧,现在就来看看在 MAXScript 中谁是宇宙万物的创造者——“盘古”。
选择菜单中的 MAXScript/New Scrip 命令打开脚本编辑窗口,如果想调试程序,跟踪程序执行结果,也可以把脚本监听器窗口打开,输入
box length:100 width:100 height:2
sphere radius:10 segments:16
按Ctrl+E键或者选择脚本编辑窗口菜单中的File/Evaluate All 命令执行程序,还可以用鼠标全部选定,敲小键盘上的回车键执行程序(以后都按此方法,不再说明)。
结果创建了一个盒子和一个球体,如图2-1所示。现在单击工具栏按名字选择对象按钮,在弹出的对话框中会出现这个盒子的名字“Box01”和球体的名字“Sphere01”,这是默认的名字。图2-1
box length:100 width:100 height:2 这一行代码就是一个box构造器,它创建了一个长度为100、宽度为100、高度为2的box。搞了半天,原来构造器就是“盘古”啊,伟哉,万物之始!
什么是构造器?在MAXScript帮助中常常看到Constructor这个单词,中文意思就是构造器。但是帮助中只是说明构造创建对象的语法,但并没有专门的内容来说明构造器这个概念。我把它归纳如下:在MAXScript中创建对象的语法就叫作构造器,其实质就是调用函数来创建对象,所以可以把它看作是一个函数调用 。也可以说是用一个抽象的类产生一个具体的对象。这个函数的名称就是基类的名称,所谓基类就是不能再分的类。我们创建对象都是从基类开始的。Box就是个基类,它的上一级就是几何类,再上一级就是节点。
如果学过JAVA,那么知道创建一个box对象的语法是:
Box Box01=new box() ;
呵呵,学习MAXScript可舒服了,只需输入box()就可以构造一个box了,面且大小写,分号都可以不用注意。
当我们手工单击创建面板中的Box按钮,然后在视窗中完成一个长度为100、宽度为100、高度为2的Box时,在程序内部就调用了Box( )函数,就是把我们在界面中的操作转换成了box length:100 width:100 height:2 这行内部代码。
构造器由两部分组成,基类名和创建参数。整个构造器就是一个函数调用,函数名 box就是基类的名字。创建参数由参数名后跟一个 冒号 : 和参数值组成,如图2-2所示。
图2-2
如果调用函数没有输入任何参数,那么必须在类名后加上一对英文 ( )括号,例如box(),将创建缺省参数的盒子。知道构造器原理后就知道怎么创建其它的对象了, 例如创建球体,输入
sphere radius:10 就可以了。
注:由于对象和类、层级关系等详细概念的内容比较复杂,将另立一文讲述。请看>>
2、改变对象
创建了盒子和球体对象之后,我们想知道刚才的长度、宽度等参数是否正确,应该怎么办呢?那就要访问对象的属性。诸如长度、宽度、名字、线框颜色半径等等对象所具有的特性统统称为对象的属性(Properties)。
访问对象属性的语法是由对象的路径名(PathName)后跟小数点.和属性名组成,路径名由美元符号$后跟对象在场景中的名称组成,$表示当前场景。例如访问box01的长度,输入 $Box01.length ,在脚本跟踪器窗口中返回100.0,访问Sphere01的半径,输入 $Sphere01.radius 返回 10.0 。改变Sphere01的线框颜色,输入 $sphere01.wirecolor=blue 或者输入:$sphere01.wirecolor= (color 0 0 255) 都一样。
那么要改变属性呢?只需给这些属性赋值, 输入$Box01.length=20,box01的长度变成20。我们以前数学里的等号在MAXScript中只能当作赋值符号用了。值的数据类型有几种,现在简单介绍几个典型的不同数据类型,它们是数字,字符串,数组。
数字:MAXScript区分两个数目类型:integers(整型)和floats(浮点型)。整型就是整数,例如0、1、802。浮点型就是小数,如期而至0.2、25.02、0.68。当MAXScript执行数字操作时返回和运算参数相同的类型。例如4+5返回9、而4.0+5.0返回9.0。
字符串:字符串是一个常量,需用引号标识。输入"Hello",MAXScript返回"Hello"。如果输入时没有加引号则返回undefined未定义。改变Sphere01的名字,输入$Sphere01.name="球体01",现在打开修改器面板,可以看到如图2-3所示的样子。
再把名字改回来,输入:
$球体01.name="sphere01"
注意双引号不能忘掉输入。
数组:数组是一些有序的元素的集合。每个元素可以是任何类型的值,并且所有的元素都可以单独的访问。一个数组可以有两种表现形式,第一种是:#(),这是一个空数组,数组定义必须用一个数目符号#和一对括号( )组成,括号里面是数组的元素名,元素可以为一到多个,多个元素之间用逗号分开,例如,#(1,“hello”,3.14159)。想要初始化数组中的元素的时候数组有适当的形式,每一个元素的值可以是数值,一个表达式(例如、30*2),或者是一个字符串(例如,“hello”),元素的名称是不能有同名,而且元素的数目没有限制。关于数组的具体操作,以后的例子中会涉及,这里只作个简单的介绍。输入命令 #(100,"hello",pi) ,MAXScript返回 #(100, "hello", 3.14159)。
那么我们怎么可以获取更多的创建参数呢?方法有两种:
其一是在创建面板中找到对应的创建参数名,创建好的对象也可以在修改器面板中找到创建参数。如图2-4A所示。
其二,根据属性来,因为创建参数实质就是根据对象的属性而定的,没有这个属性就不可能有这个创建参数。显示对象的属性的函数是 showProperties( ),输入 showProperties $box01 ,结果在脚本监听器窗口中返回以小数点开头属性名称,冒号后面是值的类型,现在不要管它。如图2-4B所示。三者之间的关系
细心的读者会发现,像name、wirecolor这些属性怎么没有显示出来呢?这就涉及到节点的通用属性,可以观看另文撰写的文章“面向对象编程中的对象和类”中的“类的继承”内容,现在不要管它,随着学习后面的文章,就会知道的。
3、变换对象
改变位置:想把那个球体放在Box01上面,先看看这两个物体的坐标吧。输入 $Box01.pos 返回 [0,0,0] ,输入 $Sphere01.pos 也返回 [0,0,0] 。Box01的高度是2,Sphere01 的半径是10,要向Z轴移动球体 12 个单位才能达到目的。输入 move $Sphere01 [0,0,12], 结果球的底部刚好在盒子的上面。聪明的读者也可能会输入 $Sphere.pos=[0,0,12] ,结果也达到了目的。那么move和pos有什么不同呢?我们试着分别把$Sphere01.pos= [0,0,12] 和 move $Sphere01 [0,0,12] 分别连续输入三遍,结果区别就出来了。pos是绝对坐标,move是相对坐标。
[0,0,12] 是什么?它是个三点值,在这里,方括号中的三个值分别是X轴、Y轴、Z 轴坐标值。
缩放尺寸:据说地球以前是圆的,后来人一多就给踩扁了,变成现在的椭圆形了(哈哈!!)。现在看看我们创建的球是不是也能踩扁它。输入$Box01.scale看看结果,返回了 [1,1,1],再输入 $Box01.scale=[1,1,0.5] ,结果Box01沿Z轴方向被压扁了一半,重复输入几次,不会再有变化了。输入 $Box01.scale=[1,1,1] ,恢复原状,现在输入scale $Box01= [0.5,0.5,1],它沿XY轴方向缩小了一半,继续输入就更小了。 $Box01.scale是绝对的,
scale $Box01 [0.5,0.5,1]是相对的。输入$Box01.scale=[1,1,1] 恢复到原来的状态。数值1表示原始大小即100%,2表示200%,0.5表示50%,其它如此推算。方括号中的三个值分别对应于X轴、Y轴、Z 轴。
旋转角度:那个盒子比球大,却被球压迫在底下,很不服气,发出 $Box01.rotation=(eulerangles 90 0 0) 命令,来了个侧翻身,(eulerangles 90 0 0) 这是欧拉角度值,eulerangles 表示欧拉角度,后面三个值分别表示X轴、Y轴、Z 轴。上面称动和缩放都有两种操作方式,一种是为属性赋值而变换,另外一种是接受一个动作而变换,那么角度也不例外,输入 rotate $Box01 (eulerangles 90 0 0),结果又把这个盒子给摆平了。也能写成比较好记的方式如
rotate $Box01 90 x_axis 旋转X轴90度,rotate $Box01 90 y_axis 旋转Y轴90度, rotate $Box01 90 z_axis 旋转Z轴90度。
凡是通过改变对象属性来变换的都是绝对值,通过对象的方法来变换的都是相对值。
select 选择对象、deselect 取消选择、delete 删除对象、hide 隐藏对象,unhide 取消隐藏、
$box01.material=standardMaterial diffusemap:(tiles()) showInViewport:true
$box01.material是Box01的材质属性,材质也是一个对象,所以标准材质的构造器是
standardMaterial diffusemap:(tiles()) showInViewport:true
这个材质并没有在材质编辑器24个球中出现,但点击获取材质按钮在场景选项中可以找到它。如果想把材质编辑器插槽中的材质球中的一个赋给Sphere01,输入
$sphere01.material=meditmaterials[1] --[1]表示第一个,[2]表示第二个
$sphere01.material.diffuse=yellow --设置diffuse的颜色为黄色
$sphere01.material.specularLevel=20 --设置高光级别为20
窍门:参数太多不易掌握,可选择主菜单中的宏记录Macro Recorder/Enable命令,然后手工在界面中操作,再观看宏记录,此时不禁心中窃笑,哈哈,MAXScript你想难倒我,没门!
关于材质方面的知识太多,不是一时所能掌握的,在此只作过初步了解吧。
像对象的修改器、空间变形等属性,并非对象所固有的,而是后来通过另外的对象附加上去的属性,MAXScript中把它称为动态属性(dynamic properties)
常量;变量,变量和属性的关系;运算符和表达式;表达式:求值的规则,输入的每一行代码都是表达式,因为它总是返回一个值。
对象引用:有的书叫双词模式(引用另外一个对象的属性值作为自己的值。);
数组和集合等:数组(一个系列的数据组合),数组和变量的关系;
不管是四时花草树木,八方飞鸟走兽,无论是静止着的、运动着的,哪怕是无序的事物,都存在有一定的内在关系。那么到底是怎么样一个内在关系呢?要有具体的内容啊!
既然能找出这些事物的内在关系,能否用MAXScript来再现这种关系呢?答案就是一个字:能!
变量就像一个容器,可以存储不同类型的数据。数目,字符串,数组,对象都可以存放在变量中。
myBox=box length:20 width:20 height:height
mySphere=sphere radius:10 pos:[0,0,zPos]
注:鉴于要有一定基础,变量的作用范围(即全局变量和局部变量)和增量放在第五部分了。
数组(array),是一系列有序数据的集合,每一个数据就是一个元素,它有两种表现形式:
例如把常量15,16.2,80这几个数据放在一起,就可以用数组存放:
arr--再次访问数组时,其内部元素的值已经改变了,返回#(236, 20, 30)
这个对应于手工在场景中命名的选择集,也可以用脚本命名选择集。
下面的代码创建一个名字为"盒子集"的选择集,它包含有刚才创建的两个box:
下面的代码创建一个名字为"球体集"的选择集,它包含有刚才创建的两个sphere:
在工具栏中点击命名选择集按钮,可以看到刚才创建的选择集,输入selectionSets["盒子集"][1],访问第一个元素,结果返回:
$Box:Box01 @ [-50.000000,-50.000000,0.000000]
输入move selectionSets["球体集"] [0,20,0],整个“球体集”向Y轴移动了20。
在使用MAXScript 时有许多值都是一系列的集合,很明显的有数组、 通配符路径名选择集,内置对象集。集合不用你特意去指定,它是系统自动完成的。例如我们现在用下面的代码创建一些对象:
$box* 表示场景中所有以box开头的对象,*表示任意个字符。
如果把那三个box和一个球体一起操作呢?它们都是内置几何体对象集:
geometry.pos=[0,0,0]-把所有的几何体移动到时原点
select objects --以内置对象集的方式选择所有的对象
geometry -- 标准的 3ds Max 分类(categorie)
输入selectionSets["盒子集"].center 返回"盒子集"中心 [0,-50,12.5]
输入selectionSets["球体集"].count 返回"球体集"总数3
输入selectionSets["盒子集"].max 返回"盒子集"最大范围[62.5,-37.5,25]
输入selectionSets["盒子集"].min返回"盒子集"最小范围[-62.5,-62.5,0]
这四个属性适用于对象集(ObjectSet),路径名(PathName)、选择集(selectionSet)等集合
上面的代码可以写成一块,这就是块表达式(block-expression):
or(或),只要两者有一个成立,那么整个都成立,例如在中国发现了外星人或者在美国发现了外星人,只要有谁发现了一个,那么就说明这个宇宙上还有另外的生命。示例:
x= =8 or y= =8 --有一个成立,返回 true
x= =8 and y= =8 --有一个成立,另一个不成立,返回 flase
x= =8 and y= =36 --两者同时成立,返回 true
not(非),对立派,总是唱反调,你要上山,它就要下水,你说是对的,它偏要说是错的。示例:
not a>10 -- 因为a>10 是true,所以not a>10返回 flase
通过以前的学习,我们知道使用构造器来创建单个的对象,现在就来大量创建对象,轻松地完成手工要费很大的力气才能完成的事。
for i in 1 to 4 do box pos:[i*50,0,0]
if x>y then print x else print "x没有y大"
--第三句的中文意思是:如果 x 大于 y 那么 打印 x 否则 打印 "x没有y大" ,结果返回 "x没有y大"。继续输入:
if x>y then print x else print "x没有y大"
rotate fc (EulerAngles 90 0 -90)
for i in 1 to 6 do sphere pos:[i*30,0,0] segments:16 radius:10
if distance fc i>160 then i.segs=4
距离摄影机大于160的球体分段数精简到4,结果如图3-4所示 。
if distance fc i>180 then i.segs=8
if distance fc i>240 then i.segs=4
注意,代码块要用( )包起来,不然程序只执行第一个if语句。这段代码使距离摄影机大于180的球体分段数精简到8,大于240的球体分段数精简到4,结果如图3-5所示 。
设置两个不同的关键帧就可以动画了。输入下面的代码创建球体没X轴的运动的动画:
s=Sphere pos:[-50,0,0] radius:10
这是对前面知识的总结,前面是对语法基本概念的学习,现在是从大家操作流程的角度来学习,一纵一横,让我们对脚本有个相对全面的了解,理论和实际相互联系。有了前面的基础才好学下面的内容。
先用手工把它们全部选择,此时这些被选择的对象被称为选择(selection),这是对象集之一。输入下面的代码进行遍历选择的第一个对象,把它们的名字显示出来:
for i in selection do print i.name
输入 selection.count,结果返回5,说明选择的总数是5个。
输入 selection[1],结果返回$Box:Box02 @ [0.000000,0.000000,0.000000],说明第一个元素是Box02。
for i in 1 to selection.count do selection.pos.x=selection.pos.x+i*40
这里的i是数目,selection是元素,是元素的索引,根据 i 的值指向对应的元素,在这里是指向那五个对象之一。
for i in geometry where hasProperty i "radius" do i.pos=10
for i in Geometry where classOf i = = box do i.pos = i.pos+[0,30,0]
for i in Geometry where i.pos.y ==0 do i.pos = i.pos+[0,30,0]
1、变换方法:postion,move,scale,rotate,前面已经讲过。
[ in ] coordsys world 使用世界空间坐标系统
[ in ] coordsys local 使用对象自身的坐标系统
[ in ] coordsys parent 使用对象的父坐标系统
[ in ] coordsys screen 使用屏幕坐标系统
[ in ] coordsys <node> 使用指定的节点对象坐标系统,相当于在界面中以拾取的对象作为坐标系统
about coordsys 以当前使用的坐标系统的原点为变换中心
about <node> 以拾取的节点对象的基准点为变换中心
b=box length:10 width:50 pos:[100,0,0]
in coordsys world rotate b (EulerAngles 0 0 90)
--box旋转了自身90度,和上面相同,这是因为变换中心默认是使用对象自身的基准点。
in coordsys world about coordsys rotate b (EulerAngles 0 0 45)
in coordsys cy about coordsys rotate b (EulerAngles 0 0 90)
--变换坐标系是圆柱体cy,b以圆柱体cy坐标系原点为变换中心旋转了90度
zhuozi=cylinder radius:80 height:60 wirecolor:white
dengzi=box length:50 height:40 pos:[100,0,0] wirecolor:white
in coordsys zhuozi about coordsys rotate dengzi (EulerAngles 0 0 (90*i))
五、基本的语法知识 1、注释 注释在程序执行时会跳过,不会执行注释部分代码,它有助于理解代码的作用,也可以用来说明作者、程序版本等信息。 单行注释,用两个--(减号)开头,后面跟注释内容。例如: --下面是创建一个box的代码 box() 多行注释,以 /* 开头,以 */ 结尾,中间放入注释内容。例如: /* 程序名称:入门教程 作者:mediastime 时间:2005年1月7日 */ a=10 b=9 --下面是if 表达式,用途很大,必须花心思把它掌握 if a>b then print a else print b 2、代码布局 缩进,选择要缩进的代码,使用Tab键可以使它向右缩进,同时按住Shift+Tab键可使它向右缩进。 换行,每一行代码用回车键结束,如果把多行代码写在一行,之间要用分号隔开。例如: x=1;y=2;z=x+y 如果是一行很长的代码,是不能用回车键的分行的,可用右斜杠连接两行代码为一行,如下: box length:100 width:100 height:20 wirecolor:(color 0 125 222) lengthsegs:10 widthsegs:10 / name:"地面" pos:[0,0,0] 3、变量的范围 分为全局变量和局部变量 在程序运行过程中一直起作用的变量称为全局变量,只在某一代码块内有效的变量称为局部变量。 声明全局变量 global i=10 声明局部变量 local i=10 示例: global i=6 if i==6 do ( local j=20 j=i+j print j ) 然后输入 print i 返回 6 ,输入 print j 返回 undefined,这说明j是局部变量,只在if代码块中有效。 一般情况下,声明可以省略,程序自动判断是全局变量还是局部变量。 4、增量 在每一次循环过程中变量自己增加一定的量。 i=i+2 i=i-2 i=i*2 i=i/2 可以简写成 i+=2 i-=2 i*=2 i/=2 示例: j=0 for i in 1 to 4 do ( j=j+2 print j ) 结果返回: 0 2 4 6 8 OK OK 5、数目值 整数(Integer):例如1,-8 浮点数(Float):实数,例如1.25,60.33 注意点:12与12.0的区别,例如输入12/100,结果返回0,输入12.0/100,结果返回0.12,输入10/100.0,结果也返回0.12,12/100全是整数,所以返回结果也是整数。 整数和浮点数之间可以转换,输入12 as float,结果返回 12.0,输入12.36 as integer,结果返回12。 -- |
arr8=#(#(0,0,0),#(0,0,1),#(0,1,0),#(0,1,1),#(1,1,1),#(1,1,0),#(1,0,1),#(1,0,0))
atext=#("乾","兑","离","震","坤","艮","坎","巽")
bev=bevel Level_1_Outline:1.4 Level_1_Height:2 Use_Level_2:1 Level_2_Outline:0 Level_2_Height:30/
use_Level_3:1 Level_3_Outline:-1.8 Level_3_Height:2
atex=text font:"隶书" text:atext prefix:"txt" pos:[0,300,0]
in coordsys world about coordsys rotate atex (eulerangles 0 0 (45*(i-1)))
badd=box pos:[0,r,0] length:16 width:120 height:30 lengthSegs:5 widthSegs:10 heightSegs:4 /
in coordsys world about coordsys rotate badd (eulerangles 0 0 (45*(i-1)))
bsub=box pos:[0,r,-2] length:22 width:30 height:34 lengthSegs:5 widthSegs:10 heightSegs:4/
in coordsys world about coordsys rotate bsub (eulerangles 0 0 (45*(i-1)))
for i in $badd* do (if i.name != "badd01" then( $badd01+i;delete i))
for i in $bsub* do (if i.name != "bsub01" then( $bsub01+i;delete i))
i.material=currentMaterialLibrary["Metal_Dark_Gold"]
$badd01.material=currentMaterialLibrary["Metal_Dark_Gold"]
addmodifier $badd01 (meshsmooth())
ground=plane length:300 width:300 lengthsegs:10 widthsegs:10
modi=Noisemodifier strength:[0,0,31]
tree01=box length:0 width:15 height:20 pos:[50,-45,-0.5] material:meditmaterials[1]
omni1=omnilight castShadows:on raytracedShadows:on pos:[50,-108,110]
omni2=omnilight pos:[15,25,195]
ca=TargetCamera pos:[26,-96,17]
tobj=targetobject pos:[26,-45,19]
fnamedir=getdir(#maxroot)+"maps/"--贴图目录
fnameenv=fnamedir+"Skies/CLOUD2.JPG"--环境贴图路径
environmentMap = Bitmaptexture fileName:fnameenv--设置环境贴图
fnamegrass01=Bitmaptexture filename:(fnamedir+"Ground/GRASS2.JPG")--混合贴图1的纹理贴图路径
fnamegrass02=Bitmaptexture filename:(fnamedir+"Ground/GRYDIRT2.JPG")--混合贴图2的纹理贴图路径
maskmap=Noise()--混合贴图的遮罩使用噪音贴图
m=mix map1:fnamegrass01 map2:fnamegrass02 mask:maskmap--创建一个混合贴图,赋给m
meditmaterials[2].diffusemap=m--材质编辑第二个插槽的difuse贴图设置成混合贴图
ground.material=meditmaterials[2]--地面材质使用材质编辑中第二个插槽中的材质
3D脚本 maxscript入门教程相关推荐
- 3D脚本 maxscript入门教程(6)
3D脚本 maxscript入门教程(6) (2013-05-23 19:59:32) 转载▼ 标签: 建模 maxscript 3dmax it 分类: 脚本 * 这是伏羲先天八卦,乾1兑2离3震4 ...
- 3D脚本 maxscript入门教程(7)
3D脚本 maxscript入门教程(7) (2013-05-23 19:59:40) 转载▼ 标签: it 分类: 脚本 --创建地面-- ground=plane length:300 width ...
- python快速入门答案-总算懂得python脚本快速入门教程
PyQt5是基于Digia公司强大的图形程式框架Qt5的python接口,由一组python模块构成.PyQt5本身拥有超过620个类和6000函数及方法.在可以运行于多个平台.PyQt5拥有双重协议 ...
- python脚本教程-总算懂得python脚本快速入门教程
PyQt5是基于Digia公司强大的图形程式框架Qt5的python接口,由一组python模块构成.PyQt5本身拥有超过620个类和6000函数及方法.在可以运行于多个平台.PyQt5拥有双重协议 ...
- [Away 3D] Away3D4.0入门教程(1)--这个世界的基础
大多数Flash程序员想要接触3D项目的时候,应该都和我一样,最关心的是怎么造一座山,怎么在场景里显示流动的河水,或是怎么让模型动起来(奔跑,攻击,或是跳舞),又或是怎么才能给人物换装,怎么让人物装备 ...
- 易语言脚本开发入门教程
天蓝易语言脚本入门开发系列教程第1讲初识易语言 天蓝易语言脚本入门开发系列教程第2课简单控件变量 天蓝易语言脚本入门开发系列教程第3讲简单登录器制作 天蓝易语言脚本入门开发系列教程第4讲计算器实现 天 ...
- 3d建模基础入门教程,3D建模各行业之间的发展趋势
3D建模各行业之间的发展趋势 建筑行业:本身技术含量相较其他行业较少,容易上手,所以从业者多,工资低,大多以施工提成来获取收入.行业发展已经进入平稳期,不会有太大的发展. 影视行业:学习门槛高,不适合 ...
- 现在学3D游戏建模还能找到高薪好工作吗?3d建模基础入门教程
一.3D建模是什么 "3D建模"通俗来讲就是,使用三维制作软件,通过虚拟三维空间构建出具有三维数据的模型.运用3D模型技术来完成真人CG的基础人物模型和动作还有场景.整个作品从模型 ...
- 使用Unity 3D开发Hololens入门教程
Microsoft已经发布了官方的Hololens SDK,本文将深入介绍使用Emulator(模拟器)开发Hololens,教大家如何使用Visual Studio 和 Unity 3D打造你的第一 ...
最新文章
- GLPI开源资产管理系统
- 避免在WHERE条件中,在索引列上进行计算或使用函数,因为这将导致索引不被使用...
- 负数显示红字html语言,需要将单元格内的负数显示为红色且不带负号显示两位小数的格式代码是下面哪一种A、 0.00;[红色...
- 有三AI小程序上线,把你的代码show给世界
- 超简单炫彩抽象线条感海报PSD分层素材,一切变得简单!
- jquery01-简介+语法+选择器+事件
- EXT.NET高效开发(二)——封装函数
- 《人工智能及其应用》1-6章
- Windows7 64位下SDK Manager.exe无法运行问题解决方法
- vba判断文件编码格式_VBA编写Ribbon Custom UI编辑器07——写入xml
- 跨考计算机要选择408吗,408难度比较大,对于跨考更是如此,应从以下三个方面做准备...
- 使用积分图像进行自适应二值化[Derek Bradley, Gerhard Roth, 2007]
- 首页被绑定为www.7939.com的手工解除方法
- python---Web前端HTML(超文本标记语言)
- python计算行列式(使用下三角方式)
- 元镜头——手机相机的下一场革命
- Centos7中语言如何设置成中文
- iOS UIActivityViewController 实现微信微博等等的分享功能
- 地震信号-相关子波零相位化
- docker centos + pbx
热门文章
- 收集的C#Directx资料
- rt5350 h264 sn9c291 的RTSP 延时测试
- 亚马逊真的是让我又爱又恨
- net的曲线救国,学习路径 MVVM (一)
- ROS noetic gazebo11车轮不显示的问题
- 在Windows Media Player 12中更新元数据和封面
- 当当网商品详情API接口(当当商品详情接口,当当商品评论接口,当当商品问答接口,当当抢购价接口,关键词搜索当当网商品接口)代码对接教程
- 所见即所得的php编辑,常用所见即所得HTML在线编辑器汇总(15个)
- LYNC2010两台虚机部署笔记2
- Ubuntu18.04有线网络连接不上