2012-03-28 4 views
1

Ich habe eine ziemlich große 3DS-Szene mit vielen einzelnen Meshes - ein paar tausend. Jedes Netz sollte nur ein einziges Material verwenden, d. H. Alle Dreiecke in diesem Netz verwenden das gleiche Material wie das Netz. Dies scheint der Fall zu sein, aber wir haben viele Fälle, in denen einem Netz auch mehrere Untermaterialien zugewiesen sind, die in diesem Netz tatsächlich nicht verwendet werden.Entfernen Sie nicht verwendete Materialien aus 3DS-Max Meshes

Das ist in 3DS gut, aber wir exportieren unsere Szene für den Einsatz in einer Echtzeit-3D-Engine und dies ist der Export export ... so fragte ich mich, ob ich ein Skript schreiben kann, das entweder auf die gesamte Szene oder die aktuell ausgewählten Meshes und entfernt alle [sub] -Materialien von jedem Mesh, das nicht benutzt wird.

Ich bin nicht der Künstler, ich hoffe, das machte Sinn und ich habe alle meine Terminologie richtig.

Antwort

2

Woher wissen wir, welches Material aus dem Multi-Material die richtige ist? Wenn es immer nur das erste Material ist könnte man so etwas wie

-- 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 tun: Wenn wir Gesicht annehmen 1 ist für Material-ID führen, können wir tun

-- 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

Der richtige ist derjenige, der tatsächlich auf den Polygonen verwendet wird - idealerweise würden wir jeden Poly testen, der das gleiche Material hat, aber in Wirklichkeit würde das Überprüfen des zugewiesenen Materials der ersten Poly wahrscheinlich in Ordnung sein –

+0

Ich habe die Antwort aktualisiert. Dies sollte für alle Arten von Geometrie funktionieren. – JHN

-1

Geben Sie diesen einen Versuch:

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

Oder Sie können auch Texturen auf Modifikatoren wie dies erkennen:

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 
Verwandte Themen