学习路径
创建和修改:
box() --创建原始模型带有括号是默认参数
mybox=box()
mybox.name="傻derbox"--mybox后跟一个英文句号是访问后面跟的函数。这是更改box名称
mybox = box length:20 width:20 height:20--box之后不带括号就需要手动指定参数
mybox.wirecolor = (color 255 0 255)--这是更改box顶点颜色,更改颜色=后面需要括号
mybox.pos = [x,y,z] --这是修改box位置,注意这是绝对位置。=后跟中括号
mybox.scale = [x,y,z]--这是缩放,=后跟中括号、
move mybox [x,y,z]--这是相对坐标移动
scale mybox [x,y,z]--这是相对坐标缩放,其中任意参数为0模型则会被压缩
rotate mybox(eulerangles x y z)--旋转,单位为度。欧拉角旋转写法
rotate mybox(quat 旋转角度 [x,y,z])--旋转。四元数写法,quat后面的数字是旋转角度,中括号 xyz的数字只能是0或1,1则为那个轴向的旋转
rotate mybox(angleaxis 旋转角度 [x,y,z])--旋转。角轴写法,quat后面的数字是旋转角度, 中括号xyz的数字只能是0或1,1则为那个轴向的旋转
添加修改器:
addModifier mybox(修改器名称 () )--这是用来添加修改器面板里的修改器的写法
resetMaxFile #noprompt--重置max场景,#noprompt这是不提醒,重置不提醒
if条件判断:
if mybox.height == 10 then mybox.width = 20--if后面的是条件,then是执行修改,当条件复 符合则执行,当条件不符合则不执行
if mybox.height == 10 then mybox.width = 20 else mybox.width = 10--符合条件则执行第一个 执 行 命令(then),当条件不符合则执行第二个命令(else),注意可以换行
比较运算符
== 等于
!= 不等于
>大于
>= 大于或等于
<小于
<= 小于或等于
For循环:
resetMaxFile #noprompt--重置场景且不提示,可有可无
mybox = box()--创建盒子,这里可以指定大小及颜色
for i = 1 to 5 do --for循环,i是变量,1 to 5 do是附加值,
(
box_copy = copy mybox --这里是复制盒子,从1到5
box_copy.pos = [i*30, 0, 0] --这里是给5个盒子分别指定x轴向的绝对坐标
box_copy.wirecolor = [i*10,i*10,i*10] --这里是R G B,每个盒子分别逐步递进给予颜色
)--括号中的就是循环所需要执行的命令
--需要注意的是,循环物体得有物体才行,所以需要新创建一个物体才能循环
resetMaxFile #noprompt
mybox = box length:10 width:10 height:10 wirecolor:blue
for i = 1 to 5 by 2 do--这里多了by 2 do是指隔一个创建一个,隔一个给一个坐标,隔一个给一个颜色
(
box_copy = copy mybox
box_copy.pos = [i*20, 0, 0]
box_copy.wirecolor = [i*25,i*50,(5-i)*50]
)
数组获取:
arr=for i=1 to 5 collect i--collecti是聚集,collecti后的i则是for循环后赋值的变量i
print i--这里是打印。打印不要写等于号
arr=#(11,22,33)
for i= 1 to arr.count do print arr[i]--count是数量,这里类似选中的对象数量,元素的点数量,或者面数量,后面arr[i]当中的i就是逐帧打印和数组一样,i也可以是指定的数字例如arr[ random 1 8]
--这里的意思是1循环到选中所有。随机1到8
while和do条件判断:
while 条件 do 执行 -- 这里是先判断再执行,条件复合则会一直执行,直至undefined,未定义
x=10 while x>10 do print (x-=1)--x-=1这里是缩写,x=x-1。等号左边的x只是一个代称
结果undefined
do 执行 while 条件 --先执行后判断,条件至少都会被执行一次,
x=10 do print (x-=1) while x>10 结果 9 undefined
全局变量和局部变量:
全局变量-- global rad = 10 --global全局变量 sphere radius:rad--创建一个球体,radius半径为,全局变量rad的10
局部变量--只是一个概念,它通常是在函数中起作用,部分局部变量无法独自存在,需要其访问全局或是其他别来才能执行代码 for i = 1 to 3 do ( local rad = 10 --local局部变量,局部变量只能在块(函数)当中访问 s = sphere() s.pos.x = i * 10 s.radius = rad )
for i = 1 to 5 do ( global rad = 10 cyl_height = 25 c = cylinder() c.radius = rad c.height = cyl_height c.pos.x = i * 25 ) s = sphere radius:rad
表达方式:
单个展卷栏表达方式:
try DestroyDialog a catch()--这里是防多开插件
rollout a "展卷栏"--字母a是代码识别的命名, " " 中的名称是用来给人识别的
(
button anniu "按钮" height:20 width:80 pos:[20,20] tooltip:"鼠标悬停提示"
on anniu pressed do
(messagebox "信息提示弹窗" title:"弹窗标题" )
)
createdialog a 180 250--这是创建可视化窗口,两组数字是控制面板长宽
多个展卷栏表达方式:
global ZJL
rollout A "第一个展卷栏"
()
------------------------------------------------------------------
rollout B "第二个展卷栏"
(
)
-------------------------------------------------------------------
rollout C "第三个展卷栏"
(
)
--------------------------------------------------------------------
ZJL=newRolloutFloater "多展卷栏" 150 210--这里的两组数字用来控制面板大小
addRollout A ZJL rolledUp:false--这里的rolledUp:false用来控制打开插件时展开or关闭状态
addRollout B ZJL rolledUp:true
addrollout C ZJL rolledUp:true--这里的三组addRollout ABC对应的是上方三个展卷栏
按钮等功能(陆续更新)
说明:直接复制代码好像会报错无法运行,目前找到的解决办法是删除缩进和多余的空格(比如括号前的空格这些等)
try DestroyDialog a catch()--这里是防多开插件
rollout a "展卷栏"--字母a是代码识别的命名, " " 中的名称是用来给人识别的
(
group "包裹框" (--把以下面板内容包裹起来,好看些
button AN "按钮" height:20 width:80 pos:[20,20] tooltip:"提示内容"--height高度,width宽度,pos位置,tooltip鼠标悬浮按钮上显示的提示内容
spinner WTQ "微调器" fieldwidth:30 pos:[20,45] range:[0,100,25]--fieldwidth宽度,pos位置,range:最小值-最大值-显示值
label WB "文本" width:30 height:30 pos:[45,60]--仅显示文字信息
checkbox FXK "复选框" width:70 height:20 pos:[20,75] checked:true tooltip:"提示内容"--checked表示复选框是勾选状态还是关闭状态。true or false
)
)
createdialog a 120 400 --这是创建可视化窗口,两组数字是控制面板长宽
创建工具栏(自定义脚本):
这是将自己的脚本保存至工具栏中(就不用每次都从文件夹中拖到max中了)
注意事项:
1、脚本需要放在max安装目录下的scripts文件中
2、仅支持ms,mse格式
自定义-自定义用户界面-工具栏-新建-新建工具栏(命名)-打开脚本编辑器(复制以下代码)-全选代码拖动至新建工具栏的图标上即可
filein "$scripts\文件名称.ms"
插件调用:
rollout a "展卷栏"
(button AN "脚本名称" --这是脚本按钮
on AN pressed do
(filein "脚本保存路径\\脚本名称.mse"--仅ms,mse可以使用
))
createdialog a 180 250
添加浮动面板:
try DestroyDialog a catch()--防多开再浮动面板下无效
rollout a "展卷栏"--字母a是代码识别的命名, " " 中的名称是用来给人识别的
()
createdialog a 180 250--这是创建可视化窗口,两组数字是控制面板长宽cui.RegisterDialogBar a style:#(#cui_dock_left ,#cui_dock_top ,#cui_dock_right ,#cui_dock_bottom )--这是创建浮动面板(括号中的是可以停靠方向,上下左右)
cui.dockdialogbar a #cui_dock_right--这是打开脚本固定停靠位置,#靠右
注释
-- 单行注释
/* */ 长注释
注意事项:
写入代码必须使用英文符号——很重要!
(x-=1)--x-=1这里是缩写,x=x-1
selection表示选中的所有物体,如果是对场景中的全部物体(包括不被选中的物体)进行调整只要将selection改成objects
很棒的教程或资料:
自定义函数库参考
m解剖一只MZP - 简书 (jianshu.com)https://www.jianshu.com/p/9fc5dab3fc88
大佬们的学习笔记
MaxScript学习笔记 | 月光林地 (supervj.top)https://supervj.top/2021/03/26/MaxScript/