среда, 22 апреля 2015 г.

Простое выделение.

Этой простой строчкой можно оставлять выделенными нужное число объектов (в процентном отношении)

-----------------------------------
select (for i in selection where (random 0 100)<50 collect i)
-----------------------------------
полезно, если, к примеру, необходимо прорядить объекты и т.п.

понедельник, 20 апреля 2015 г.

Скрипт AttacheSplines

Скрипт AttacheSplines
Иногда необходимо приаттачить (сшить) сплайны или геометрию, например, - чертежи из автокада (там часто, помимо сплайнов попадается и геометрия), - можно воспользоваться этим скриптом:
----------------------------------------------------------
(
arrShape = for o in objects where superclassOf o == shape collect o
arrMesh = for o in objects where (classOf o == Editable_mesh or classOf o == Editable_poly) collect o

arrShapeC = arrShape.count
arrMeshC = arrMesh.count

convertToSplineShape arrShape[1]
progressstart "Attach shapes..."
for i = 2 to arrShapeC do
(
    convertToSplineShape arrShape[i]
    addAndWeld arrShape[1] arrShape[i] -1
   
    progressupdate (i as float /arrShapeC*100)
   
    gc()
    freescenebitmaps()
    clearUndoBuffer()    
    )
updateShape arrShape[1]
progressend ()

convertToMesh arrMesh[1]   
progressstart "Attach mesh..."
for i = 2 to arrMeshC do
(
    convertToMesh arrMesh[i]
    meshop.attach arrMesh[1] arrMesh[i]
    progressupdate (i as float /arrMeshC*100)
   
    gc()
    freescenebitmaps()
    clearUndoBuffer()    
    )
update arrMesh[1]
progressend ()
)

----------------------------------------------------------
В итоге все сплайны должны стать одним сплайном и, также, вся геометрия - станет одним мешем.



пятница, 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 ()    
)
-------------------------------------------------------

среда, 1 апреля 2015 г.

Моделирование дома по спутниковой карте и панораме.


сам дом


С помощью SAS.Планета определяем размер дома и делаем скриншот:




Выставляем правильный масштаб карте в сцене

поворачиваем- выравниваем для удобства моделирования

Обводим контуры
Высоту можно определить с помошью инструмента Perspective Match. Суть в том, чтобы построить модель по перспективе, пусть даже не в маштабе, но в нужных пропорциях. Имея размеры со спутниковой карты, можно подогнать модель по перспективе к размерам со спутника, тем самым, получаем масштабную модель. Одного вида может не хватить. Для лучшей точности желательно построить модели по нескольким перспективам.

первая перспектива

Кидаем перспетиву на бэкграунд и выставляем нужные параметры outsize
Чтобы можно было пользоваться камерой в режиме 2D Pan Zoom Mode надо поменять ее тип на Free
Добавьте подпись

Создаем бокс в нужных пропорциях



То же для другой перспективы
Осталось только подогнать  модель к размерам на спутниковой карте и заготовка нужной высоты  готова

Можно приступать к детализации:





Есть, правда, еще один способ - иногда можно найти серию дома, план и, соответственно, межэтажное расстояние!