学习MAXScript
MaxScript - a Comprehensive Introduction
基础语法
select $Box* – select any objects with the name box at the beginning of them.
打开MAXScript侦听器窗口,开启宏录制器。
这样,每当我们进行一个操作,比如创建一个Box,那么宏录制器中会显示当前动作所对应的MAXScript命令。
Use Loop
注意, $ 中的元素顺序与你选择的时候的顺序相关联。
while loop and if condition
function
function without para
function with para
fn TalkToMe =
(Messagebox "hello"
)fn RotateMe obj xamount =
(obj.rotation.x_rotation += xamount
)--RotateMe $* 90 -- everything
--RotateMe $Box* 90 -- Box...
RotateMe $*01 90
function with return
3个函数,3中类型
fn TalkToMe =
(Messagebox "hello"
)fn RotateMe obj xamount =
(obj.rotation.x_rotation += xamount
)fn BoundingVolume obj =
((obj.max.x - obj.min.x) * (obj.max.y - obj.min.y) * (obj.max.z - obj.min.z) -- return a value
)--print(BoundingVolume $)for o in $ do
(if(BoundingVolume o) > 5000 do(print ("found a whopper called " + o.name as string))
)
一个例子,用到了 rollout
代码在这里
rollout rol_randomiser "Randomiser" width:120 height:520
(
--UIlabel lbl_title "Randomiser Tools" pos:[16,8] width:88 height:16button btn_deselect "Deselect" pos:[8,32] width:56 height:16spinner spn_deselect "" pos:[73,32] width:40 height:16 range:[0,99.0,35]GroupBox grp_pos "Position" pos:[8,56] width:104 height:120button btn_pos_all "Random All" pos:[16,80] width:88 height:16button btn_pos_x "X" pos:[16,104] width:32 height:16button btn_pos_y "Y" pos:[16,128] width:32 height:16button btn_pos_z "Z" pos:[16,152] width:32 height:16spinner spn_pos_x "" pos:[56,104] width:48 height:16 range:[0,999.9,10]spinner spn_pos_y "" pos:[56,128] width:48 height:16 range:[0,999.9,10]spinner spn_pos_z "" pos:[56,152] width:48 height:16 range:[0,999.9,10]GroupBox grp_rot "Rotation" pos:[8,184] width:104 height:120button btn_rot_all "Random All" pos:[16,208] width:88 height:16button btn_rot_x "X" pos:[16,232] width:32 height:16button btn_rot_y "Y" pos:[16,256] width:32 height:16button btn_rot_z "Z" pos:[16,280] width:32 height:16spinner spn_rot_x "" pos:[56,232] width:48 height:16 range:[0,180,180]spinner spn_rot_y "" pos:[56,256] width:48 height:16 range:[0,180,180]spinner spn_rot_z "" pos:[56,280] width:48 height:16 range:[0,180,180]GroupBox grp_scale "Scale" pos:[8,312] width:104 height:145button btn_scale_all "Random All" pos:[16,336] width:88 height:16button btn_scale_uniform "Random Uniform" pos:[16,360] width:88 height:16button btn_scale_x "X" pos:[16,384] width:32 height:16button btn_scale_y "Y" pos:[16,408] width:32 height:16button btn_scale_z "Z" pos:[16,432] width:32 height:16spinner spn_scale_x "" pos:[56,384] width:48 height:16 range:[0,20,1.5]spinner spn_scale_y "" pos:[56,408] width:48 height:16 range:[0,20,1.5]spinner spn_scale_z "" pos:[56,432] width:48 height:16 range:[0,20,1.5]GroupBox grp_colour "Colour" pos:[9,464] width:104 height:48button btn_colour_full "Full" pos:[17,488] width:32 height:16button btn_colour_grey "Grey" pos:[65,488] width:32 height:16--Functions--creates a new array. appending probability-success objects. then selects arrayfn rand_deselect prob =(newselection = #() --an empty arrayfor o in $ do(--random 0.0 100.0 ??? ????if (random 0.0 100.0) >= prob then(append newselection o --????? o ??? ?? newselection ?))select newselection)--move objects position by amount +/- x.y and zfn rand_pos obj x y z = (obj.pos += [random -x x, random -y y, random -z z])--rotate object by amount +/- x.y and zfn rand_rot obj x y z = (obj.rotation.x_rotation += random -x xobj.rotation.y_rotation += random -y yobj.rotation.z_rotation += random -z z)--scale object by amount +/- x.y and zfn rand_scale obj x y z uniform = (fScale_x = 1.0fScale_y = 1.0fScale_z = 1.0--find a random between 1 and value, then 50% chance of 1 / itfScale_x = random 1.0 xif (random 0 1) == 0 then (fScale_x = 1 / fScale_x)fScale_y = random 1.0 yif (random 0 1) == 0 then (fScale_y = 1 / fScale_y)fScale_z = random 1.0 zif (random 0 1) == 0 then (fScale_z = 1 / fScale_z)if uniform == false then(scale obj [fScale_x, fScale_y, fScale_z]))fn rand_colour obj grey = (colorR = random 0 256colorG = random 0 256colorB = random 0 256if grey == false then(obj.wirecolor = color colorR colorG colorB )else(obj.wirecolor = color colorR colorR colorR ))--Events--deselecton btn_deselect pressed do(rand_deselect spn_deselect.value --? spn_deselect ?????????? rand_deselect)--positionon btn_pos_all pressed do(for o in $ do(rand_pos o spn_pos_x.value spn_pos_y.value spn_pos_z.value))on btn_pos_x pressed do(for o in $ do(rand_pos o spn_pos_x.value 0 0))on btn_pos_y pressed do(for o in $ do(rand_pos o 0 spn_pos_y.value 0))on btn_pos_z pressed do(for o in $ do(rand_pos o 0 0 spn_pos_z.value))--rotationon btn_rot_all pressed do(for o in $ do(rand_rot o spn_rot_x.value spn_rot_y.value spn_rot_z.value))on btn_rot_x pressed do(for o in $ do(rand_rot o spn_rot_x.value 0 0))on btn_rot_y pressed do(for o in $ do(rand_rot o 0 spn_rot_y.value 0))on btn_rot_z pressed do(for o in $ do(rand_rot o 0 0 spn_rot_z.value))--scaleon btn_scale_all pressed do(for o in $ do(rand_scale o spn_scale_x.value spn_scale_y.value spn_scale_z.value false))on btn_scale_x pressed do(for o in $ do(rand_scale o spn_scale_x.value 1 1 false))on btn_scale_y pressed do(for o in $ do(rand_scale o 1 spn_scale_y.value 1 false))on btn_scale_z pressed do(for o in $ do(rand_scale o 1 1 spn_scale_z.value false))on btn_colour_full pressed do(for o in $ do(rand_colour o false))on btn_colour_grey pressed do(for o in $ do(rand_colour o true))
)createdialog rol_randomiser
我的实践
phase1
需求:
- 将老鼠模型文件夹中所有的 .obj 文件导入到当前 MaxFile 中。
- 将Material Editor中的 material assign 到对应的obj上。
--importing multiple *.obj extensions in a directory
fn getFilesOBJ directory =
(for f in ( getFiles (directory + "*.obj")) do(lokatie = f as stringfile = getFilenameFile f --pak de naam van bestandprint fileimportFile lokatie #noPrompt --FN import obj$selection[1].name = file --将该对象重命名为文件名(不包括 .obj 后缀))
)filename = getOpenFileName types:"OBJ(*.obj)|*.obj" --得到文件名
directory = getFilenamePath filename --得到该文件所在目录名
getfilesOBJ directory --读取该目录下的所有 .obj 文件--将 MaterialEditor 中的 material 加载到相应的对象上。(此前已经将material的名字设定为对应object的名字)
for o in $*trans do
(for m in meditmaterials do(if o.name == m.name theno.mat = m)
)
注:导入.obj文件将不会打开交互窗口,将会沿用之前的设置,为了使图像导入为 flat 而不是 smooth 风格,需要注意下面的那个选项
phase 2
需求:
- 了解 animation
- 读取.mat文件,让相应的组件运动起来。
一个简单的用MAXScript创建的动画。
在用户界面里拖动时间滑杆,可以看到Box对象会动起来,关键帧设置在第0帧和第100帧。
-- animate On
-- (
-- at time 0f($uppart_trans.pos=[0,0,0]; $uppart_trans.scale=[1,1,0.25])
--
-- at time 100f($uppart_trans.pos=[100,0,0]; $uppart_trans.scale=[1,1,3])
-- )
其它的一些积累
使用 string 来选取对象,这里需要用到 getNodeByName 函数
--If your variable "a" refer to the object itself:
a = $Box01
select a--But if "a" is just the name as string then:
a = "Box01"
select (getNodeByName a)
学习MAXScript相关推荐
- 批处理渲染Fbx到Avi视频 BatchRenderFbxToAvi Maxscript插件
自己学习Maxscript,给公司一位同事写了一个 批量渲染fbx到avi视频的脚本 (用在3ds max) 视频质量不做要求,能看清人的动作就行,目的是为了 将fbx渲染出的视频与 语音进行一个同步 ...
- 3D脚本 maxscript入门教程
入门教程内容结构 本教程内容分为五个部分,用几个具体的例子讲解大多数的脚本操作和语法知识. 一.MAXScript简介 1.说明什么是MAXScript以及它有什么功能,能给用户带来什么好处. 2.访 ...
- [2018年工作重点规划]二.max脚本加强编写能力
1.阅读MaxScript 官方文档 知识点: Listener 窗口 在当前鼠标位置按下 Enter 键,插入一个空行. 当用户把鼠标移到左边边框边缘时,会变成一个指向右边的箭头,单击鼠标可以选取整 ...
- 3D MAX 入门教程内容结构
入门教程内容结构 本教程内容分为五个部分,用几个具体的例子讲解大多数的脚本操作和语法知识. 一.MAXScript简介 1.说明什么是MAXScript以及它有什么功能,能给用户带来什么好处. 2.访 ...
- 3dmax中合并Editable_mesh
最近为了场景的优化,接到一个小人物,用maxscript把相同父节点的可编辑网格合并,以使程序渲染速度提高,原理在场景管理器那篇随笔中说到过了.于是在晨辉的帮助下开始学习maxscript,遇到问题主 ...
- marketscript
引用:http://www.ddove.com/3dmax/sl/tut_controlling_foliage_with_maxscript.html 使用 MAXScript 控制植物 在本教程中 ...
- MaxScript 学习笔记【有转载】
MaxScript 学习笔记[有转载] 1. string string类型的变量是一个数组,下列操作合法: strName = $.name -- output: "Shemmy_03&q ...
- 阿赵的MaxScript学习笔记分享五《UI组件使用篇》
大家好,我是阿赵.这个专题的内容比较多,所以抓紧时间更新.这是第五篇,UI组件使用篇. 这里主要是把maxscript的rollout窗体支持的UI组件列举一下,并每个组件写一个使用范例,以方便理解和 ...
- MaxScript学习 |展UV
本文通过MaxScript控制UVW修改器进行展UV,3dsmax版本使用的是3dsMax 2020,参考[1][2]介绍的方法进行UV展开,具体步骤如下: 编辑多边形修改器中:将一个模型整体拆解分离 ...
- [转载]一个游戏程序员的学习资料
想起写这篇文章是在看侯杰先生的<深入浅出MFC>时,突然觉得自己在大学这几年关于游戏编程方面还算是有些心得,因此写出这篇小文,介绍我眼中的游戏程序员的书单与源代码参考.一则是作为自己今后两 ...
最新文章
- 搭建Mantis 缺陷管理系统(转)
- 练习 MongoDB 操作 —— 备份篇(三)
- Parallels Desktop 重装系统
- RN 与原生通信(Android篇)
- Linux 内核抓包功能实现基础(五) 常见问题解析
- 什么是最重要的事情?来自长辈的教诲
- 51Nod 1314 定位系统
- IDEA 中 右键新建时,没有新建class的解决方案
- Servlet_urlpartten配置
- dao层mysql复合语句_在业务中是使用多个Dao组合好,还是一个链接查询好?
- C语言中输入输出fread和fwrite函数的用法
- MySQL之数据库多表查询
- Android 四大组件之一(Activity)
- android方法中添加 N,AndroidN(7.0)Settings模块界面加载流程学习
- potplayer直播源模板
- 步进电机c语言驱动原理,连接PC的步进电机简单驱动电路
- ENVI分类格式转TIF
- 计算机专业必读哪些经典书籍?
- Steam多人联机游戏unturned(未转变者)超级简单教程,作者亲自联机游玩
- Appium--swipe滑动方法