Список примеров

Примеры программирования модификатора Unwrap UVW

Содержание

Введение

Модификатор 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).

Редактор модификатора Unwrap UVW

Рис. 1. Объекты с Unwrap UVW (справа) и представления UVW-координат выбранных подобъектов в редакторе модификатора Unwrap UVW

Для раздельного управления координатами следует в окне редактирования UVW-координат выполнить Tools – Pack UVs.
Если объект имеет UVW-координаты, то они сохраняются после применения модификатора Unwrap UVW. Если координаты отсутствуют, то после применения модификатора Unwrap UVW они будут созданы с применением планарного стиля.
Если модификатор Unwrap UVW применен к выборке граней или полигонов, то он сохраняет только UVW-координаты этой выборки.
Модификатор Unwrap UVW работает с треугольными и четырехугольными гранями, а также с полигонами, четырехугольными и треугольными Безье-гранями (рис. 2).

Грани, с которыми работает Unwrap UVW

Рис. 2. Виды граней модификатора Unwrap UVW

При работе с Unwrap UVW модификатор HSDS поддерживает только один уровень детализации – уровень, на котором применен модификатор Unwrap UVW.
Помимо основного назначения, модификатор может быть употреблен для заморозки UVW-координат. Также модификатор Unwrap UVW можно применить с модификаторами, деформирующими поверхность, с целью сохранения соответствия UVW-координат и изменяемой геометрии объекта. Так, если модификатор Unwrap UVW применен поверх модификатора Morpher и использованы планарные карты и последующее редактирование UVW-координат, то последние будут следовать преобразованиям морфинга.

Порядок интерактивного употребления модификатора Unwrap UVW

Интерактивно модификатор Unwrap UVW назначается выбранным объектам (подобъектам) одним из следующих образов:

Работа с базовыми инструментами с применением стандартных стилей генерации UVW-координат ведется в следующем порядке (помимо базовых инструментов, модификатор Unwrap UVW имеет и дополнительные возможности, например такие инструменты, как Pelt и Spline):

  1. Применить модификатор к объекту, снабженному материалом. Установить флажки Show Seam и Show Map Seam, обеспечивающие показ границы выбранной области. При необходимости в диалоге Viewport Configuration можно сбросить флажок Shade Selected Faces (для установки – сброса флажка можно нажать на F2, для перехода от Wireframe к Smooth + Highlights используйте F3).
  2. Перейти на уровень подобъекта Face модификатора Unwrap UVW и выбрать непрерывную последовательность граней с тем, чтобы употребить для нее один из возможных стилей формирования UVW-координат.
  3. Присвоить выборке имя, например ss1, введя его в поле Named Selection Sets главной панели инструментов и нажав для фиксации имени на Enter. Наличие имени необязательно, но полезно для различения имеющихся выборок.
  4. В списке Map Parameters выбрать подходящий тип map-координат, например Planar или Spherical, нажав на одноименную кнопку, и позиционировать Gizmo карты, употребляя кнопки Align X, …, Center и выполняя соответствующие аффинные преобразования. Позиционирование можно начать с нажатия на кнопку Best Align и затем продолжить настройку выравнивания. Все изменения отображаются в видовом порте (должен быть задан режим показа материала в видовом порте и способ вывода Smooth+Highlights). Для обновления видового порта в режиме реального времени установите флажок Constant Update диалога Edit UVWs (в списке Parameters нажать на кнопку Edit, в диалоге Edit UVWs нажать на кнопку Options и найти флажок Constant Update в группе Viewport Options). Результаты настройки Gizmo будут отображаться в диалоге Edit модификатора.
  5. Освободить кнопку с выбранным именем типа map-координат.
  6. Повторить описанные действия для других выборок граней модифицируемого объекта, давая им подходящие имена. Для улучшения наблюдения результата используйте зеленые швы (Parameters – Display Group – установить флажок Show Map Seam).
  7. Открыть диалог Edit UVWs. При необходимости в открывающемся списке панели инструментов диалога вместо заданного по умолчанию фона CheckerPattern (Checker) выбрать карту, примененную для объекта. По умолчанию отображаются все UVW-кластеры. Для работы с нужным кластером можно прибегнуть к фильтрации.
  8. На нижней панели инструментов диалога нажать на иконку Filter Selected Faces, это позволит наблюдать в диалоге только выбранные грани объекта. На главной панели инструментов в списке Named Selection Sets выбрать по имени один из ранее сформированных наборов граней. В диалоге Edit UVWs отобразятся в виде граней UVW-координаты этого набора.
  9. Отредактировать UVW-координаты. В режиме Face выбрать одну или подмножество показанных граней, например в режиме Move, оперируя мышью (ее курсор имеет форму перекрестья), или инструментом Paint (закрасить), перемещая по граням мышь с нажатой левой кнопкой. Переместить выбранные грани, добиваясь требуемого результата. При необходимости выбрать уровень иного подобъекта (Vertex или Edge) модификатора и продолжить редактирование UVW-координат.
  10. Выполнить редактирование UVW-координат других имеющихся наборов граней, выбирая их имена в списке Named Selection Sets.

