Maxscript_基础_材质处理


  • 关于MEdit,有一个要明白的概念:

  • 场景中物体上的材质 和 MEdit中的材质会一同被保存

  • 如果MEdit中有一个材质,所有的物体上都没使用, 这个材质会随文件一起保存

  • 如果一个物体上有个材质,它没有在MEdit上,这个材质也会随着物体一起保存

  • 如果这个物体被删除了,上面的材质没有在MEdit上,那么这个材质就一起被删除了



  • 当前材质编辑器中所选的材质

MEditMaterials[activeMeditSlot]

  • 显示当前所选材质编辑器中的材质属性,根据材质类型的不同,属性也会不同

showproperties MEditMaterials[activeMeditSlot]

  • 判断一个材质的类型使用Classof 就行

classof MEditMaterials[activeMeditSlot]

  • 遍历整个材质编辑器的材质

-- 材质编辑器只有24个材质球for i = 1 to 24 do
(
   -- 做一些事情 . . .
   
   -- 打印所有的材质球名称
   print ( MEditMaterials[i].name )
   
   -- 打印他们的类型
   print ( classof MeditMaterials[i] )
)

  • 检查一个物体是否有材质

-- 如果这个结果为 True,那么说明所选没有材质($.mat == undefined)

  • 清理掉物体上的材质也可以用此

$.mat = undefined-- 或可以遍历所有所选的物体for s in selection do s.mat = undefined

  • 除了材质,每个几何体都会有wirecolor 的属性,就是基本的线框颜色

-- 也可以是 =[0,0,0] -- 0~255的值for s in selection do s.wirecolor = color 0 0 0

  • 赋予材质编辑器中所选的材质 到 所选的物体上

for s in selection do s.mat = MEditMaterials[activeMeditSlot]

  • 创建一个标准材质到 所选的材质编辑球上

MEditMaterials[activeMeditSlot] = Standard()

  • 清空材质编辑器中的材质球

for i = 1 to 24 do MEditMaterials[i] = Standard name:("StdMat_"+i as string)

  • 创建一个多维材质,并放入到所选的材质编辑槽上

-- 创建一个多维材质fn fnCreateAMultiMat iCount=
(
   -- 创建一个多维材质
   myMultiMat = Multimaterial count:iCount
   
   -- 遍历设置所有材质
    for i = 1 to myMultiMat.count do
    (
        -- 材质的名称
        myMultiMat[i] = Standardmaterial name:("SubMat_"+ i as string)
       
        -- 多维材质球上的名称栏上的名字
        myMultiMat.names[i] = ("Slot_"+ i as string)
        -- . . .
    )
    -- 将创建材质放到当前所选 材质编辑器 所选的槽中
    MEditMaterials[activeMeditSlot] = myMultiMat
   
    -- 或者也可以遍历所选择的物体,赋予当前材质
    -- for s in selection do  s.mat = myMultiMat
)

  • 搜集材质上贴图路径的方法

-- 搜集所给材质的所有贴图fn fnGetMatTexList mat=
(
   -- 用于搜集贴图的数组
   local texs = #()
   
   -- 贴图的数量
   iTexSlotCount = getNumSubTexmaps mat
   
   -- 遍历
   if(iTexSlotCount > 0)then for i = 1 to iTexSlotCount do
   (
       local tempTex = getSubTexmap mat i    
       if(classof tempTex == Bitmaptexture)then    
       (
           append texs (tempTex .filename)  
       )
   )
   return texs
)

  • 对于不同类型材质可以分开处理

fn fnGetMatTextures mat=
(  
   local aAllTexList = #()
   case (classof mat) of
   (
       -- 如果是多维材质
       Multimaterial:
       (
           -- 遍历所有的子材质
           for i = 1 to mat.count do
           (
               -- 获得单个材质上所有的贴图
               local aTexList = fnGetMatTexList (mat[i])
               
               -- 加到总的列表上
               if(aTexList.count >0)then for t in aTexList do append aAllTexList t
            )
        )
        -- 标准材质
        Standardmaterial:
        (
            aAllTexList = fnGetMatTexList mat
        )
       
        -- 其它
        default:
        (
           print "unknown mat type!"
        )
   )
   -- 去除可能重复的贴图
   aAllTexList = makeUniqueArray  aAllTexList
       
   -- 返回
   return aAllTexList
)
       
-- 调用的时候就调用
fnGetMatTextures
       
-- 例如: 获得当前在材质编辑器中所选材质上的贴图
texs = fnGetMatTextures (MEditMaterials[activeMeditSlot])


作者:TAZORN

著作权归作者所有






【相关阅读】:

Maxscript_基础_回调函数http://tk.v5cg.com/help/246.html 

Maxscript_基础_材质处理http://tk.v5cg.com/help/247.html 

Maxscript_基础_修改器操作http://tk.v5cg.com/help/248.html 

Maxscript_基础_创建窗口http://tk.v5cg.com/help/249.html 

Maxscript_基础_遍历与递归http://tk.v5cg.com/help/250.html 

Maxscript_与DotNet交互http://tk.v5cg.com/help/251.html 


【上传发布插件】:

编写3DMAX插件到发布上线全流程http://tk.v5cg.com/help/147.html 

代码上传与工具发布http://tk.v5cg.com/help/99.html 

代码发布,部署实例参考http://tk.v5cg.com/help/140.html 

PS【动作库】代码部署指南http://tk.v5cg.com/help/141.html 

CG云盘 - 开发者使用说明http://tk.v5cg.com/help/34.html