2012-03-28 50 views
1

我有一個相當大的3DS場景,有許多單獨的網格 - 幾千個。每個網格只應使用單一材質,即該網格中的所有三角形都使用分配給網格的相同材質。這似乎是這種情況,但是我們有很多情況,其中也有幾個分配給網格的子材料,這些材料並未在網格中實際使用。從3DS-Max網格中移除未使用的材料

這在3DS中很好,但是我們導出了我們的場景以用於實時3D引擎,並且這導致了導出的混亂......所以我想知道我是否可以編寫一個腳本來影響整個場景,或者當前選中的網格物體,並將從每個網格中刪除未使用的所有[子]材料。

我不是藝術家,我希望這是有道理的,我的所有術語都是正確的。

回答

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] 
) 
+0

正確的是在多邊形上實際使用的那個 - 理想情況下,我們會測試每個聚合物都具有相同的材質,但實際上檢查第一個聚合物的指定材質可能會很好 – 2012-03-30 10:58:47

+0

我已更新答案。這應該適用於所有類型的幾何體。 – JHN 2012-03-30 12:54:50

-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