пятница, 10 апреля 2015 г.

Оптимизация геометрии для 3ds max из архикада или rhinoceros с помощью maxscript.



Рассмотрим пару скриптов для оптимизации геометрии.
1. Из архикада часто приходит геометрия в которой включены все ребра и не склеены вершины. Если в исходнике много объектов (несколько десятков тысяч), то это очень сильно тормозит работу во вьюпорте и увеличивает объем максовского файла.
Этот небольшой скрипт склеивает вершины и включает режим  autoEdge:

---------------------------------------------------------------------
(
local theObj = objects as array   
local theCountObj = theObj.count
   
progressstart "Editing Objects..."
    
            for i = 1 to theCountObj do
            (
               
            progressupdate (i as float /theCountObj *100)    
               
            if( isKindOf theObj[i] GeometryClass ) then -- weld only in geometry objects
                (
                    meshOp.weldVertsByThreshold theObj[i].mesh theObj[i].mesh.verts 0.0001
                    meshop.autoEdge theObj[i]   theObj[i].Edges  24
                    )

            )
progressend ()
)
--------------------------------------------------------------------

2. Похожие проблемы бывают и при импорте из rhinoceros.
 Этот скрипт конвертирует всю геометрию в EditMesh, склеивает вершины и "аттачит" по материалам (очень полезно, к примеру, когда рамы отдельными элементами из нескольких тысяч палочек и т.п.):

---------------------------------------------------------------------
(
theObj = geometry as array
theCountObj = theObj.count
   
progressstart "Convert to mesh..."
theP = Edit_Poly()   
for i = 1 to theCountObj do (
    progressupdate (i as float /theCountObj *100)
    --addmodifier theObj[i] theP
    --convertToMesh theObj[i]
    )
progressend ()
 progressstart "Welding..."   
   for i = 1 to theCountObj do
   (
   
   progressupdate (i as float /theCountObj *100) 
   
   if( isKindOf theObj[i] GeometryClass ) then -- weld only in geometry objects
    (
     meshOp.weldVertsByThreshold theObj[i].mesh theObj[i].mesh.verts 0.001
     --meshop.autoEdge theObj[i]   theObj[i].Edges  24
     )

   )
progressend ()
  
  
fn theAllMat =
(       
        local allMat = #()
        allMat = scenematerials
        for i in meditMaterials do appendIfUnique allMat i
        for i in objects do if i.material != undefined do appendIfUnique allMat i.material
        allMat
    )
fn getMeshObjByMat Mat =
(
    arrayObj = #()
    for i in geometry do
    (
        if i.material != undefined do
            if i.material == Mat do append arrayObj i
        )
    arrayObj
    )   
   
   
mainSel = geometry as array
theNumObj = mainSel.count
mainMat = theAllMat()
theNumMat = mainMat.count
progressstart "Attache by material..."
   
for i in mainMat do
(
    ObjByMat = getMeshObjByMat i
    theNum = ObjByMat.count
    for i = 2 to theNum do (
        meshop.attach ObjByMat[1] ObjByMat[i]
        progressupdate (i as float /theNum *100)
       
        --gc()
        --freescenebitmaps()
        --clearUndoBuffer()        
        )
    )
progressend ()    
)
-------------------------------------------------------

Комментариев нет:

Отправить комментарий