前几节,我们学习了一些程序基础知识,这节开始学习maxscript实际操作,其实maxscript没有那么神秘,有时候就像说话一样简单,而且max还告诉你该怎样通过脚本控制一些节点,这就是下面要讲的Macro Recorder宏记录器。
Macro Recorder宏录制器
打开max——Maxscript侦听器,菜单——宏录制器——勾选启用。
至此打开了宏录制器。
现在在max视口,随意创意并删除一些物体,如box,看看Maxscript侦听器上部红色区域有什么变化。
是的,上部会出现一行代码:
Box lengthsegs:1 widthsegs:1 heightsegs:1 length:36.3086 width:40.8638 height:19.9143 mapcoords:on pos:[-4.65715,8.82604,0] isSelected:on
这个代码就是创建一个box的代码。macro recorder宏录制器的功能就是把我们的鼠标和键盘操作转化为脚本并记录下来,但是有些操作macro recorder是无法记录的,有时也会给你错误的信息,并且像上面的例子一样,它生成的代码包含一些不必要的默认参数,因此就不要完全依赖它,我们要学会合理的利用这个工具。
那么创建一个简单的box,代码应该如何写呢?
box()
这样,在世界坐标正中心就创建了一个box,长宽高段数均为1,长度也者相同。那么,我要想控制它的参数怎么办呢?下面就要用到点语法"."
. 点语法 我们都知道小数里面要用到".",而maxscript里面它还有个作用就是属性控制。点右边的参数即为点左边的一个属性,这样可以很方便的调用一个节点属性,可以多次使用"."调用里层的属性。现在,首先确保Macro Recorder宏记录器已经启用,然后鼠标选择一下刚刚创建的box,然后在Maxscript侦听器上部红色区域输入如下代码:
$box001.length = 30
$.heightsegs = 2
$.widthsegs = 3
$.lengthsegs = 5
会得到一个带指定属性的box
这就是对应的属性,用脚本控制的参数。上面的代码里面,出现了一个符号,美元符号"$",这是Maxscript里常用的符号,单独出现表示当前选择的物体,$.height表示当前选择的物体box的height高度值,$.height也是一个数值,你可以调用它,也可以给它赋值,比如执行下面的代码:
$.width = 50
$.height = $.width
执行后就是把物体的宽度值赋给了高度width,就使得box的高度和宽度一样。
如果执行$.length = $.width = $.height = 50,那么就是一个正方体,长宽高均为50。
现在不管你调整Maxscript侦听器或者max面板内的属性数值,你会发现两边的数值均会相应改变。
show(showproperties)
Maxscript提供给我们查看节点属性的方法,语法:showproperties <maxwrapper_object>,show是showproperties的缩写,一样用。下面我们执行如下代码:
b = box() --box()只是一个函数没有属性,赋值之后就产生了一个Node(节点)
show b
得到如下结果:
刚才b = box()语句产生了一个box,并且把这个box赋给了b,所以可以用b来控制这个box的所有属性。如:
b.width = 120
b.mapcoords = on
b.name = "mybox"
上面最后一句是将物体b的名称改为"mybox",b.name可以获取b的名称,也可以设置b的名称。
下面再来看看"$"符号。
当"$"单独出现的时候,它只表示当前选择的物体,在我们只选择一个物体的时候,这个非常好用,你可以用"$.发生"来控制选择的物体,如现在创建一个sphere并单独选中,用show $命令就是显示这个 sphere的控制参数,然后可以通过$.radius控制它的半径。如果没选中物体能不能控制物体呢?能。
用"$物体名称”即是对此名称物体的调用,如我刚才创建一个 sphere,名字叫sphere01,那么$sphere01.radius = 20就是将此物体半径调为20。不管你有没有选择此物体。
move rotate scale...
对物体进行移动,旋转,缩放操作,宏记录如下:
move $ [61.5104,0,0]
macros.run "Tools" "Rotate"
rotate $ (angleaxis 86.3858 [1,0,0])
macros.run "Tools" "Scale"
scale $ [1.93848,1.93848,1.93848]
macros.run "Tools" "Move"
移动和缩放都用到了一个数值类型point3
point3 3维向量,它定义了3d空间中的一个点。表示形式是[数值,数值,数值],如[0,0,0]就表示坐标中心,[0,10,10]就表示x轴为0,y轴为10,z轴为10的一个点。
move 上面的移动和缩放都是相对操作,移动是相对以前坐标移动多少,后面的三维数值就是在x,y,z轴上各移动多少。
--Absolute Mode Transform Type-in
如果想调绝对坐标值怎么办?选择绝对变换指定。
现在如果移动,就变成了如下代码
macros.run "Tools" "Move"
select $Box003
$.pos = [70.6892,0,0]
如果你选择了很多物体,然后执行$.pos=[0,0,0],那么所有选择的物体都会回到坐标中心了。
如何单独控制x,y,z轴呢?也很简单,$.pos.x=100就是把选择物体x轴移到100,y,z轴同理。
scale
试下试行这一句:$.scale = [0.5,0.5,0.5],scale后面的数值意思是分别在x,y,z轴缩放0.5倍,也就是缩小一半;如果是$.scale = [2,2,2],则是缩放2倍。其他同理。
rotate
旋转语法1:rotate <node> <angle> <axis_point3>具体实例:
rotate $(angleaxis 30[0,0,1] --将选择物体在Z轴旋转30度
旋转语法2:rotate <node> <eulerangles>具体实例:
rotate $ (eulerangles 0 0 30)也是将选择物体在Z轴旋转30度,那这两个有什么不同呢?
主要是两个数值类型的不同,这里大概讲一下。
maxscript提供3种旋转算法,上面讲了两种,还有一种是rotate <node> <quat>,这里的不同之处,就是旋转的角度表示方法不同,这3个表示方法分别是:
angleaxis
语法:angleaxis <degrees_float> <axis_point3>
<degrees_float>是角度,<axis_point3>是方向向量。
如:angleaxis 30[0,0,1]表示Z轴相对30度,用到旋转上就是Z轴正向旋转30度,同理,rotate $(angleaxis 30[0,0,1])则是Z轴负方向旋转30度。
eulerangles
语法:eulerangles <x_degrees> <y_degrees> <z_degrees>这个好理解,分别定义x,y,z的角度。
如:eulerangles 30 30 0表示x轴30度,y轴30度,z轴0度。
quat比较复杂,这里暂不深入。
————————本节完————————
|