Рассмотрим пару скриптов для оптимизации геометрии.
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 ()
)
-------------------------------------------------------
Комментариев нет:
Отправить комментарий