3dsmax室内设计教程
第一篇:3dsmax室内设计教程
3dsMax制作精致室内场景教程
教程简介:
在这个教程中我将要告诉你怎么在3ds Max中制作室内场景,并且用VRay来渲染它,当然你也可以用别的软件,此教程由软件自学网首发,但是你的效果不会和图中的一样。这个教程非常详细,因此初学者不必担心学不会这个教程。这个教程对熟悉3ds Max的基本工具和界面还是很有帮助的,享受我们的3d吧! 下面教程开始 首先看下效果图。
效果图
第一部分:模型 第二部分:合成 第三部分:贴图材质 第四部分:灯光 第五部分:渲染
创建一个长8米、宽5米的面,并且他的方向的段数也为8和5,转变为Poly,并且拉伸,天花板大约2.65米高。创建边>快速切边,拉伸>拉伸边,焊接点>塌陷。不过要切记用正确的合理的单位,在这个场景中我们用的是1unit=1cm。(图01)
图01 创建窗框。首先把一个盒子放到窗户洞中,段数为3/4,移动点得到窗框,通过移动边得到新的盒子,记得要把点给塌陷。在左边的图中我给出了两个制作窗户的方法。(图02)
图02
给窗框应用MeshSmooth,设置类型:Classic,重复值为2,强度0.2,为了使线框能够在正确的位置,我们先建立一个额外的边。(图03)
图03 复制门框到第二个窗户和阳台的门,移动点来适合门的尺寸,然后从一个Box开始创建拉手,此教程由软件自学网首发,并且应用MeshSmooth。不要忘记了窗户台。(图04)
图04 创建阳台的栏杆是很简单,不过是很费时的事情。阳台的栏杆是通过将一个Box给他一个小的MeshSmooth(0.04)得到的。然后把他们Attach,接着仅仅给上面和下面的栏杆一个MeshSmooth。(图05)
图05 建立一个简单的室内装饰品,简单的书架是由Box得到的。(105 x 210 x 60)。(图06)
图06 然后再制作一个简单的橱柜,桌面是由玻璃制作成的。尺寸如图。(图07)
图07 椅子的制作,先制作4个垂直的桌腿,拉伸上面的Poly,并且连接他们得到一个椅子面。为了制作靠背,我们可以拉伸Poly,然后选择面给他们一个Bend修改器,角度:10-20。然后右键点Bend修改器,选择塌陷所有的,现在靠背有了,但是他与剩余的部分不能正确的连接,你必须向右旋转来与基座配合好。坐垫是由一个简单的4×4×4的Box然后利用MeshSmooth得到的。(图08)
图08
窗帘的创建,用两个基本相似的Nurbs曲线。把一个移动到窗户的顶端,另外一个到窗户底端,此教程由软件自学网首发,把他们Attach,然后利用Blend工具连接两个形状得到我们的窗帘部分。(图09)
图09 我们的场景应该象这样,你可以用窗户的檐口来装饰。(图10)
图10 创建暖气,我用6个Box加了很小的MeshSmooth,为了保证他们距离相等我用了Array工具。(图11)
图11 最后一步给我们的房间加点生物,有生命力的东西。第一利用线工具创建叶子的形状。( Create>Shapes>Splines>Line ),就象我们屏幕中画的一样。然后把线的点增加到16。给他拉伸0.2,并且把他的段数设置为2。
然后给他增加Bend修改器,这个可以按照你的想法给他一个合适的数值。 接下来可以把所有的修改器塌陷并且转变为Poly。
移动植物的轴心点到它的基点,这个就是植物的中心。给植物取个名字(例如:leaf01),然后按住Shift按键,旋转叶子几次并且用不同的比例放大缩小使植物更自然。(图13)
图13 花盆的创建,用线创建它的侧面,然后用Lathe修改器,把它的设为Align Max,然后把段数设置为48,转为poly。(图14)
图14 我们将要在这一部分建一些房间的装饰品,只要你想到的就可以建。书,书架,灯,墙的颜色等。
灯的创建,3个盒子一个细的圆柱体来做灯带。(图15)
图15 制作Bowl。首先创建10×10×1的盒子,给各个不同的光滑组设置不同的光滑。重要的是角的尖锐性。然后利用Softselectttion来移动点。利用MeshSmooth=2的重复值给不同的光滑组就可以得到尖锐的角。(图16)
图16 相框和墙框的制作,不要忘记了光滑组的问题。墙框就是一个简单的盒子加上一个移动点。给中间的面(放置相片或者油漆的)设置他的ID=2,给其他的面ID=1,此教程由软件自学网首发,这个很重要因为我们在后面的材质中用的是多维材质。(图17)
图17 桌布的制作是由一个盒子通过拉伸折叠边缘的Poly得到。(图18)
图18
在书架上放几本书,不要忘记给窗户按上玻璃。(图19)
图19
在这部分当中你将要学习到如何利用材质和创建VRay材质。切记,想要在编辑器中看到VRay材质的效果,你必须选择当前的渲染器为VRay。
首先我们必须把房间的模型建立完成,创建天花和别的墙。记得Polys也必须从外边开始。如果你不那样做的话,光将会穿过房顶,房间的照明将被破坏。(图20)
图20
设置墙和地板的材质,选择所有的墙和地板的面,设置他们的ID=1,设置只有墙的为2,其余的要绿色或者别的颜色的为3。(图21)
图21
打开材质编辑器,选择一个球,选择多维材质,去掉原来的材质。设置数字为3。
图22)
(
图22
选择1,并且选择VRaymat格式的材质,你就可以看到VRay材质的格式了,在它的顶端你可以看到一个按钮(红色的1的位置),通过这个按钮我们可以给他一个贴图。如果想看贴图的效果点红色的2的位置,现在点3位置可以回到基本材质区。(图23)
图23 地板的材质是木头的,但是不反射任何的东西,设置反射颜色为RGB=
49、
49、49,此教程由软件自学网首发,或者把它的灰度直接设置为49,然后设置Glssiness到0.7,它是反射或者折射的强度值,它的数值为1.0时是最强的,更低的数值使得反射比较模糊。接着我们把漫反射的贴图复制到凹凸贴图槽中,并且设置数值为20。(图24)
图24
知道如何设置以后我只要告诉你数值,白墙:2
54、2
55、253;绿墙:16
9、20
5、107。这就是所有的墙和地板的材质。你可以看到大的材质贴图了。贴图太大了但是在下一步我将向你讲解如何把它变小。(图25)
图25
调整贴图的大小,我先要给它一个UVWmap修改器,选择Bitmap fit按钮选择一张贴图。现在选择Gizmo,重新设置他的大小。(图26)
图26
现在是给书架添加材质的时候了,仍然用VRaymat格式。选择贴图,反射15,Glossiness为0.65。把这个材质给书架。增加UVWmap修改器。选择Bitmap fit。为了书架的不同我们可以给每个不同的面一个UVWmap修改器。然后利用面选择修改器,选择另外的书架,同样的利用UVWmap。(图27)
图27
桌子材质:
Diffuse color:RGB ( 19
8、
219、207 );Reflect:20;Refract: 247
Fog color:RGB ( 1
44、
211、198 );Fog multiplier:0,02;Affect shadows, affect alpha
把这个材质给桌子的玻璃部分。(图28)
图28
现在给桌腿和架子创建材质。把这个材质给它并且加UVWmap修改器。(图29)
图29
椅子也是相同的材质并且利用贴图修改器,给垫子一个VRaymat材质,Color:RGB ( 2
54、2
48、230 )。垫子的贴图重复值为4。
桌布的材质,此教程由软件自学网首发,应用贴图坐标修改器。(图30)
图30
暖气的材质:(图31)
Color:RGB ( 2
42、2
42、242 )
Glossiness:0.95
Reflection:30
图31
灯的材质:
Color:RGB ( 2
47、2
47、47 )
Reflect : 20
Glossiness: 0.9
Bump: Noise ( amount 20 )
玻璃:
Color:RGB ( 2
47、2
47、247 )
Reflect:20
Refract:247
Affect shadows and alpha(图32)
图32
窗帘的材质。(图33)
图33 窗户玻璃材质:(图34)
Color:RGB ( 2
38、2
38、238 )
Reflect:10
Glossiness:0.9
图34
窗户台(图35)
图35
碗状物:(图36)
Colors:Diffuse(1
53、0、0)
Reflect:45
Refract (
216、10
6、106)
图36
植物的材质是SSS的。(图37)
图37
首先创建阳光:
设置:
Shadows:VRay
Multiplie:1.0
Check Area Shadows,subdivs=12。(图38)
图38 设置VRay灯,在窗户附近设置VRay灯,此教程由软件自学网首发,在近的房间有两个灯。
下图为渲染设置(图39)
图39 我希望这个教程对大家有帮助!后面是这个例子的几个渲染图!(图40、图41)
图40
图41
第二篇:3dsmax教程
中文名: 3dsmax2010中文版从入门到精通
英文名: 3dsmax2010 Tutorial
别名: 3dsmax2010从入门到精通
资源格式: 压缩包
版本: avi视频教程
发行日期: 2010年10月12日
地区: 大陆
对白语言: 普通话
文字语言: 简体中文
简介:
3dsmax软件介绍
3dsmax自问世以来,凭借其强大的建模、材质、动画等功能和人性化的操作方式,被广泛应用于建筑、工业、影视、游戏、广告等领域,在行业中拥有庞大的用户群,受到国内外设计师和三维爱好者的青睐。不管你想为游戏制作3D内容,为电视制作广播图形还是为电影制作视觉特效,3dsmax皆为你提供了一套全面的开箱即可使用的业界标准3D工具,使你能够快速上手并突破创造力和效率的极限。
的材质 41.测试渲染准备 42.应用全局光照引擎计算贴图 43.照明场景 44.最终渲染 avi 45.制作随波逐流的船 46.制作波浪动画 47.模拟灯塔的照明 48.为灯塔制作动画 49.制作雨的下落 50.创建雨的反弹 51.调整动画时间 52.渲染视频文件
第三篇:3dsMax纸风车建模教程
1.创建一个上下面为正方形的长方体,参数:长100,宽100,高40;长度分段2,宽度分段2,高度分段1.
2.转化为“可编辑多边形”,删除底面。
3.在“顶点”子层级,使用“切割”命令,在顶面上增加新的边。
4.应用“对称”修改器(上下方向镜像),重新将模型闭合。
5.再次把模型转化为“可编辑多边形”,并切换到“多边形”子层级,分三次删除模型上的部分面。
6.切换到“边”子层级,使用“桥”命令,创建一些新的面。
【创建第一个侧面】
【四个侧面都创建完成】
7.应用“涡轮平滑”修改器,设置合适的迭代次数。
【完成的风车叶】
8.用二维的“星形”挤出厚度,再创建一个“圆柱体”,做成风车的轴。
9.Ok!完成的模型。
【完成】
第四篇:3dsmax-script初级教程
3D脚本 maxscript入门教程
maxscript入门教程(1)作者:mediastime 原创来源:内容图文并茂,语言高度概括,文采形象生动,思路清晰可见;
指出要害,抓住关键,透彻理解那些难懂的编程概念;
不用担心数学基础很差,无需害怕英文单词不懂,只需初中数学知识,把英文单词作图形符号看待,拿脚本编程当文字游戏把玩。
能够提高解决问题的能力,可以降低学习脚本的门槛。
不用费力看英文帮助,何需辛苦找编程资料,减轻学习负担,节省宝贵时间!
发挥自己的聪明才智,运用科学的学习方法,首先认真学好入门教程,然后虚心请教各位高手,
脚本编程从此不再难!
入门教程内容结构
本教程内容分为五个部分,用几个具体的例子讲解大多数的脚本操作和语法知识。
一、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所示。
也可右击用户界面左下方的Mini-Listener(迷你监听器)打开脚本监听器窗口,如图1-3所示。
脚本监听器窗口是一个命令编辑和执行窗口,它由两部分组成,上半部分为宏记录窗口,下半部分为脚本运行结果输出窗口。如图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所示。
按住鼠标左键不放,把选择的一行或者多行程序拖到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.0
2、0.68。当MAXScript执行数字操作时返回和运算参数相同的类型。例如4+5返回
9、而4.0+5.0返回9.0。
字符串:字符串是一个常量,需用引号标识。输入"Hello",MAXScript返回"Hello"。如果输入时没有加引号则返回undefined未定义。改变Sphere01的名字,输入$Sphere01.name="球体01",现在打开修改器面板 ,可以看到如图2-3所示的样子。
图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所示。三者之间的关系 如图2-4所示。
图2-4
细心的读者会发现,像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) 命令,来了个侧翻身,结果如图2-5所示。 图2-5
(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"球体。 如图2-6所示。 图2-6
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 结果如图2-7所示 图2-7
$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 结果如图2-8所示 图2-8
窍门:参数太多不易掌握,可选择主菜单中的宏记录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命令运行脚本。
欲知更多精彩,且看下回分解。
三、创建和操作具有复杂关系的对象 常量;
变量,变量和属性的关系;
运算符和表达式;表达式:求值的规则,输入的每一行代码都是表达式,因为它总是返回一个值。
对象引用:有的书叫双词模式(引用另外一个对象的属性值作为自己的值。); 数组和集合等:数组(一个系列的数据组合),数组和变量的关系;
流程控制:选择和循环,条件选择。
闻着春天里散发出来的花香味,忍不住去欣赏那些美丽的花朵,它们被一些长得井然有序的绿叶衬托着;穿过长着杂乱小草的林间小道,惊动了树上正在戏耍的鸟儿,它们飞向两旁看似有序又无序的青松翠竹林中,瞬间不见了踪影;走在马路上,两旁定有一排排梧桐或扬柳,如果你的眼力好的话,发现树的皮肤上有好多忙忙碌碌的蚂蚁;白天工作了一天,夜晚来到一个幽静的小河边,抬头望着满天繁星,低头看着水中的倒影,心情好多了,不禁思潮起伏。
不管是四时花草树木,八方飞鸟走兽,无论是静止着的、运动着的,哪怕是无序的事物,都存在有一定的内在关系。那么到底是怎么样一个内在关系呢?要有具体的内容啊!
最简单最常见的是对称关系,例如昆虫的翅膀,羊头上的角;还有直线关系,例如路边两边的树;最没规律的关系是那些运动着的和杂乱无章的事物,例如飞动着的鸟儿,忙碌着的蚂蚁,水中冒出的气泡,就把它们称为随机关系吧;既没有规律又很杂乱的关系是噪音关系,蝴蝶翩翩起舞的轨迹,杂乱的野草的分布状态;最美丽的关系是那些按一定的曲线而存在的事物,例如波澜起伏的水面,它是正弦波或者正弦波的叠加关系,小朋友向天空方向扔出的石块的运动轨迹,就是一条抛物线;还有起伏不平的崇山峻岭、狐狸摇动着的尾巴,曲折前进的蛇类等等无不存在着某种关系。
既然能找出这些事物的内在关系,能否用MAXScript来再现这种关系呢?答案就是一个字:能!
1、常量和变量
要实现复杂的程序,首先要掌握数据的表现方法,在脚本中用常量和变量来表现。现实生活中有些事物是相对固定的,有些则是经常变化的。就拿人来说吧,人的性别是不变的,年龄是每过一年就增加一岁;拿我们用的电脑硬盘来说,总容量是不变的,但可用磁盘空间经常是变化的。在MAXScript中,把那些不能改变的量称为常量(Literal Constants,字面常量,简称常量),可以变化的量称为变量(Variables)。
例如15,“Hello”等,从字面上一看就知道这些值是不能改变的,所以把常量又叫做字面常量,用age来年龄,而这个age是在变化的,所以age是变量。那么别人问李四的age是多少,去年问的时候李四也许回答是21岁,今年有人问李四,当然就是回答是22岁了。如果他回答age,那别人就不知道他的年龄了,他必须说出具体的数字出来。age是变量名,22岁是变量值。那么在MAXScript中该怎么表示?那就是给变量赋值,等于号是赋值符号,输入 age=22 ,脚本监听器中返回22,又如李四的银行存款 , 建行的是20000元,输入 money1=20000 , 工行的是36000,输入 money2=36000,请问用money表示李四这两个银行存款的总和,程序代码应该怎么写?没学过编程的人也许可能输入money=56000,呵呵,这个也没有什么错,不过输入money= money1+ money2,结果如何?一分钱也少不了,照样返回56000,程序自己完成了加法计算,减轻了我们大脑的负担。
变量就像一个容器,可以存储不同类型的数据。数目,字符串,数组,对象都可以存放在变量中。
现在就来详细解说变量。在程序运行期间,系统会在内存中为程序分配一块内存单元,用来存储各种不同类型的数据。而想访问这个内存单元,就要使用一个标识符来标识它,就像你到单位去找一个人一样,先要告诉这个人的名字。这个标识符就是变量名,内存单元中装载的数据就是变量值。程序可以通过变量名来读取数据。把数据放到内存中就是为变量赋值,=是赋值符号。我们把上面的写在一块,如下: money1=20000 money2=36000 money= money1+ money2 当程序运行第一句代码时,分配一块内存,用money1作为这块内存的变量名,然后把2000装入这块内存中作为变量的值,第二句同上,运行到第三句时,分配一块内存,取名为money,程序取出money1和 money2中的数据让它们相加 ,把相加的结果56000装入名为money的内存单元中。
现在回忆一下以前是如何改变对象属性的。例如前面提到改变box01的长度,语法是 $Box01.length=20,这和给变量赋值的语法是一样的。从这里可以看出,对象的属性实质上也是一个变量,只因为是对象特有的变量,就称为属性了,访问变量直接用变量名,访问属性要在属性名前加上对象名,中间用一个小数点隔开,称为点语法,这就是变量和属性的关系。既然可以把一个变量分配给另外一个变量,就可以把一个对象的属性分配给一个变量,也可以把一个变量分配给一个对象的属性,还可以把一个对象的属性分配给另外一个对象的属性,有的人把它称为双词模式。有的人会想,现在到了这一步,索性来个一不做二不休,把整个对象分配给一个变量,以后访问时更加方便,这也是允许的。举例如下: height=50 myBox=box length:20 width:20 height:height zPos=mybox.height+10 mySphere=sphere radius:10 pos:[0,0,zPos]
结果如图3-1所示 图3-1
--第二句中height:height是把变量height分配给这个box的height属性,第三句是算出Z轴的坐标,准备分配给后面要产生的球体的Z轴坐标,第四句pos:[0,0,zPos] 是把变量zPos的值分配给球体的Z轴。
注:鉴于要有一定基础,变量的作用范围(即全局变量和局部变量)和增量放在第五部分了。
2、数组和集合 数组(array),是一系列有序数据的集合,每一个数据就是一个元素,它有两种表现形式: #( 表达式 1 , 表达式2 „„ ) #( ) --空数组
例如把常量15,16.2,80这几个数据放在一起,就可以用数组存放: #(15,16.2,80)
把变量放到数组中: x=10 y=20 z=30 #(x,y,z)--返回#(10, 20, 30)
把数组分配给一个变量 : arr=#(x,y,z)--返回#(10, 20, 30)
访问数组元素:
arr[2]--第二个元素,返回20
改变数组元素的值: arr[1]=236 arr--再次访问数组时,其内部元素的值已经改变了,返回#(236, 20, 30)
选择集(selectionSet)
这个对应于手工在场景中命名的选择集,也可以用脚本命名选择集。
先创建几个对象,输入: b01=box pos:[-50,-50,0] b02=box pos:[50,-50,0] sp01=sphere pos:[0,0,0] sp02=sphere pos:[50,50,0] sp03=sphere pos:[50,50,0]
下面的代码创建一个名字为"盒子集"的选择集,它包含有刚才创建的两个box: selectionSets["盒子集"]=$box* 下面的代码创建一个名字为"球体集"的选择集,它包含有刚才创建的两个sphere: selectionSets["球体集"]=$sphere* 在工具栏中点击命名选择集按钮,可以看到刚才创建的选择集,如图3-2所示。 图3-2
输入selectionSets["盒子集"][1],访问第一个元素,结果返回: $Box:Box01 @ [-50.000000,-50.000000,0.000000] 输入move selectionSets["球体集"] [0,20,0],整个“球体集”向Y轴移动了20。 集合(collections)
在使用MAXScript 时有许多值都是一系列的集合,很明显的有数组、 通配符路径名选择集,内置对象集。集合不用你特意去指定,它是系统自动完成的。例如我们现在用下面的代码创建一些对象: box()
box pos:[60,0,0] box pos:[-60,0,0] sphere pos:[0,70,0]
omnilight pos:[0,-100,150] circle()
既然是自动完成的,那我们就直接访问了。访问场景中的对象可以使用路径名,前面讲过用路径名,访问单个对象用美元符号$加上对象的名字就可以了,但如果要把刚才创建的三个box一起向Y轴移动100,应该怎么办呢?使用带有通配符的路径名: $box*.pos.y=100 $box* 表示场景中所有以box开头的对象,*表示任意个字符。
如果把那三个box和一个球体一起操作呢?它们都是内置几何体对象集: select geometry --选择所有的几何 体
geometry.pos=[0,0,0]-把所有的几何体移动到时原点
选择所有的对象,下面提供有两种方式: select $* --以路径名的方式选择所有的对象
select objects --以内置对象集的方式选择所有的对象
下面把内置对象集列出,以供参考:
对象集 (ObjectSet)
对象集是描述主场景对象种类的。
objects -- 全部对象
geometry -- 标准的 3ds Max 分类(categorie)
lights--灯光
cameras--摄像机
helpers--帮助物体
shapes--二维形状 systems--系统对象
spacewarps--空间扭曲
selection -- 当前选择的对象
集合的属性
接着上面的内容进行操作。
输入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)等集合
变量、数组和集合之间的关系
从数组、对象集、路径名、选择集等之间的定义可以知道,它们都是存放的数据,这些数据类型可以是数目,字符串,也可以是对象,这和变量是一样的用途,这么说来,它们的实质是变量的集合,因此把它们统称为集合(collections)。集合中的每一个元素都是一个变量,所以访问集合中的元素可以像访问数组中的元素一样来访问,对于数组中的每一个元素可以像对待变量一样。输入: Box() Sphere()
然后选择它们,再输入: selection[1] 监听器窗口中会返回第一个元素的路径名和位置。
3、表达式
要得到想要的值,就要对数据进行计算,计算规则不同,其结果也就不一样。例如2和3两个数据,按减法规则来计算,结果是-1,按加法来计算,结果是5。像这种按某种计算规则来求值的公式,MAXScript把它称为表达式(expressions,简写为expr),表达式是一种求值的规则。从语法的角度来看,用操作符把操作对象连接起来的式子称为表达式,有的编程语言也叫语句 (statements) ,意思一样。我们以前在学校里学的加减乘除四则运算也可以看作是最简单的表达式了,也就是说我们没有编程之前就会使用表达式了。前面提到的常量,变量,数组 ,构造器,函数以及输入的任何一句代码,都是表达式,因为总会返回一个值。 MAXScript有大多数编程语言常见的表达式,例如数学表达式(Math Expressions),比较表达式(comparison expressions ),逻辑表达式(Logical expressions ),以及MAXScript特有的关联表达式(Context expressions ),后面的教程会涉及。下面是有效的表达式: x=1 y=2*3+5 print y --输出y的值到屏幕上
上面的代码可以写成一块,这就是块表达式(block-expression): ( x=1 y=2*3+5 print y )
还可以把这三行代码写成一行,用分号;把它们分开: ( x=1; y=2*3+5; print y )
几个常用的表达式
比较表达式(Comparison Expressions)
比较表达式总是返回两个布尔值中的一个,true 和 flase ,true(真)表示条件成立,flase(假)表示条件不成立。这个表达式特别有用,很多情况下都会用到,常常和 if „„then „„结合使用。比较表达式在小学数学中就有了,就是那些大于,等于,小于号连接起来的式子,有一点要注意,那就是等于号要用两个=表示,一个是表示赋值符号。示例如下: 10= =10 --条件成立,返回 true
11= =10 --条件不能成立,返回 flase 11!= 10 --条件成立,返回 true 11>= 10 --条件成立,返回 true 11<= 10 --条件成立,返回 true
x=8 y=36 x>y--条件不能成立,返回 flase
逻辑表达式(Logical Expressions)
逻辑表达式有or、and 和 not 三种,同比较表达式一样返回一个布尔值 true 和 flase之一,它是对比较表达式的进一步组合计算,也就是说对true和flase的重新组合,得到一个新的布尔值。
or(或),只要两者有一个成立,那么整个都成立,例如在中国发现了外星人或者在美国发现了外星人,只要有谁发现了一个,那么就说明这个宇宙上还有另外的生命。示例: x=8 y=36 x= =8 or y= =8 --有一个成立,返回 true
and(与),两者要同时成立,才能整个成立,否则都不能成立。真是有福同享,有难同当的患难之交啊,一损俱损,一荣俱荣,关系密切。从中也可以看出些人生道理出来,那就是两个人合伙做事一定要同心协力,任何一个怀有异心,就办不成事。示例: x=8 y=36 x= =8 and y= =8 --有一个成立,另一个不成立,返回 flase x= =8 and y= =36 --两者同时成立,返回 true
not(非),对立派,总是唱反调,你要上山,它就要下水,你说是对的,它偏要说是错的。示例: a=13 a>10 -- 返回 true
not a>10 -- 因为a>10 是true,所以not a>10返回 flase
4、流程控制
通过以前的学习,我们知道使用构造器来创建单个的对象,现在就来大量创建对象,轻松地完成手工要费很大的力气才能完成的事。
for 循环
输入 :
for i in 1 to 4 do box pos:[i*50,0,0] 看看下面的flash动画可以形象的理解for循环。 for循环动画
if 条件
x=20 y=65 if x>y then print x else print "x没有y大"
--第三句的中文意思是:如果 x 大于 y 那么 打印 x 否则 打印 "x没有y大" ,结果返回 "x没有y大"。继续输入: x=70 if x>y then print x else print "x没有y大" --结果返回70
综合使用
fc=freecamera pos:[-100,0,0] rotate fc (EulerAngles 90 0 -90) move fc [-100,0,0] for i in 1 to 6 do sphere pos:[i*30,0,0] segments:16 radius:10
输入上面代码,生成场景对象备用 ,结果如图3-3所示 。
图3-3 现在根据物体离摄影机的距离调整物体的分段数,摄影机在X轴-100位置上,离它最近的一个球体在X轴30的位置上。测量两个对象之间距离的函数是distance,输入:distance fc $sphere01 返回130.0,说明摄影机和左边的第一个球体之间的距离是130。输入: for i in $sphere* do
if distance fc i>160 then i.segs=4 距离摄影机大于160的球体分段数精简到4,结果如图3-4所示 。 图3-4
输入:
for i in $sphere* do ( 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所示 。 图3-5
4、动画原理
设置两个不同的关键帧就可以动画了。输入下面的代码创建球体没X轴的运动的动画: s=Sphere pos:[-50,0,0] radius:10 animate on ( at time 0 s.pos.x=-50 at time 100 s.pos.x=50 )
代码与界面的对应关系如图3-6所示。
图3-6
四、换一角度——从大家熟悉的操作流程来学习脚本 这是对前面知识的总结,前面是对语法基本概念的学习,现在是从大家操作流程的角度来学习,一纵一横,让我们对脚本有个相对全面的了解,理论和实际相互联系。 有了前面的基础才好学下面的内容。 第一步:创建物体
创建目标摄影机
方法见示例栏目中《地面和树-混合材质的用法》一文 第二步:选择物体
这里说的是广义上的选择,即操作指定的对象。以前要改变场景中的对象,首先要选择这个对象。在MAXScript中可以在对象没有被选中的情况下改变对象。这要综合运用前面讲到的路径名,选择集,内置对象集,流程控件等等。
遍历选择集
先随便创建几个对象,然后选择它们,例如输入: box() box() sphere() cylinder() sphere() 结果如图4-1所示。 图4-1
先用手工把它们全部选择,此时这些被选择的对象被称为选择(selection),这是对象集之一。输入下面的代码进行遍历选择的第一个对象,把它们的名字显示出来: for i in selection do print i.name 返回结果如下: "Box02" "Cylinder01" "Box01" "Sphere02" "Sphere01" 输入 selection.count,结果返回5,说明选择的总数是5个。
输入 selection[1],结果返回$Box:Box02 @ [0.000000,0.000000,0.000000],说明第一个元素是Box02。
这和前面的for循环有什么区别?前面的是for i in 1 to 4 do box pos:[i*50,0,0] , 变量i的范围在1到4,这里是对象集合selection,集合已经存在变量的范围了,这个变量 i 就是那些对象本身,遍历的次数就是选择的总数5,当第一次循环时,程序就找到选择集中的第一个元素Box02,相当于 selection[1],其它以此类推。下面的代码进行更复杂的操作,把它们沿X轴间隔为40个单位进行分开:
for i in 1 to selection.count do selection.pos.x=selection.pos.x+i*40 结果如图4-2所示。 图4-2
这里的i是数目,selection是元素,是元素的索引,根据 i 的值指向对应的元素,在这里是指向那五个对象之一。
根据指定条件选择 继续使用上面创建的对象。
示例1:根据对象是否具备某种属性来选择
for i in geometry where hasProperty i "radius" do i.pos=10 在创建的几何体中把具有半径属性的物体选择出来,并改变半径大小。结果那两个球体和一个圆柱体的半径变成10。where是表示指定的条件, hasProperty i "radius" 是条件,用来判断对象 i 是否具有 radius 属性,返回true或者false。
示例2:根据对象是否符合指定类来选择
for i in Geometry where classOf i = = box do i.pos = i.pos+[0,30,0] 两个box在原来位置向Y轴移动30,结果如图4-3所示。 图4-3
示例3:根据对象的属性值是否符合指定值来选择
for i in Geometry where i.pos.y ==0 do i.pos = i.pos+[0,30,0] Y轴坐标为0的对象都向Y轴移动了30,结果如图4-4所示。 图4-4
第三步:变换物体
1、变换方法:postion,move,scale,rotate,前面已经讲过。
2、变换坐标系和变换中心
变换坐标系统:coordsys关联表达式
[ in ] coordsys world 使用世界空间坐标系统
[ in ] coordsys local 使用对象自身的坐标系统
[ in ] coordsys parent 使用对象的父坐标系统
[ in ] coordsys grid 使用网格坐标系统
[ in ] coordsys screen 使用屏幕坐标系统
[ in ] coordsys 使用指定的节点对象坐标系统,相当于在界面中以拾取的对象作为坐标系统
变换中心: about关联表达式
about selection 以选择集为变换中心
about pivot 以对象的基准点为变换中心
about coordsys 以当前使用的坐标系统的原点为变换中心
about 以拾取的节点对象的基准点为变换中心
示例一:基本功
先创建两个对象作为示例物体: cy=cylinder() b=box length:10 width:50 pos:[100,0,0]
结果图4-5所示 图4-5
然后分别执行下面的代码: rotate b (EulerAngles 0 0 90) --box旋转了自身90度,如图4-6所示。 图4-6
in coordsys world rotate b (EulerAngles 0 0 90) --box旋转了自身90度,和上面相同,这是因为变换中心默认是使用对象自身的基准点。
in coordsys world about coordsys rotate b (EulerAngles 0 0 45) --围绕世界坐标系旋转了45度,变换中心是世界坐标系中心,如图4-7所示。 图4-7
in coordsys cy about coordsys rotate b (EulerAngles 0 0 90) --变换坐标系是圆柱体cy,b以圆柱体cy坐标系原点为变换中心旋转了90度,如图4-8所示。 图4-8
示例二:小应用--一张桌子四条凳
zhuozi=cylinder radius:80 height:60 wirecolor:white for i in 1 to 4 do ( dengzi=box length:50 height:40 pos:[100,0,0] wirecolor:white in coordsys zhuozi about coordsys rotate dengzi (EulerAngles 0 0 (90*i)) ) 结果如图4-9所示。 图4-9
我家就这么简陋,如果不嫌弃的话,欢迎到我家来作客啊,粗茶淡饭还是有招待的。
五、基本的语法知识
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。
--
Photoshop专家讲堂 VIP视频光盘销售中
回复 引用 TOP
呱唧 发短消息
加为好友
呱唧 当前离线
UID18268 帖子229 精华0 积分1976 阅读权限50 注册时间2006-2-2
支柱会员
金币270 枚 威望10 热心度0
6楼
发表于 2006-12-12 18:43 | 只看该作者
/* 这是伏羲先天八卦,乾1兑2离3震4巽5坎6艮7坤8 据易经:天地定位,山泽通气,雷风相薄相,水火不相射 */ --第一步
--创建数组为后面雕刻八卦用
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
for i in 1 to 8 do ( --把八卦文本分布到八个对应的位置上
atex=text font:"隶书" text:atext prefix:"txt" pos:[0,300,0] in coordsys world about coordsys rotate atex (eulerangles 0 0 (45*(i-1))) --创建八卦的卦爻 for j in 1 to 3 do ( r=180+j*30 --创建八卦的卦爻
badd=box pos:[0,r,0] length:16 width:120 height:30 lengthSegs:5 widthSegs:10 heightSegs:4 prefix:"badd" wirecolor:white
in coordsys world about coordsys rotate badd (eulerangles 0 0 (45*(i-1))) --创建给八卦的卦爻雕刻多余部分的雕刻刀。 if arr8[j] !=0 then(
bsub=box pos:[0,r,-2] length:22 width:30 height:34 lengthSegs:5 widthSegs:10 heightSegs:4 prefix:"bsub" wirecolor:white 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)) --为八卦文本加上倒角修改器,并分配材质 for i in $txt* do ( addmodifier i bev i.material=currentMaterialLibrary["Metal_Dark_Gold"] ) --雕刻卦爻并分配材质,然后光滑处理 $badd01-$bsub01 delete $bsub01 $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] addmodifier grass modi --创建树-- tree01=box length:0 width:15 height:20 pos:[50,-45,-0.5] material:meditmaterials[1] copy tree01 pos:[58,4,-0.5] copy tree01 pos:[58,62,-0.5] copy tree01 pos:[20,62,-0.5] copy tree01 pos:[12,4,-0.5] copy tree01 pos:[10,-45,-0.5]
--创建灯光-- 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] --把目标关联到摄影机 ca.target=tobj --把当前视图设置为目标摄影机视图 viewport.setCamera ca --设置材质-- 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]--地面材质使用材质编辑中第二个插槽中的材质
第五篇:3DSMAX建模制作欧式古典装饰花纹教程
教程使用了3DSMAX多边形建模制作古典欧式花边花纹,值得大家学习。一种花纹的做法,可以研究一下
1.用线画出图形的形状: