墨白

相对于人生易老,朱颜易改,大概最易变的还是人心。

博客园 首页 新随笔 联系 订阅 管理

最近在自学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 --创建名为“测试”的展卷栏,大小162x42
(
button btn1 "点击一下" pos:[21,12] width:120 height:20 --创建按钮1,大小120x20,位置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的数值

 

 

 

 

转自 http://blog.sina.com.cn/s/blog_63acffe30100mygh.html

posted on 2011-07-27 15:21  墨白  阅读(5228)  评论(0编辑  收藏  举报