3

在 maxscript 中访问材质似乎有两个选项,通过紧凑的材质编辑器和 Slate 材质编辑器。问题是,如果将 max 设置为使用 Slate 编辑器,则尝试通过紧凑编辑器 ( currentMaterialLibrary, sceneMaterials, meditMaterials) 访问/修改材料的脚本会失败,反之亦然。

有没有办法直接在 maxscript 中访问材料,而不管使用哪个编辑器?

获得材料后,我想:

  1. 从场景中清除未分配的材质,以便未使用的材质上丢失的纹理不会在场景打开/网络渲染时引发错误。
  2. 检查某些材质属性(即 Glossy 细分),因此购买的具有“不必要的高值”的模型不会破坏渲染时间。
4

2 回答 2

5

如果您想查找所有现有材料(在场景中或不在场景中),以下代码片段将为您完成

for aMtlType in material.classes do 
(
    for aMtl in (getClassInstances aMtlType processAllAnimatables:true) do
    (
        print aMtl
        -- Does this material exist in the scene or not?
        if (findItem sceneMaterials aMtl) == 0 do (print "This material does not exist in the scene")
    )
)

我不太确定如何从现场清除它。您可以获取依赖项(refs.dependents aMtl),然后将对此材料的任何引用替换为新的默认材料。这应该可行,尽管我还没有尝试过(甚至没有尝试过运行它)。所以...好好测试一下并小心使用:-)。

defMtl = ...
for d in refs.dependents aMtl do (
    refIdx = 0
    for i = 1 to refs.getNumRefs d do ( if (refs.getreference d i) == aMtl ) do ( refIdx = i )
    refs.replaceReference aMtl refIdx defMtl
)

对于您的第二个问题 - 检查属性 - 您可以检查它是否具有适当的属性并根据需要设置值

if (hasProperty aMtl "diffuse") 做 (aMtl.diffuse = 0)

于 2014-03-13T21:23:16.167 回答
0

你对你想要做什么不是很具体,但你可以做的是循环遍历场景中的所有材质,然后从那里开始选择你想要做任何事情的材质。通过这种方式,它并不关心您的材质编辑器正在使用什么设置。

for mat in scenematerials do
(
    print ("material name: " + mat.name)    
)
于 2014-03-13T06:29:18.620 回答