вторник, 12 мая 2015 г.

Моделирование перекрученных проводов.


Что-то вроде этого:


Есть заготовка,  в виде сплайна, применяем ей Loft:

 Get Shape указываем небольшой сплайн(см. картинку) и подбираем нужный параемтр Twist.
Далее назначаем EditPoly, на уровне Edge двойными щелчками выделяем грани по всей длине и нажимаем CreateShape:
Дальше все просто, - назначаем модификатор Noise и Sweep:
Да, при необходимости, можно добавить детализации. Вершинам задать тип Smooth и в интерполяции сплайна снять галку Optimize:


среда, 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
Добавьте подпись

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



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

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





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

вторник, 17 марта 2015 г.

Небольшой скрипт для выдавливания полигонов.


Работает только с выделенными полигонами в EditPoly:

---------------------------------
obj = $
SelFace = for i in obj.selectedFaces collect i.index

for f in SelFace do
    (
    polyop.setFaceSelection obj #{f}
    obj.extrudeFaces (random 0.0 1.0)
    )   
---------------------------------
Минимальное и максимальное значение Extrude задается в "random 0.0 1.0"
0 - минимальное, 1 - максимальное, соответственно.

выделяем полигоны

выполняем скрипт (Ctrl+E) и наслаждаемся результатом)

вторник, 3 марта 2015 г.

Как сохранить анимацию для прилинкованных объектов (на примере MadCar).



Необходимо для колес и кузова машины, которые прилинкованы к элементам MadCar создать свою независимую анимацию, чтобы можно было использовать анимированную машинку на других компьютерах без плагина MadCar.

Саму геометрию машины можно пока скрыть.

 Создаем Dummy для каждого колеса и кузова и совмещаем их центры. Назвать Dummy лучше таким образом, чтобы потом не запутаться. Я назвал передние - правое колесо w01_r, левое w01_l, задние - правое w02_r, левое w01_l, кузов машины - body



После создания Dummy их нужно скопировать (для того, что бы потом именно в эти неприлинкованные копии загрузить анимацию):
А первоначальные Dummy прилинковать, соответственно, элементам MadCar.


Выделяем первоначальные Dummy, в закладке motion->trajectories нажимаем collapse.
Величину samples лучше выставить равным количеству кадров в анимации, тогда ключи (в нашем случае поворота и позиции) будут созданы в каждом кадре:

Теперь необходимо в эти ключи записать анимацию:
Animation -> Save animation (не снимая выделения с Dummy)

Далее выделяем наши заранее скопированные копии Dummy и загружаем анимацию
Animation -> Load animation


При загрузке анимации надо нажать Edit Maping:
Затем нехитрая операция. Надо в списках объектов INCOMING и CURRENT выбрать соответствующие объекты с Exposed World Transform и нажать стрелку "<-"


 Эту же операцию проделать для всех остальных.
колес и кузова и нажать Save Mapping и затем Load Motion. Продублированные Dummy должны совместиться с первоначальными.
Спасибо за внимание.