Полученную карту можно предоставить для последующего редактирования растровой графической программе, например Paint, выполнив следующие действия:

  1. Применить модификатор и получить нужный результат.
  2. В диалоге Edit выбрать меню Tools – Render UVW Template и открыть приведенный на рис. 3 диалог.
    Запись в файл растрового представления UVW-карты

    Рис. 3. Воспроизведение растрового представления UVW-карты

  3. При установке размеров изображения полезно употребить кнопку Guess Aspect Ratio (угадать пропорции сторон). Кроме того, при создании текстуры для игр и других динамических приложений следует устанавливать размер стороны, равным степени числа 2 (256, 512 и так далее).
  4. Нажать на кнопку Render UV Template. Появившееся изображение сохранить в виде файла, нажав на Save Bitmap. Если нужно передать информацию о прозрачности, то следует выбрать подходящий формат выходного файла, такой, как TIF или Targa.
  5. Открыть сохраненное изображение в растровой графической программе и привести его к надлежащему виду, используя в качестве ориентиров имеющиеся ребра (швы). Они, кстати, должны быть устранены из результирующего изображения. Сохранить результат.
  6. В 3ds Max создать материал с диффузионной картой типа Bitmap и открыть полученную текстуру.
  7. Применить материал к объекту, сохраняя модификатор Unwrap UVW и его параметры.

Применение планарного стиля

В примере к плоскости, снабженной стандартным материалом, диффузионная составляющая которого обладает картой из bmp-файла, содержащего изображение чашки на блюдце, применяется модификатор Unwrap UVW. При помощи модификатора этот же образ выводится в углах плоскости (рис. 4).

Работает модификатор Unwrap UVW

Рис. 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

Программирование анимации UVW-координат

В следующем примере выполняется анимация координат текстуры (рис. 5), примененной к сфере.

Анимация координат текстуры

Рис. 5. Два кадра анимации (t = 0f и t = 50f)

Задача решается в 2 этапа. На первом средствами Unwrap UVW создается показанная на рис. 6 UV-карта (ее размер 512*512), которая приводится в редакторе Paint к виду, изображенному на рис. 7 .

Файл с картой UVW-координат

Рис. 6. UV-карта для сферы с выделенными областями

Подготовка текстуры по карте UVW-координат

Рис. 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 изображению.

Модифицированные UVW-координаты полигональной модели сферы

Рис. 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")

Плоская развертка map-координат

Выделение кусков 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).

UVW-карта плоской развертки

Рис. 9. UVW-карта плоской развертки

Составные части UVW-карты

Рис. 10. Швы, соединяющие map-куски

Приведем в редакторе Paint полученное растровое представление UVW-карты к показанному на рис. 11 виду, дав имена кускам, видимым на фронтальной плоскости проекций.

Для редактирования UVW-карты употреблен Paint

Рис. 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.

Применена плоская развертка UVW-координат

Рис. 12. Для создания диффузионной карты использовано приведенное на рис. 11 изображение

Применение стиля Unfold с заданным по умолчанию параметром UnfoldMethod (способ разворота) обеспечивается методом

unw.UnfoldMapNoParams()

Источники

  1. Autodesk® 3ds Max® 2009 MAXScript Reference.
  2. Бартеньев О. В. Программирование модификаторов 3ds Max. Учебно-справочное пособие. – М.:Физматкнига, 2009. – 341 с.

Список примеров

Рейтинг@Mail.ru