вторник, 22 марта 2016 г.

Текстурирование плоскостей (например жалюзи в большом жилом здании). Texturing blinds in the building.

 Есть заготовка для жалюзи в виде цельной геометрии:

 Разбиваем все на элементы:







Затем, если необходимо, выравниваем пивоты и масштабируем в произвольном порядке:

for i in selection do (i.pivot = i.center; i.pivot.z = i.max.z)
for i in selection do scale i [1,1,random 0.25 1]





 Выравниваем UVW модификатор по нормали:
Источник здесь:
How do I align the UVW_Modifier's Gizmo to a selected face?

Это выжимка из источника:
 --------------------------------------------------start
for i in selection do(
    local theMod = uvwmap()
    theMod.maptype = 0
    addModifier i theMod
)

fn alignUVGizmo theObj =(
faceNormal = getFaceNormal theObj 1
rightVector = normalize (cross [0,0,1] faceNormal)
upVector = normalize ( cross rightVector faceNormal )

theObj.modifiers[1].gizmo.transform = matrix3 rightVector upVector faceNormal [0,0,0]
)

for i in selection do alignUVGizmo i
--------------------------------------------------end
Это результат, на примере одной плоскости:

Осталось выровнять UVW по вершинам.
Для этого можно воспользоваться готовой функцией:

HOW TO ... FIT THE UVW MAPPING GIZMO
Выполняем ее:
for i in selection do UVWMapFit i  i.modifiers[1] useSel:#none





Это результат:


То же можно было бы применить и для штор, но функция подгонки текстурных координат дает немного некорректный результат:


Можно обойтись и без нее. Вот финальный код, в котором просто нажимается кнопка "Fit" для каждого объекта (в нашем случае этого более чем достаточно):


--------------------------start
for i in selection do(
    local theMod = uvwmap()
    theMod.maptype = 0
    addModifier i theMod
)

fn alignUVGizmo theObj =(
faceNormal = getFaceNormal theObj 1
rightVector = normalize (cross [0,0,-1] faceNormal)
upVector = normalize ( cross rightVector faceNormal )
theObj.modifiers[1].gizmo.transform = matrix3 rightVector upVector faceNormal [0,0,0]
)
for i in selection do alignUVGizmo i

max modify mode
arrPlane = selection as array
for i in arrPlane do (
    select i
    h = windows.getChildHWND #max "Fit"
    hc=windows.getChildrenHwnd h[2]
    UIAccessor.PressButton hc[54][1]  --button  "Fit"  
    )
--------------------------end


Работает такой способ, конечно дольше и для нескольких тысяч объектов может занять приличное время.
Параметром 1 или -1 в строке "rightVector = normalize (cross [0,0,-1] faceNormal)" можно менять направление по z.







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

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