3D脚本 maxscript入门教程(2)

3D脚本 maxscript入门教程(2)

 (2013-05-23 18:23:49)
标签: 

3dmax

 

maxscript

 

建模

 

it

分类: 脚本
结果创建了一个盒子和一个球体。现在单击工具栏按名字选择对象按钮,在弹出的对话框中会出现这个盒子的名字“Box01”和球体的名字“Sphere01”,这是默认的名字。

box length:100 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 100 height:2 这行内部代码。

构造器由两部分组成,基类名和创建参数。整个构造器就是一个函数调用 ,函数名 box就是基类的名字。创建参数由参数名后跟一个 冒号 : 和参数值组成。


如果调用函数没有输入任何参数,那么必须在类名后加上一对英文 ( )括号,例如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",现在打开修改器面板 。


再把名字改回来,输入:
$球体01.name="sphere01"
注意双引号不能忘掉输入。

数组:数组是一些有序的元素的集合。每个元素可以是任何类型的值,并且所有的元素都可以单独的访问。一个数组可以有两种表现形式,第一种是:#(),这是一个空数组,数组定义必须用一个数目符号#和一对括号( )组成,括号里面是数组的元素名,元素可以为一到多个,多个元素之间用逗号分开,例如,#(1,“hello”,3.14159)。想要初始化数组中的元素的时候数组有适当的形式,每一个元素的值可以是数值,一个表达式(例如、30*2),或者是一个字符串(例如,“hello”),元素的名称是不能有同名,而且元素的数目没有限制。关于数组的具体操作,以后的例子中会涉及,这里只作个简单的介绍。输入命令 #(100,"hello",pi) ,MAXScript返回 #(100, "hello", 3.14159)。

那么我们怎么可以获取更多的创建参数呢?方法有两种:
其一是在创建面板中找到对应的创建参数名,创建好的对象也可以在修改器面板中找到创建参数。其二,根据属性来,因为创建参数实质就是根据对象的属性而定的,没有这个属性就不可能有这个创建参数。显示对象的属性的函数是 showProperties( ),输入 showProperties $box01 ,结果在脚本监听器窗口中返回以小数点开头属性名称,冒号后面是值的类型,现在不要管它。
细心的读者会发现,像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度。

像上面 move、 scale、rotate 等都是函数(Function),能够完成对象的特定功能,在MAXScript中被称为对象的方法(Methods)。函数和方法实质是一样的,属于对象特有的函数都称为方法。

凡是通过改变对象属性来变换的都是绝对值,通过对象的方法来变换的都是相对值。

4、复制对象

这个世界有辛辛苦苦的实干家,那么就有快快活活的投机者。现在我们也来个偷懒的做法,嘿嘿,不要认为是模仿啊。输入 copy $sphere01 pos:[30,30,12] name:"球体2":,结果在盒子的斜角处产生了一个新的名字为"球体2"球体。
copy也是对象的方法,它调用了另外一个函数作为参数,这个函数就是前面提到的构造器。把被调用的函数称为位置参数(Positional Arguments),把被调用的参数称为关键词参数(Keyword Arguments)。因为位置参数只能放在固定的位置上,所以称为位置参数,关键词参数是成对出现的,写法就像 “关键词:值”,和上面提到的创建参数一样,没什么区别。概念是真多,把人给搞晕了,其实搞通了不过是那么回事。关联和引用复制就是把copy分别替换为instance、reference。

5、其它方法:

select 选择对象、deselect 取消选择、delete 删除对象、hide 隐藏对象,unhide 取消隐藏、
freeze 冻结、 unfreeze 取消冻结。

示例:
select $Box01--选择Box01
deselect $Box01--取消选择Box01
delete $* --删除场景中所有对象

6、赋予材质
自从有了你,世界更美丽。给盒子铺上几块地砖,输入:
$box01.material=standardMaterial diffusemap:(tiles()) showInViewport:true

$box01.material是Box01的材质属性,材质也是一个对象,所以标准材质的构造器是
standardMaterial diffusemap:(tiles()) showInViewport:true
standardMaterial是标准材质类名称,关键词参数 diffusemap:(tiles()) 是材质的 diffusemap 贴图,其值tiles()是平铺贴图类型,showInViewport:true 表示是否在视窗中显示。其值是true或者false,true(真)表示显示,false(假)表示不显示。

这个材质并没有在材质编辑器24个球中出现,但点击获取材质按钮在场景选项中可以找到它。如果想把材质编辑器插槽中的材质球中的一个赋给Sphere01,输入
$sphere01.material=meditmaterials[1] --[1]表示第一个,[2]表示第二个
$sphere01.material.diffuse=yellow --设置diffuse的颜色为黄色
$sphere01.material.specularLevel=20 --设置高光级别为20

窍门:参数太多不易掌握,可选择主菜单中的宏记录Macro Recorder/Enable命令,然后手工在界面中操作,再观看宏记录,此时不禁心中窃笑,哈哈,MAXScript你想难倒我,没门!

关于材质方面的知识太多,不是一时所能掌握的,在此只作过初步了解吧。

7、修改对象
addmodifier $box01 (bend())
$box01.widthsegs=10m
$box01.bend.benddir=0
$box01.bend.bendaxis=0
$box01.bend.angle=-180

像对象的修改器、空间变形等属性,并非对象所固有的,而是后来通过另外的对象附加上去的属性,MAXScript中把它称为动态属性(dynamic properties)

8、定义自己的脚本
上面输入的脚本可以保存下来,以备以后再使用。选择脚本编辑器菜单中的 File/Save 命令,保存到指定的文件夹中,等以后要用时选择File/Open 命令可以进行编辑,也可以选择File/Run命令运行脚本。
原文地址:https://www.cnblogs.com/superjn/p/6179429.html