Модификатор Unwrap UVW позволяет назначать координаты текстуры (map-координаты, UVW-координаты) выбранным объектам и подобъектам и редактировать назначенные UVW-координаты. Также модификатор может быть употреблен для редактирования существующих UVW-координат объекта. Карты (текстуры) проектируются для Mesh, Patch, Polygon, HSDS или NURBS моделей. Растровые представления полученных карт могут быть отредактированы подходящей графической программой (в примерах используется Paint), а затем использованы в 3ds Max для создания текстур.
Модификатор можно применить совместно с модификатором UVW Map или без него. Совместное применение модификаторов Unwrap UVW и UVW Map оправдано, если необходимо получить доступ к методом формирования map-координат, не имеющимся в модификаторе Unwrap UVW, например к методу Shrink Wrap.
Анимация UVW-координат осуществляется в режиме Auto Key.
После применения Unwrap UVW открытые ребра, или швы, появляются в изображении объекта в видовом порте. При необходимости отображение швов может быть отключено.
Вместо создания большого стека модификаторов UVW Map, примененных к различным выборкам подобъектов, целесообразнее употребить модификатор Unwrap UVW (при необходимости совместно с модификатором UVW Map).
Модификатор применяется с одним или несколькими объектами. В последнем случае редактор модификатора отобразит UVW-координаты всех имеющих его объектов (рис. 1).
Рис. 1. Объекты с Unwrap UVW (справа) и представления UVW-координат выбранных подобъектов в редакторе модификатора Unwrap UVW
Для раздельного управления координатами следует в окне редактирования UVW-координат выполнить Tools – Pack UVs.
Если объект имеет UVW-координаты, то они сохраняются после применения модификатора Unwrap UVW. Если координаты отсутствуют, то после применения модификатора Unwrap UVW они будут созданы с применением планарного стиля.
Если модификатор Unwrap UVW применен к выборке граней или полигонов, то он сохраняет только UVW-координаты этой выборки.
Модификатор Unwrap UVW работает с треугольными и четырехугольными гранями, а также с полигонами, четырехугольными и треугольными Безье-гранями (рис. 2).
Рис. 2. Виды граней модификатора Unwrap UVW
При работе с Unwrap UVW модификатор HSDS поддерживает только один уровень детализации – уровень, на котором применен модификатор Unwrap UVW.
Помимо основного назначения, модификатор может быть употреблен для заморозки UVW-координат. Также модификатор Unwrap UVW можно применить с модификаторами, деформирующими поверхность, с целью сохранения соответствия UVW-координат и изменяемой геометрии объекта. Так, если модификатор Unwrap UVW применен поверх модификатора Morpher и использованы планарные карты и последующее редактирование UVW-координат, то последние будут следовать преобразованиям морфинга.
Интерактивно модификатор Unwrap UVW назначается выбранным объектам (подобъектам) одним из следующих образов:
Работа с базовыми инструментами с применением стандартных стилей генерации UVW-координат ведется в следующем порядке (помимо базовых инструментов, модификатор Unwrap UVW имеет и дополнительные возможности, например такие инструменты, как Pelt и Spline):
Полученную карту можно предоставить для последующего редактирования растровой графической программе, например Paint, выполнив следующие действия:
Рис. 3. Воспроизведение растрового представления UVW-карты
В примере к плоскости, снабженной стандартным материалом, диффузионная составляющая которого обладает картой из bmp-файла, содержащего изображение чашки на блюдце, применяется модификатор Unwrap UVW. При помощи модификатора этот же образ выводится в углах плоскости (рис. 4).
Рис. 4. Модификатор Unwrap UVW: 4-кратное применение планарного стиля
-- Функция setUNW выделяет грани, хранимые массивом arrF,
-- и применяет планарный стиль с лучшим выравниванием
fn setUNW arrF unw pln = (
unw.SelectFacesByNode arrF pln
unw.MappingMode 1 -- 1 - Plane; 4 - Box
unw.MappingAlign 3 -- Best Align
unw.MappingMode 0 -- None
)
delete $*
bMap = bitmapTexture fileName:"D:\3dsMax\Images\cap.bmp"
sMt = standard diffuseMap:bMap showInViewport:true diffuseMapEnable:true
pln = plane length:100 width:200 lengthSegs:10 widthSegs:10
pln.Material = sMt
unw = unwrap_uvw()
unw.BaseMaterial = sMt
unw.SetApplyToWholeObject false
unw.SetViewportOpenEdges true -- Show Map Seam
addModifier pln unw
select pln
max modify mode
subobjectLevel = 3 -- Face
setUNW #{1..6, 21..26, 41..46} unw pln
setUNW #{15..20, 35..40, 55..60} unw pln
setUNW #{155..160, 175..180, 195..200} unw pln
setUNW #{141..146, 161..166, 181..186} unw pln
subobjectLevel = 0
В следующем примере выполняется анимация координат текстуры (рис. 5), примененной к сфере.
Рис. 5. Два кадра анимации (t = 0f и t = 50f)
Задача решается в 2 этапа. На первом средствами Unwrap UVW создается показанная на рис. 6 UV-карта (ее размер 512*512), которая приводится в редакторе Paint к виду, изображенному на рис. 7 .
Рис. 6. UV-карта для сферы с выделенными областями
Рис. 7. UV-карта после редактирования в Paint
UV-карта создается следующим кодом:
-- Этап 1
-- Функция setUNW выделяет грани, хранимые массивом arrF,
-- и применяет планарный стиль с лучшим выравниванием
fn setUNW arrF unw ob = (
unw.SelectFacesByNode arrF ob
unw.MappingMode 1 -- 1 - Planar; 4 - Box
unw.MappingAlign 3 -- Best Align
unw.MappingMode 0 -- None
)
delete $*
-- Создаем для наглядности материал с диффузионной составляющей, имеющей карту Checker
-- Материал применяем к сфере
dMp = checker()
dMp.Coordinates.U_Tiling = dmp.Coordinates.V_Tiling = 4
sMt = standard diffuseMap:dMp showInViewport:true diffuseMapEnable:true
sph = sphere radius:30 segs:32 material:sMt
-- Использем модификатор Unwrap UVW со сферой
unw = unwrap_uvw()
addModifier sph unw
unw.SetConstantUpdate true
select sph
max modify mode
-- Создаем 5 областей с планарным стилем
subobjectLevel = 3 -- Face
setUNW #{1..288} unw sph -- Верхушка сферы
setUNW #{377..380, 441..444} unw sph
setUNW #{389..392, 453..456} unw sph
setUNW #{575..578} unw sph
setUNW #{635..646} unw sph
-- Просматриваем результат
unw.Edit()
subobjectLevel = 0
-- Генерируем приведенную на рис. 6 UV-карту
unw.SelectFacesByNode #{} sph
unw.Renderuv_width = 512
unw.Renderuv_height = 512
unw.Renderuv_force2Sided = false
unw.Renderuv_visibleEdges = off
fNm = "d:/nwrp5.bmp"
unw.Renderuv fNm
После исполнения кода создается UV-карта (см. рис. 6), которая отвечает приведенному на рис. 8 изображению.
Рис. 8. Сфера с модификатором Unwrap UVW
При необходимости созданный материал может быть приписан модификатору Unwrap UVW:
unw.BaseMaterial = sMt
unw.SetApplyToWholeObject true
При одновременном использовании кода и интерактивной техники фильтрация выборки обеспечивается методом
unw.FilterSelected()
При создании UV-карты можно задать цвет и способ ее заполнения:
unw.Renderuv_fillColor = color 150 150 150
unw.Renderuv_fillMode = 1
На втором этапе созданная карта цветов (см. рис. 7) используется в качестве материала сферы. Применяемый со сферой модификатор Unwrap UVW употребляется для анимации координат текстуры, отвечающим созданным на первом этапе областям. Результат обеспечивается следующим кодом:
-- Этап 2
-- Функция mkMv выделят последовательно хранимые массивом arrV вершины UVW-карты
-- и перемещает выделенную вершину на заданную в массиве arrP величину
fn mkMv arrV arrP unw ob= (
for k = 1 to arrV.Count do (
unw.SelectVerticesByNode arrV[k] ob
unw.MoveSelected arrP[k]
)
)
delete $*
fNm = "d:/nwrp5_.bmp"
dMp = bitmapTexture fileName:fNm
sMt = standard diffuseMap:dMp showInViewport:true diffuseMapEnable:true
sph = sphere radius:30 segs:32 material:sMt
unw = unwrap_uvw()
addModifier sph unw
select sph
max modify mode
dx = 0.07
dy = 0.03
ky = 0.015
my = 0.02
ny = 0.005
py = 0.01
max tool animmode
set animate on
sliderTime = 0f
subobjectLevel = 2 -- Edge
-- Анимация координат области текстуры, отвечающей верхушке сферы
-- Выделяем группу ребер UVW-карты
unw.SelectEdgesByNode #{477, 480, 483, 486, 489} sph
-- Выполняем смещение выделенной группы ребер UVW-карты
unw.MoveSelected [0, -0.04, 0]
unw.SelectEdgesByNode #{510, 513, 516, 519, 522} sph
unw.MoveSelected [0, -0.04, 0]
unw.SelectEdgesByNode #{498, 501} sph
unw.MoveSelected [0, 0.01, 0]
-- Анимация координат нижележащих областей текстуры
-- Работа ведется с вершинами UVW-карты
-- Каждый вызов функции mkMv обеспечивает задание координат вершин UVW-карты одной ее области
subobjectLevel = 1 -- Vertex
mkMv #(#{277}, #{211}, #{213}, #{279}) #([-dx, -dy, 0], [-dx, dy, 0], [dx, dy, 0], [dx, -dy, 0]) unw sph
mkMv #(#{283}, #{217}, #{219}, #{285}) #([-dx, -dy, 0], [-dx, dy, 0], [dx, dy, 0], [dx, -dy, 0]) unw sph
mkMv #(#{377}, #{378}, #{379}, #{380}, #{381}, #{382}, #{383}, \
#{350}, #{349}, #{348}, #{347}, #{346}, #{345}, #{344}) \
#([0, ky, 0], [0, py, 0], [0, -ky, 0], [0, -my, 0], [0, -ky, 0], [0, py, 0], [0, ky, 0], \
[0, dy, 0], [0, my, 0], [0, ny, 0], [0, ny, 0], [0, ny, 0], [0, my, 0], [0, dy, 0]) unw sph
sliderTime = 50f
subobjectLevel = 2 -- Edge
unw.SelectEdgesByNode #{477, 480, 483, 486, 489} sph
unw.MoveSelected [0, 0.04, 0]
unw.SelectEdgesByNode #{510, 513, 516, 519, 522} sph
unw.MoveSelected [0, 0.04, 0]
unw.SelectEdgesByNode #{498, 501} sph
unw.MoveSelected [0, -0.01, 0]
subobjectLevel = 1
mkMv #(#{277}, #{211}, #{213}, #{279}) #([dx, dy, 0], [dx, -dy, 0], [-dx, -dy, 0], [-dx, dy, 0]) unw sph
mkMv #(#{283}, #{217}, #{219}, #{285}) #([dx, dy, 0], [dx, -dy, 0], [-dx, -dy, 0], [-dx, dy, 0]) unw sph
mkMv #(#{377}, #{378}, #{379}, #{380}, #{381}, #{382}, #{383}, \
#{350}, #{349}, #{348}, #{347}, #{346}, #{345}, #{344}) \
#([0, -ky, 0], [0, -py, 0], [0, ky, 0], [0, my, 0], [0, ky, 0], [0, -py, 0], [0, -ky, 0], \
[0, -dy, 0], [0, -my, 0], [0, -ny, 0], [0, -ny, 0], [0, -ny, 0], [0, -my, 0], [0, -dy, 0]) unw sph
sliderTime = 100f
subobjectLevel = 2 -- Edge
unw.SelectEdgesByNode #{477, 480, 483, 486, 489} sph
unw.MoveSelected [0, -0.04, 0]
unw.SelectEdgesByNode #{510, 513, 516, 519, 522} sph
unw.MoveSelected [0, -0.04, 0]
unw.SelectEdgesByNode #{498, 501} sph
unw.MoveSelected [0, 0.01, 0]
subobjectLevel = 1
mkMv #(#{277}, #{211}, #{213}, #{279}) #([-dx, -dy, 0], [-dx, dy, 0], [dx, dy, 0], [dx, -dy, 0]) unw sph
mkMv #(#{283}, #{217}, #{219}, #{285}) #([-dx, -dy, 0], [-dx, dy, 0], [dx, dy, 0], [dx, -dy, 0]) unw sph
mkMv #(#{377}, #{378}, #{379}, #{380}, #{381}, #{382}, #{383}, \
#{350}, #{349}, #{348}, #{347}, #{346}, #{345}, #{344}) \
#([0, ky, 0], [0, py, 0], [0, -ky, 0], [0, -my, 0], [0, -ky, 0], [0, py, 0], [0, ky, 0], \
[0, dy, 0], [0, my, 0], [0, ny, 0], [0, ny, 0], [0, ny, 0], [0, my, 0], [0, dy, 0]) unw sph
max tool animmode
set animate off
sliderTime = 0f
subobjectLevel = 0
playAnimation()
Анимацию можно выполнить, задавая разные позиции вершин UVW-карты в различных точках временной шкалы
subobjectLevel = 1
arrV = #(347, 349)
for vrt in arrV do unw.SetVertexPositionByNode 0f vrt [0, 0.5, 0] sph
Область UVW-карты сфера, например отвечающую верхушке сферы, можно сформировать, используя и иной стиль задания map-координат, например Pelt (шкура):
unw.MappingMode 5
В таком случае потребуется интерактивное вмешательство:
messageBox("Press Start Pelt, next Stop Pelt and then Commit")
Выделение кусков UVW-карты можно автоматизировать, употребив в модификаторе Unwrap UVW один из трех способов деления UVW-карты:
В случае Flatten Mapping каждый кусок UVW-карты имеет сгиб, не превышающий значения, заданного параметром Face Angle Threshold (пороговое значения угла сгиба).
Параметр Spacing задает расстояние между кусками.
Параметр Normalize, если равен true, приведет значения координат текстуры в диапазон [0, 1].
Параметр RotateClusters, если равен true, выполнит поворот кусков с целью уменьшения занимаемой ими площади.
Параметр FillHoles, если равен true, обеспечит заполнение имеющихся между кусками пустот.
По умолчанию куски сортируются снизу вверх и слева направо.
Применим плоскую развертку к сфере:
delete $*
sMt = standard diffuse:white showInViewport:true diffuseMapEnable:true
sph = sphere radius:30 segs:32 material:sMt
unw = unwrap_uvw()
addModifier sph unw
select sph
max modify mode
subobjectLevel = 3
unw.SelectFacesByNode #{1..960} sph
unw.Edit()
-- Плоская развертка с заданными по умолчанию параметрами
unw.FlattenMapNoParams()
-- Воспроизведение UV-карты
unw.Renderuv_width = 512
unw.Renderuv_height = 512
unw.Renderuv_force2Sided = false
unw.Renderuv_visibleEdges = off
fNm = "d:/nwrp9.bmp"
unw.Renderuv fNm
После выполнения кода создает растровый образ UVW-карты (рис. 9), на сфере появляются соединяющие куски швы (рис. 10).
Рис. 9. UVW-карта плоской развертки
Рис. 10. Швы, соединяющие map-куски
Приведем в редакторе Paint полученное растровое представление UVW-карты к показанному на рис. 11 виду, дав имена кускам, видимым на фронтальной плоскости проекций.
Рис. 11. Куски, наблюдаемые на фронтальной плоскости проекций, имеют имя или номер
Это изображение употребляется для создания диффузионной карты материала, который затем применяется к сфере. Модификатор Unwrap UVW применяется с теми же параметрами, что и при создании плоской развертки UVW-карты:
delete $*
fNm = "d:/nwrp9_.bmp"
dMp = bitmapTexture fileName:fNm
sMt = standard diffuseMap:dMp showInViewport:true diffuseMapEnable:true
sph = sphere radius:30 segs:32 material:sMt
unw = unwrap_uvw()
addModifier sph unw
select sph
max modify mode
subobjectLevel = 3
unw.SelectFacesByNode #{1..960} sph
unw.FlattenMapNoParams()
subobjectLevel = 0
Полученный результат можно наблюдать на рис. 12.
Рис. 12. Для создания диффузионной карты использовано приведенное на рис. 11 изображение
Применение стиля Unfold с заданным по умолчанию параметром UnfoldMethod (способ разворота) обеспечивается методом
unw.UnfoldMapNoParams()