通过以前的学习,我们知道使用构造器来创建单个的对象,现在就来大量创建对象,轻松地完成手工要费很大的力气才能完成的事。
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
输入上面代码,生成场景对象备用 。
现在根据物体离摄影机的距离调整物体的分段数,摄影机在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。
输入:
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 。
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
)
四、换一角度——从大家熟悉的操作流程来学习脚本
这是对前面知识的总结,前面是对语法基本概念的学习,现在是从大家操作流程的角度来学习,一纵一横,让我们对脚本有个相对全面的了解,理论和实际相互联系。 有了前面的基础才好学下面的内容。
第一步:创建物体
创建目标摄影机
方法见示例栏目中《地面和树-混合材质的用法》一文
第二步:选择物体
这里说的是广义上的选择,即操作指定的对象。以前要改变场景中的对象,首先要选择这个对象。在MAXScript中可以在对象没有被选中的情况下改变对象。这要综合运用前面讲到的路径名,选择集,内置对象集,流程控件等等。
遍历选择集
先随便创建几个对象,然后选择它们,例如输入:
box()
box()
sphere()
cylinder()
sphere()
先用手工把它们全部选择,此时这些被选择的对象被称为选择(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
这里的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]
示例3:根据对象的属性值是否符合指定值来选择
for i in Geometry where i.pos.y ==0 do i.pos = i.pos+[0,30,0]
Y轴坐标为0的对象都向Y轴移动了30。
第三步:变换物体
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]
然后分别执行下面的代码:
rotate b (EulerAngles 0 0 90)
--box旋转了自身90度。
in coordsys world rotate b (EulerAngles 0 0 90)
--box旋转了自身90度,和上面相同,这是因为变换中心默认是使用对象自身的基准点。
in coordsys world about coordsys rotate b (EulerAngles 0 0 45)
--围绕世界坐标系旋转了45度,变换中心是世界坐标系中心。
in coordsys cy about coordsys rotate b (EulerAngles 0 0 90)
--变换坐标系是圆柱体cy,b以圆柱体cy坐标系原点为变换中心旋转了90度。
示例二:小应用--一张桌子四条凳
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))
)