从3DS-Max网格中删除未使用的材质

时间:2012-03-28 19:31:45

标签: maxscript

我有一个相当大的3DS场景,有许多单独的网格 - 几千个。每个网格应仅使用单个材质,即该网格中的所有三角形使用分配给网格的相同材质。这似乎是这种情况,但是我们有很多情况下,还有一些分配给网格的子材料在网格中实际上没有使用。

这在3DS中很好,但是我们导出我们的场景用于实时3D引擎,这会弄乱导出...所以我想知道我是否可以编写一个脚本,它可以作用于整个场景,或者当前选择的网格物体将删除每个网格中未使用的所有[子]材料。

我不是艺术家,我希望这是有道理的,我的所有术语都是正确的。

2 个答案:

答案 0 :(得分:2)

我们如何从multisb材料中了解哪种材料是正确的?如果它总是只是第一种材料,你可以做类似的事情

-- walk over all geometry find which has multiSub and apply first material
for o in geometry where isKindOf o.material multimaterial do o.material = o.material.material1

Edit1:如果我们假设面部1是物料ID的前导,我们可以

-- walk over all geometry find which has multiSub and apply first material
for o in selection where isKindOf o.material multimaterial do 
(
    -- Get face material ID from face 1
    local id = getFaceMatID o.Mesh 1
    -- Assign that material
    o.material = o.material[id]
)

答案 1 :(得分:-1)

尝试一下:

for i in 1 to meditMaterials.count where (MeditUtilities.isMaterialInUse meditMaterials[i] == false) do meditMaterials[i] = Standard()
ATSOps.Refresh()
freeSceneBitmaps()

或者您也可以在修改器上检测纹理,如下所示:

modTexMaps = #()
for obj in geometry where obj.modifiers.count != 0 do
(
for m = 1 to obj.modifiers.count do
(
    for p in (getpropnames obj.modifiers[m]) \
    where isKindOf (tex = getproperty obj.modifiers[m] p) texturemap do 
    (
        append modTexMaps tex
    )
)
)
modTexMaps