最近在学习maxscript,记了一些笔记,分享给我的朋友们!
最近在自学maxscript,每天会整理一点点笔记,分享给大家!
使用时可以把全部内容整个拷贝到max的脚本文件中,然后逐行按小键盘上的回车,观察视窗运算即可。
双减号后面的中文不会影响运算,是我记录本条语句的中文含义。
愿大家和我一起成长。
——小亮老师
–脚本练习
box() –创建一个BOX
max select all –全选
show $ –显示选中物体的部分属性(只针对于未塌陷物体)
$.width = 100 –选中物体的属性等于多少
$.width += 100 –选中物体的属性加上多少
$.length -= 5 –选中物体的属性减去多少
$.height *= 5 –选中物体的属性乘以多少
$.height /= 2 –选中物体的属性除以多少
$box*.height = 100 –所有名称以BOX开头的物体某一属性改变(*号是通配符,替代其他的文字)
$box01.height = $sphere01.radius*5 –box01物体的高等于sphere01物体半径的5倍(等号后面可以是其他物体的属性值)
$Box01.height = $Box01.length = $Box01.width = 200 –box01物体的长宽高等于200
— 一些标识名
“float” –浮点数(允许带小数点)
“integer” –整数(多用于分段数、步数一类的数值)
“boolean” –on or off(开启还是关闭)false or true(真还是假对还是错)
“string” –字符串。格式”asdasd asdasd 9821 阿卡斯读卡”(用于为物体命名)
“point2” –二维坐标。格式[100,100]
“point3” –三维坐标。格式[100,100,100](用于为物体确定位置)
“color” –颜色。格式[color 0 0 255](颜色的数值范围在0-255之间,分R G B三种)
–常用脚本英文单词
“material” –材质的意思
show $box05.material –观察BOX05的材质数型
show $box01.material.\’diffuse color\’–观察BOX01物体材质的diffuse color的属性。(diffuse color 中间有空格,所以在两侧添加“\’”)
show $sphere01.material.glossiness — 观察sphere01物体材质的glossiness的属性。
$box*.material = meditmaterials[17] –将所有以BOX开头的物体赋予第17个材质球
$.material.\’diffuse color\’ = color 0 0 225 –将选中物体的材质diffuse color的颜色改为 color 0 0 255
— 一些个人练习
$Box01.height = $Box03.height=$Box05.height = $Box07.height=$Box09.height = $Box11.height=10 –单数box物体的高度为10
$box*.length = $box01.length — 所有以BOX开头的物体的宽度都等于box01的宽度
$Box*.isHidden = false –所有box开头的物体的隐藏属性是错误的(取消隐藏状态)
$Box*.isHidden = true –所有box开头的物体的隐藏属性是正确的
$Omni*.multiplier /= 2 –所有以omni开头的灯光的亮度除以2
–常用脚本英文单词
“move” –移动
“rotate” –旋转
“scale” –比例(缩放)
move $box04 [0,0,200] –将box04延Z轴移动200个单位(相对位移)
$box05.position = [0,0,500] –将box05放置在坐标[0,0,500]的位置上
move $box* [0,100,0] — 将所有以box开头的物体延X坐标移动100个单位
rotate $Box* (eulerAngles 90 90 0) –将所有的BOX开头的物体延x、y轴各旋转90度。格式(eulerAngles 90 90 0)(相对旋转)
–旋转宏记录的方式
rotate $ (angleaxis 35 [1,0,0]) –格式(angleaxis 度数 [(x 0 or 1) (y 0 or 1) (z 0 or 1)])(相对旋转)
scale $ [.3,.5,.2] –将选中的物体延x轴缩放到30%,延y轴缩放到50%,延z轴缩放到20%(100%记录为1)
–2010年11月11日
–小练习
box()–创建box
rotate $box01 (angleaxis 35 [1,1,0]) –将box01物体延x和y轴旋转35度
in coordsys local move $box01 [110,0,0] –让box01物体按自身坐标延x轴移动100个单位。
–动画练习01开始
animate on –开启动画
(
at time 0 box()–0帧创建一个box
at time 50 rotate $box01 (angleaxis 35 [1,1,0]) — 在50帧将box01物体延x和y轴旋转35度
at time 100 in coordsys local move $box01 [110,0,0] –从0到100帧让box01物体按自身坐标延x轴移动100个单位。
)
animate off –动画结束
–笔记
“in coordsys”–意思就是指定坐标系,后面接各坐标的单词!
–常用的坐标体系
“local” –自身坐标
“view” –视窗坐标
“world” –世界坐标
— “for 某些变量 in 被操作物体清单 do 要做的事情” 语句
— 范例
for i in selection do (i.wirecolor = color 0 128 0) — 让每一个选中的物体的网格色变为 color 0 128 0
for i in $*Omni* do (i.multiplier = i.multiplier*0.5) — 让每一个包含omni字样的灯光亮度减半
for i in geometry do (i.motionblur = on; i.motionBlur = #image) –所有几何体的运功模糊改为image模式,并将开启结果设为真
–自我拓展
for i in lights do (i.multiplier = i.multiplier*4) — 让每一个灯光的亮度提升4倍
for i in objects do (move i [100,0,0]) –让每一个物体延x轴移动100个单位
for i in objects do (i.wirecolor = color 125 0 0) –让每一个物体的网格色改为红色
for i in geometry do (i.smooth = off) –将每个几何体的光滑组勾选关闭
for i in objects do i.material = $Box01.material –将场景中的物体都赋予box01的材质
“wirecolor” — 网格色
— 一些预定义的关键词
“objects” — 物体
“geometry” –几何体
“lights” –灯光
“cameras” — 摄影机
“helpers” — 帮助物体
“shapes” — 二维线
— 临时记录
max delete — 删除
max undo –回退
–2010年11月14日
–小脚本练习
rollout test “测试” width:162 height:42 –创建名为“测试”的展卷栏,大小162×42
(
button btn1 “点击一下” pos:[21,12] width:120 height:20 –创建按钮1,大小120×20,位置21,12
on btn1 pressed do –打开按钮后会
(
messagebox “欢迎来到晓亮脚本” –弹出一个含有“欢迎来到晓亮脚本”的警示窗口
)
)
createdialog test –现在我还不知道这句是什么意思,但没有这句,这个脚本就不成立!
–判断表达式(让电脑自己判断是对还是错)——boolean类型 false or true(真还是假 对还是错)
where
–比较运算符
== –等于
!= –不等于
undefined –未赋予值
–例子
for i in $box* where (i.height != 100) do i.height =100 –让所有以box开头的物体,高度不等于100的都等于100
for i in geometry where (i.material == undefined) do i.ishidden =false –所有未赋予材质的几何体都取消隐藏
for i in $box* do i.name = “晓亮” + i.name –在所有以box开头物体的名字前面加上“晓亮”字样
–举一反三
for i in $omni* where (i.color == color 0 255 125) do i.multiplier = $box01.height/50 –让所有颜色等于0 255 125 的omni灯,亮度的倍增值为box01高度的1/50
for i in $sphere* where (i.radius == $teapot01.radius) do i.segments =$teapot01.segments*4 –让所有与茶壶一半径相同的球细分变成茶壶细分的4倍。
–2010年11月15日
–小练习
for i in $box* where –当物体为box开头时
(
i.height >= 50 or –它的高度大于50 或者
i.height <= 30 or –它的高度小于30 或者
i.height == 40 –它的高度等于40的时候
)
do –将它
(
i.height = 50; –高度改为50,并且
i.name=”小亮”+i.name –将他的名字前面加上“小亮”字样
)
这两天一直在啃“for i in某某某 where 什么条件 do 什么事”的表达式,相信终于弄明白了!
我把我的理解翻译成中文解释一下!
in 就相当于等于的意思,
for i in 某某某 的意思就是当 i (其实就是一个可替代的字母,随便什么都行)等于某某某的时候。(某某某可以是一个物体,可以是一类物体,可以是一个组。)
因为有 for 这个单词,所以 i 会依次替代 某某某里的元素
where 的意思就是 “当”,他后面接的是符合条件的要求,这个要求可以是一个,也可以是多个!中间可以用(or)链接!
do 的意思是“作”,他后面是你想要的效果,可以使一个也可以是多个。多个的时候用()括起来,然后用分号隔开!
–2010年11月16日
“classof” –新学的一个词汇 我的理解是属相或者星座。
–小例子
for i in geometry where (classof i == box) do i.wirecolor = color 22 45 67 –在几何体场景中找到属相为box的物体将其颜色改为color 22 45 69,,最棒的是他们的名字可以不是以box命名的!
–2010年11月17日
–小练习
for i in lights where (classof i != Targetobject) do i.on = off –所有选中的灯光文件,当它的属相不为Targetobject时,那么他的开启状态为关闭。(关闭场景中所有的灯光)
delete lights –删除所有灯光
for i in geometry where (i.material == $box01.material) do i.ishidden = false –当几何体材质与box01的材质相同时,取消隐藏状态
for i in geometry where (i.material == undefined) do (print i.name;i.material = $box01.material) — 当几何体材质没定义时,打印他们的名字,并且赋予box01的材质
— 2010年11月18日
–小练习
b = box() –变量b是一个盒子
$box01.name = “table_box01″ –变量b的名字改为”table_box01”
b.length = b.width = 100 — 变量b的长=宽=100
b.height = 50 –变量b的高度是50
for i = 1 to 10 do –定义 变量 i 是从 1 到 10
for j = 1 to 10 do –定义 变量 j 是从 1 到 10
copy b pos: [j*250,i*250,0] –复制b 位置在 i乘以250 j乘以250 z轴为0 的位置上
$table*.wirecolor = color 200 50 50 –将含有”table”字样物体的颜色改为”200 50 50″
for i in $table* do –将含有”table”字样的物体,
(
move i [(random -50 50),(random -50 50),0]; –延x和y轴随机移动”-20 20″个单位
rotate i (eulerAngles 0 0 (random -90 90)) –延z轴随机旋转”-90 90″度
–这是一个完整的练习,全部输完按ctrl+E键,你会看到一些随机旋转的小方块!快试试吧!
–2010年11月19日
for i in $*box* do i.wirecolor = color (random 0 255) (random 0 255) (random 0 255) –将场景中的名字以box开头物体的物体颜色随机。
for y in $*table* do move y [(random -100 100),(random -100 100),0] — 随机移动名字含有“talbe”字样的物体
for c in $*chair* do in coordsys local move c [(random -45 45),(random -10 10),0] –沿自身坐标随机移动名字含有“chair”字样的物体。
for c in $*chair* do rotate c (eulerangles 0 0 (random -20 15)) –将名称含有“chair”字样的物体随机旋转
for y in $*table* do rotate y (eulerangles 0 0 (random -20 15)) –将含有“table”字样的物体随机旋转
–要点重复
“coordsys local” –沿自身坐标
“rotate (eulerangles 0 0 0)” –旋转
–呵呵!今天的练习好爽! 我有一种魔法师的感觉。
–做练习之前先做好一个场景,一个以“talbe”命名的物体,四个以“chair”命名的物体,并且绑定在“table”上面!然后复制25组。
–然后开启动画关键帧记录,每隔10帧运行一次上面的脚本,哈哈。大功告成,我可以命令桌子和椅子自己移动了!哈哈哈哈哈!太开心了!
–2010年11月20日
–今天搞懂了几个表达式:比较表达式、逻辑表达式。
–其实之前的练习一直在用,就是不知道而已!
–比较表达式
“==”
“!=”
“>”
“<“
“>=”
“<=”
–这些就是比较表达式,在之前的“where”语句的后面有一些判断语句就是用的这些。
–小例子
for i in $box* where ( i.height == i.length ) do ( i.wirecolor = color 255 0 0 ) –当box物体的长等于高的时候,他的颜色变成红色!其中where后面的表达式就是比较表达式
–突然发现我现在学习的脚本,基本上是控制场景中已有的物体,而我还不能随意创建物体,也不能为物体添加修改器,哎!悲哀呀!下一阶段要集中学习,怎样创建并修改物体!
–不说了!继续
–逻辑表达式
“or” –或者
“and” –同时
“not” –不能
–这三个是逻辑表达式
–小例子
for i in $box* where ((i.width >= 25) or (i.wirecolor = color 255 255 0) ) do ( (rotate i(eulerangles 0 0 (random -45 45)) ; move i [0,(random -100 100),0])) –当box物体的高度大于等于25时,或者颜色为红色时,他们在y轴上随机移动200个单位,并延z轴随机旋转90度。
for i in $sphere* where (i.radius < 150 and i.radius > 50) do (i.radius = 100;i.wirecolor = color 0 255 0;i.segments = 16) –当球体的半径小于150并且大于50时,将他们的半径改为100,并且将颜色改为绿色,分段数改为16
for i in $sphere* where ( not i.segments ==8) do (i.radius = 100;i.wirecolor = color 0 255 0;i.segments = 32) –当球体的的分段数不能等于8时,将他们的半径改为100,并且将颜色改为绿色,分段数改为32
–2010年11月21日
–组的写法
my= #($box01,$box02,$box03,$box04,$box05,$box06,$box07,$box08,$box09,$box10) –我的组里有box01——box10共10个物体
$box*.height = 100 –让所有box物体的高度为100
for i in 1 to 10 do my[i].height = i*10 –让组里的10个物体的高度,根据自身的编号乘以10
for i in $box* do i.material = meditmaterials[(random 1 10)] –将默认的前10个材质随机分配给场景中的box物体
–呵呵,很有意思!原来可以这样赋予材质。材质编辑器里的材质默认是一个组,每个材质球都有自己的号!
–那我可不可以尝试让场景中的物体按照我的需求,来赋予材质呢?试试看!
for i in $box* where (i.height >= 50) do i.material = meditmaterials[9] –场景中高度大于等于50的物体,要赋予9号材质!
–呵呵,试验成功!
–刚才翻看了一遍之前的笔记,原来早在第一天就写了这个表达式的练习!真是悲哀,现在才弄懂!
“meditmaterials” –材质组
–2010年11月24日
–范例分析
for i in geometry where (i.modifiers.count > 0) do –当选中几何体的修改器堆栈大于0时
(
for j in i.modifiers where ((classof j ==meshsmooth) or (classof j == turbosmooth)) do –并且其中一个修改器是”meshsmooth”或者”turbosmooth”时
(
j.useRenderIterations = true –开启渲染差值参数选项
j.renderIterations = 3 –将渲染时的圆滑参数设为 3
j.iterations = 1 –将显示的圆滑参数改为 1
)
)
–新语句注解
“modifiers.count” –修改器的堆栈数,相当于一个组
–疑问,如何查找修改器的参数项?
–哈哈!经过一整天的思考和前面积累的知识,我终于推理出来了!
–先创建一个物体,然后为他添加一个你想查找的修改器,比如“meshsmooth”!接下来输入:
show $.meshsmooth –查找选中物体的meshsmooth修改器的参数项!结果就得到了我想要的!!哈哈哈!我真是个天才!
–小练习
–开启关键帧记录器后,运行下面这段脚本!
for i in $sphere* do –让用i替代场景中的sphere物体
(
for j in 1 to 3 do –用j替代1到3的数字串
(
at time ((j*30) + random -10 10) i.position.z = (random 50 100) –在j*30的位置(就是30、60、90)再加减10的地方,记录关键帧。物体i延z轴随机上升50-100左右的单位
at time ((j*30) + random -10 10) rotate i (eulerangles (random -20 20) (random -20 20) (random -30 30)) –在j*30的位置(就是30、60、90)再加减10的地方,记录关键帧。物体i随机旋转20-30度
)
)
for i in $box* do –让用i替代场景中的box物体
(
for j in 1 to 3 do –用j替代1到3的数字串
(
at time ((j*30) + random -10 10) in coordsys local move i [(random -20 20), (random -20 20), (random -60 60)] –在j*30的位置(就是30、60、90)再加减10的地方,记录关键帧。物体i延x、y轴随机移动20个单位,延z轴随机移动60个的单位
at time ((j*30) + random -10 10) rotate i (eulerangles (random -20 20) (random -20 20) (random -50 50)) –在j*30的位置(就是30、60、90)再加减10的地方,记录关键帧。物体i随机旋转20-50度
)
)
–最后手动关闭关键帧!大功告成,但之前你要先做一个场景,每个球体绑定几个小盒子!
–2010年11月25日
–小动画练习
animate on –开启动画
for i in 0 to 300 by 30 do –变量 i 值为从1 到 300 之间 每隔 30 的那些数
at time i –在 i 的值的位置设置关键帧
(
for j in $sphere* do –所有球体
j.pos = $box01.pos + random[-100,-100,-100] [100,100,100] –记录坐标的位置为box01物体的坐标附近100以内的位置
)
–呵呵!这是一个很好玩的练习。前提是你要先建立一个box的位移动画(我做的是box延一个圈进行路径约束),然后在场景中随便创建一堆球体!运行吧!很帅气!
–在这里我们学到了什么呢?
–(for i in 0 to 300 by 30 do at time i)怎样根据需求设置关键帧!帅气!省着一个一个设了!
–(j.pos = $box01.pos + random [x,x,x][x,x,x]怎样让一个物体围绕着另一个物体运行了!
–2010年11月28日
–for i in 的两种形式
–for i in $box* 这是形式一,后面接一个选择的集合,如:box 几何体等等
–for i in 1 to 10 by 2 这是形式二,后面接一个数字的集合,如(1、3、5、7、9)
–了解了这个,我们就要举一反三一下!
animate on
for i in 0 to 100 by 10 do
at time i
(
for j in $sphere01 do
(
in coordsys local move j [30,0,0]
)
)
animate off
animate on
for k in 0 to 100 by 20 do
at time k
(
for j in $sphere01 do
(
in coordsys local move j [0,0,30]
)
)
animate off
–动画分了两次完成,球体01在每10帧的地方向前移动30个单位,在每20帧的地方向上移动30个单位!
–2010年11月30日
–今天终于开始学习if表达 式了!
–下面是我写的第一个if表达式,呵呵。
if $box01.height > 100 then $sphere01.radius = 100 else $cylinder01.height = 100 –判断box01的高度是否大于100,是则球体的半径改为100,不是则圆柱的高度达到100.
— 呵呵,觉得自己特无赖,根本和球与圆柱没关系,非得让人家改变!哈哈哈!
–if表达式的关键是,在if后面必须接一个判断表达式!
–和if无关的练习,突然心血来潮,就写了这个!
animate on –开启动画
for i in 0 to 100 by 10 do –从0到100之间每10个数
at time i –就设置一个关键帧
(
for j in $box* do –让场景中所有的box物体
in coordsys world move j[0,0,(random -20 20)] –参照世界坐标系,沿z轴方向随机移动40个单位
)
–这个脚本练习是03年刚来公司时,cctv投标动画中的一个脚本,当时觉得很神奇,现在终于我也会了!哼 哼哼!
–2010年12月2日
b = $box01.height –b等于box01的高度
if b > 100 then $box*.wirecolor = color 0 0 255 else $box*.wirecolor = color 0 255 255 –如果b大于100,则所有box的颜色改为0 0 255,反之改为 0 255 255
r = $sphere01.radius –设定r等于球体的半径
animate on –开启动画
for i = 0 to 100 by 50 do –从0-100中每隔50
at time i –设置一个关键帧
(
rotate $sphere01 (angleaxis 360 [0,1,0]) ; in coordsys local move $sphere01 [2*pi*r,0,0] –旋转球体360°,移动一个圆周距离。
)
–2010年12月4日
for i in $box* do –i等于所有box的物体
(
if i.wirecolor == color 0 255 255 then move i [100,0,0] else move i [-100,0,0] –如果i的颜色为0 255 255时,则沿x轴向前移动100个单位,反之向后移动100个单位
)
–对变量赋值的新理解,可以被赋值的目标有三种:
— 1.变量名(如比较常用的i、j、b等等字母)
— 2.参数(如:$box01.height,$sphere01.wirecolor等等)
— 3.组的索引元素(如下面的这个练习)
b = #($box01,$box02,$box03) –定义组B的内容,分别是box01、box02、box03
b[2] = 110 –组的第二个元素的值为110
if b[2] != 100 then b[1] = 120 else b[3] = 150 –如果组的第二个元素的值不等于100,则组的第一个元素的值为120,反之组的第三个元素的值为150.
–呵呵在不自觉的情况下,又练了一下if表达式!可惜,现在还不会实际应用!
–2010年12月5日
–经过一宿的思索,终于把if表达式搞懂了。原来我之前写错了一个符号,在判断表达式中,不能用“=”号,而应该用“==”恒等于。困扰我一周的难题终于解决了!哈哈哈哈!
–下面是一个小例子
for i in $omni* do –i等于场景中所有的omni灯
(
if i.enabled == off then (i.multiplier = 0.5 ; i.enabled =on) else i.multiplier = 2 –如果场景中的灯光为关闭状态,则将它的亮度值给到0.5并开启它,反之将亮度值调整至2
–2010年12月7日
–逻辑表达式的小练习
b = $box01
b2 = $box02
if not b.height != b2.height then move b [0,100,0] else move b2 [100,0,0] –如果b的高度不等于b2的高度不成立的话,则移动b100个单位,反之移动b2 -100个单位!
–not 不成立的意思
–真正的03年脚本模拟
$box*.height = 150 –所有box的高度为150
for i = 0 to 300 by 15 do –i 等于 从 0 到 300 每 15 个数 提取一个
animate on –开启动画
at time i –在 i 的时候记录关键帧
(
for b in $box* do –b 等于所有box开头的物体
(
if b.pos[3] < 100 then move b [0,0,random 30 100] –如果b 的z轴坐标小于100,则移动b 随机向上 30-100个单位
else if b.pos[3] > 100 then move b [0,0,random -130 -30] –反之如果b的z轴坐标大于100 则移动 b 随机向下 130-30 个单位
else move b [0,0,random 30 80] –反之则移动b 随机向上 30-80个单位
)
)
–2010年12月10日
for r in $Rectangle* do r.modifiers[2].Density = random 0.15 0.18 –变量 r 等于以Rectangle开头的所有物体,将它的第二个修改器的Density参数设置为0.15 至0.18之间的任意数值。
for r in $Rectangle* do r.modifiers[1].scale = random 5 10 –将它的第一个修改器的scale参数设置为5到10之间的任意数值
for r in $Rectangle* do r.modifiers[1].strength = [0,0,random 0 3] –将它的第一个修改器的strength的参数设置为0到3的任意数值
for r in $Rectangle* do rotate r (eulerangles 0 0 (random -5 5)) –将它沿着z轴方向随机旋转 正负5度
for r in $Rectangle* do move r [(random -0.5 0.5),(random -0.5 0.5),0] –将它沿着x、y轴的方向随机移动0.5个单位
–2010年12月11日
n=noisemodifier() –变量 n 为默认参数的 noise 修改器
for sh in $shape* do addmodifier sh n –为代表 shape 开头物体的变量 sh 添加修改器 n
for sh in $shape* do sh.modifiers[1].scale = random 15 20 –将 sh 的第一个修改器的 scale 设置为15到20之间的数值
for sh in $shape* do sh.modifiers[1].strength = [0,0,random 1 3] –将 sh 的第一个修改器的 strenth 的第三个参数设置为1到3的数值