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相关推荐

  1. 批处理渲染Fbx到Avi视频 BatchRenderFbxToAvi Maxscript插件

    自己学习Maxscript,给公司一位同事写了一个 批量渲染fbx到avi视频的脚本 (用在3ds max) 视频质量不做要求,能看清人的动作就行,目的是为了 将fbx渲染出的视频与 语音进行一个同步 ...

  2. 3D脚本 maxscript入门教程

    入门教程内容结构 本教程内容分为五个部分,用几个具体的例子讲解大多数的脚本操作和语法知识. 一.MAXScript简介 1.说明什么是MAXScript以及它有什么功能,能给用户带来什么好处. 2.访 ...

  3. [2018年工作重点规划]二.max脚本加强编写能力

    1.阅读MaxScript 官方文档 知识点: Listener 窗口 在当前鼠标位置按下 Enter 键,插入一个空行. 当用户把鼠标移到左边边框边缘时,会变成一个指向右边的箭头,单击鼠标可以选取整 ...

  4. 3D MAX 入门教程内容结构

    入门教程内容结构 本教程内容分为五个部分,用几个具体的例子讲解大多数的脚本操作和语法知识. 一.MAXScript简介 1.说明什么是MAXScript以及它有什么功能,能给用户带来什么好处. 2.访 ...

  5. 3dmax中合并Editable_mesh

    最近为了场景的优化,接到一个小人物,用maxscript把相同父节点的可编辑网格合并,以使程序渲染速度提高,原理在场景管理器那篇随笔中说到过了.于是在晨辉的帮助下开始学习maxscript,遇到问题主 ...

  6. marketscript

    引用:http://www.ddove.com/3dmax/sl/tut_controlling_foliage_with_maxscript.html 使用 MAXScript 控制植物 在本教程中 ...

  7. MaxScript 学习笔记【有转载】

    MaxScript 学习笔记[有转载] 1. string string类型的变量是一个数组,下列操作合法: strName = $.name -- output: "Shemmy_03&q ...

  8. 阿赵的MaxScript学习笔记分享五《UI组件使用篇》

    大家好,我是阿赵.这个专题的内容比较多,所以抓紧时间更新.这是第五篇,UI组件使用篇. 这里主要是把maxscript的rollout窗体支持的UI组件列举一下,并每个组件写一个使用范例,以方便理解和 ...

  9. MaxScript学习 |展UV

    本文通过MaxScript控制UVW修改器进行展UV,3dsmax版本使用的是3dsMax 2020,参考[1][2]介绍的方法进行UV展开,具体步骤如下: 编辑多边形修改器中:将一个模型整体拆解分离 ...

  10. [转载]一个游戏程序员的学习资料

    想起写这篇文章是在看侯杰先生的<深入浅出MFC>时,突然觉得自己在大学这几年关于游戏编程方面还算是有些心得,因此写出这篇小文,介绍我眼中的游戏程序员的书单与源代码参考.一则是作为自己今后两 ...

最新文章

  1. 搭建Mantis 缺陷管理系统(转)
  2. 练习 MongoDB 操作 —— 备份篇(三)
  3. Parallels Desktop 重装系统
  4. RN 与原生通信(Android篇)
  5. Linux 内核抓包功能实现基础(五) 常见问题解析
  6. 什么是最重要的事情?来自长辈的教诲
  7. 51Nod 1314 定位系统
  8. IDEA 中 右键新建时,没有新建class的解决方案
  9. Servlet_urlpartten配置
  10. dao层mysql复合语句_在业务中是使用多个Dao组合好,还是一个链接查询好?
  11. C语言中输入输出fread和fwrite函数的用法
  12. MySQL之数据库多表查询
  13. Android 四大组件之一(Activity)
  14. android方法中添加 N,AndroidN(7.0)Settings模块界面加载流程学习
  15. potplayer直播源模板
  16. 步进电机c语言驱动原理,连接PC的步进电机简单驱动电路
  17. ENVI分类格式转TIF
  18. 计算机专业必读哪些经典书籍?
  19. Steam多人联机游戏unturned(未转变者)超级简单教程,作者亲自联机游玩
  20. Appium--swipe滑动方法

热门文章

  1. win10 电脑没声音 控制面板 realtek高清晰音频管理器没有解决方案
  2. 无线电监测软件java_大牛干货:软件无线电的设计和测试
  3. java 省市县数据_Jsoup获取全国地区数据(省市县镇村)
  4. apollo学习之:如何测试canbus模块
  5. ParaView Volume MHD
  6. meta分析零基础教程-Prospero选题注册全流程
  7. as几个常用模拟器连接命令
  8. DiskGenius 强行拆分黑苹果HFS硬盘分区以给Windows扩容
  9. 移动固态硬盘(PSSD)怎么用?WTG随时随地封装系统
  10. Windows操作系统装机必备软件,值得收藏!