Creating Interior Visualizations in 3ds Max

Creating Interior Visualizations in 3ds Max

Формат: Video\”flv\” | Project Files | 1,26 Gb

На этом уроке мы рассмотрим процесс создания, и визуализации интерьера от начала и до конца, благодаря чему мы научимся моделировать: стены, мебель, и узнаем, как работает бесплатный плагин Floor Generator. Затем установим освещение и подготовим нашу сцену к финальной визуализации. В завершении поговорим о цветокоррекции в программе Photoshop и добьёмся фотореалистичности изображения.

Все файлы проекта присутствуют.

Continue reading “Creating Interior Visualizations in 3ds Max”

Моделируем дом в 3D Studio MAX 2009

Моделируем дом в 3D Studio MAX 2009

Просмотрев данный видеокурс, Вы научитесь работать в 3D Studio Max 2009, и сможете сами создать модель дома, представленного во введении, или смоделировать дом собственной разработки

Оглавление:

Введение
Урок 1. Учимся быстро работать в видовых окнах
Урок 2. Создаем свои горячие клавиши
Урок 3. Удобное отображение объектов и восстановление сцены
Урок 4. Подготавливаем чертеж для дома
Урок 5. Рисуем контур стен
Урок 6. Выращиваем стены
Урок 7. Готовим вырезы для окон и дверей
Урок 8. Расставляем дверные вырезы по местам
Урок 9. Расставляем оконные вырезы и делаем проемы в стенах
Урок 10. Заделываем дыры в проемах
Урок 11. Корректируем полигоны дома
Урок 12. Стараемся делать основные полигоны четырехугольными
Урок 13. Пристраиваем основание крыльца и ступени
Урок 14. Заготавливаем стойки крыльца
Урок 15. Достраиваем крыльцо
Урок 16. Устанавливаем перила
Урок 17. Располагаем балясины
Урок 18. Накрываем дом крышей
Урок 19. Усложняем конструкцию крыши
Урок 20. Делаем заготовку для гаражных ворот
Урок 21. Доделываем ворота и заезд в гараж
Урок 22. Половина оконной рамы
Урок 23. Продолжаем «плотнические» работы с рамой
Урок 24. Вставляем в раму стекло и выставляем ее по проему
Урок 25. Делаем оконные декоративные ставни
Урок 26. Жалюзи в ставни
Урок 27. Подоконники и наличники
Урок 28. Расставляем двери и опорные столбы
Урок 29. Создаем дверные ручки

Автор: teachvideo
Год: 2009
Размер: 531,7 MB

Скачать: Continue reading “Моделируем дом в 3D Studio MAX 2009”

Autodesk 3D Studio Max 2009 (44 урока)

Autodesk 3D Studio Max 2009 (44 урока)

Производитель: Teachvideo
Год выпуска: 2009

Описание: Данный обучающий курс предназначен для пользователей самой популярной системы 3d моделирования Autodesk 3ds Max 2009.

Знакомство с 3ds max
Урок 1.1. Первый запуск программы
Урок 1.2. Обзор интерфейса программы
Урок 1.3. Работа с главным меню
Урок 1.4. Работа с главной панелью инструментов
Урок 1.5. Работа с окнами проекций
Урок 1.6. Работа с командной панелью
Урок 1.7. Нижняя строка интерфейса

Создание примитивных объектов и сплайнов
Урок 2.1. Создание примитивов при помощи мыши.
Урок 2.2. Создание примитивов. ввод с клавиатуры.
Урок 2.3. Создание улучшенных примитивов.
Урок 2.4. Создание составных объектов при помощи булевых операций
Урок 2.5. Кривые и сплайны. Обзор.
Урок 2.6. Создание сплайнов
Урок 2.7. Создание кривых
Урок 2.8. Создание составных объектов при помощи сплайнов
Урок 2.9. Создание сложных объектов при помощи вращения сплайнов

Редактирование объектов
Урок 3.1. Выделение объектов
Урок 3.2. Перемещение объектов
Урок 3.3. Вращение объектов
Урок 3.4. Изменение габаритов объектов

Модифицирование объектов
Урок 4.1. Простейшие модификаторы. Изгиб.
Урок 4.2. Простейшие модификаторы. Скручивание
Урок 4.3. Работа с контурами. Выдавливание.
Урок 4.4. Модифицирование объектов при помощи редактирования контрольных точек
Урок 4.5. Модифицирование объектов при помощи редактирования полигонов
Урок 4.6. Полигональное моделирование на примере создания стула

Работа со светом
Урок 5.1. Основные типы источников света
Урок 5.2. Ненаправленные источники и свет прожектора
Урок 5.3. Другие типы источников света
Урок 5.4. Настройка источников света
Урок 5.5. Настройка теней

Работа с материалами и текстурами
Урок 6.1. Знакомство с редактором материалов
Урок 6.2. Отображение образцов материалов
Урок 6.3. Браузер материалов
Урок 6.4. Загрузка и применение материалов
Урок 6.5. Создание материалов

Создание анимированной сцены
Урок 7.1. Настройка шкалы времени
Урок 7.2. Создание ключевых кадров
Урок 7.3. Управление воспроизведением анимации
Урок 7.4. Редактирование ключевых кадров
Урок 7.5. Окно треков

Визуализация сцены
Урок 8.1. Рендеринг статической сцены
Урок 8.2. Настройка рендеринга статической сцены
Урок 8.3. Рендеринг динамической сцены

Autodesk 3D Studio Max 2009 (44 урока)
Скачать «Экспресс видеокурс по Autodesk 3ds Max 2009»:

Взрыв текста

Привет всем.

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

Итак, начнем.
1) Создадим для начала сам текст в окне FRONT и применим к нему модификатор BEVEL примерно с такими настройками:

Взрыв текстаВзрыв текста

2) Под нашей надписью создадим PLANE с произвольным количеством сегментов. Из свитка PARTICLE SYSTEMS добавим в сцену PARRAY на месте нашего текста, а в свитке модификаторов выберем текст как OBJECT-BASED EMITTER.

Взрыв текстаВзрыв текста

3) Применяем следующие параметры:

Взрыв текста

4) В списке DEFLECTORS выберем POmniFlect и Gravity c Drag из списка FORCES. Растянем POmniFlect по всей площади нашего PLANE, а Gravity c Drag поставим рядом с текстом и привяжем Систему частиц PArray ко всем нашим дефлекторам с помощью Bind to space worp.

Взрыв текстаВзрыв текста

5) В настройках gravity установите strength 0.5, а в настройках drag установите Damping Characteristics по всем осям – 5. В настройках POmniFlect установите в ячейку Bounce 0.5, а Friction – 50%.
Спрячем наш текст, а к частицам применим материал. Жмем F9 и ждем результат

Взрыв текстаВзрыв текста

Так, как нашел урок на английском случайно на помойке, то не знаю – ни автора, ни сайта. Если найду – обязательно подпишу.

Автор: неизвестен
Перевод урока: ImmortalYAK
Источник: http://demiart.ru

Making of Paragalis

'Making'Making

Этапы создания:
1) 3д-моделирование
2) оптимизация
3) развертка модели
4) настройка света
5) текстурирование

Использование:
3ds max 8/9, Photoshop, Mudbox, Zbrush 3.1, Crazybump, Polyboost

Шаг 1: Формирование общей формы

Для начала хотелось бы сказать, что лучше бы перед началом моделирования, иметь хотя бы черновые наброски будущей модели и в голове составить примерный план распределения полигонов.

Я начал моделирование с простого объекта Box, а потом с помощью Editable Poly обозначил примерную форму модели. Переключаясь с одного вида на другой, я формировал пропорции и форму модели. Так как у меня есть только вид спереди, размеры модели я выдумал сам (это я от лица автора говорю, а не от себя ) На моделирование у меня ушло около часа.

'Making'Making

'Making

Шаг 2: Детализация

Переходя к этапу детализации, старайтесь мыслить наперед, что бы избежать хотя бы некоторых проблем в будущем. Именно поэтому я создал язык отдельно, теперь я легко смогу скрыть его или детализировать, что опять же нам в плюс. Так же я могу двигать язык, обычно он находится довольно далеко и ему необязательно иметь очевидного взаимодействия с тканями во рту.

'Making

Шаг 3: сглаживание

Теперь давайте приступим к сглаживанию. Здесь я воспользуюсь модификатором Turbo Smooth. Обычно перед применением модификатора я смотрю, все ли полигоны состоят из 4-угольников, что бы сглаживание прошло без ошибок.

'Making

Шаг 4: подготовка к экспорту

После того, как я удостоверился, что сглаживание прошло без проблем, я готовлю модель к экспорту. Кстати, я использую модификатор STL check, что бы еще раз убедится, что все прошло гладко. После я применяю Reset Xform. Ну и последнее я перемещаю Pivot в удобное для меня положение. Это полезно, когда вы работаете с многоэлементными моделями (например: космический корабль с множеством деталей)

'Making'Making

Шаг 5: экспорт модели

этот шаг довольно простой, все настройки на скриншоте внизу

'Making'Making

Шаг 6: импорт модели

Опять же здесь все просто, единственное обратите внимание, что все элементы у меня отдельные.Это кстати полезная привычка)

'Making

Шаг 7: создание справочного листа

Дополнительный материал очень важен не только при моделирование, но и при текстурироание. Последние, что я хотел замоделить это зубы. Для начала делайте их не слишком детализированнными.

'Making

Шаг 8: создание цветового баланса

часть 1: Установление \”потока\” деталей

Первое что вы должны сделать, это идентифицировать ваш \”поток\” деталей. Это значит, что вы должны обозначить цветом, где вам нужно детализировать, а где можно и так оставить.

Минимальный уровень деталей: Эта область должна содержать малое количество поверхностных деталей, соответствующих поверхности и/или материальный тип. Обычно эта область составлена из широких секций и не содержит \”визуальный интерес\”. В отношение к Paragalis это кожа.

Умеренный уровень деталей: Эта область составит большую часть деталей относительно всей модели и будет содержать широкий смысл \”визуального интереса\”. Как вы видите на изображение ниже Paragalis главным образом составлен из умеренных деталей, которые содержат мускулы и кожу.

Высокий уровень деталей: Области, которые должны содержать чрезвычайные уровни поверхностной информации. Обычно эти области сведены к минимуму. По отношению к Paragalis я сосредоточил детали высокого уровня у щупальца во роту, наконечнику языка, ногам и частям главной кожи.

Разные модели требуют разного уровня детализации.

'Making

часть 2.

внизу на картинке вы можете видеть как я детализирую свою модель.

Base Mesh: очертание общих форм, пропорций
Rough Sculpt: грубое добавление мускул
Refined Sculpt: продолжаю детализирвать модель
Polished Sculpt: ну и последний штрих) добавление зубов и конечная дороботка модели, детализация кожы.

'Making

Шаг 9: оптимизация

Теперь, когда я закончил свою модель, можно приступить к оптимизации.

Начнем с ZBrush 3.1

В данной программе есть множество инструментов и один из этих инструментов поможет нам построить топологию импортированной модели. Прежде чем я начну вот несколько советов

-Для выбора точек просто кликните на них
-Для удаление точек нажмите Alt и кликните по точке
-Для создание новых углов кликните по ним, желательно ближе к центру.
-Почаще нажимайте на \”А\” что бы посмотреть как будет выглядеть ваша модель
-Для перемещения точек используйте инструмент Move

как только вы отредактируете точки вернитесь в режим рисования (draw)

1) импортируйте вашу модель, как инструмент (см. скриншот)
2) как только я загрузил объект, я выбрал ZSphere и создал ее на рабочей плоскости. Затем нажал \”редактировать\” (edit)

'Making'Making

3) затем во вкладке rigging я выбираю модель( в данном случаи это paragalis). наша модель должна занять место рядом со сферой.

'Making'Making

4) После захожу во вкладку topology и нажимаю Edit Topology. Max strip поставьте на значение 4

'Making'Making

5) зайдите в панель Transform и включите симметрию

'Making'Making

6) Далее я начинаю редактировать топологию модели, соединять точки

'Making

я начал редактирование с головы. пока я стараюсь не думать о деталях. Редактируя, я часто нажимаю на \”А\” и проверяю все ли идет правильно. В конце я экспортирую новую \”геометрию\” в панеле инструментов.

'Making'Making

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

для начала немного о Polyboost. Это 3d-max патч, который поможет вам моделировать, текстурировать, делать развертку и тд. К сожалению его нет в свободном использование, но я все же рекомендую его вам приобрести на www.polyboost.com. (вроде на англ.яз. официальные сайты можно давать ссылки)

я буду использовать инструмент PolyDraw -> PolyTopo и Build

1) я переключаю Drawn on на surface

'Making

2) выбираю PolyTopo для рисования линий на нашей модели.

'Making

3) рисуем линии

'Making

4) для просмотра объекта я нажимаю на правую кнопку мышки и дезактивирую инструмент.

'Making

5) далее я захожу в редактирование точек

'Making

6) выбираю build и начинаю создавать дополнительные вершины

'Making

7) теперь время для соединения точек
я делаю это так: зажимаю шифт и перетягиваю точки

'Making

Если у вас нет zBrush или Polyboost мы можете использовать \”грубую\” оптимизацию. или использовать другие программы: Topogun, Blender, Nex и тд.

Теперь давайте выделим области по степени их движения в анимациях.

'Making

Как вы видите наиболее подвижен хобот.

Ну что же, с деталями мы ознакомились, то что у нас получилось вы можете посмотреть на скриншоте внизу. Как вы видите, наша оптимизированная модель полностью совпадает по форме с детализированной.

'Making'Making

Шаг 10: делаем развертку

Первым делом надо решить, какие текструры будут симмитричными, какие уникальными. Это очень важная часть, так как конечная текстура должна быть размерами 1024х1024, на счету каждый пиксель! На скриншоте внизу вы видете как я поделил свою модель на области, большинство областей симметричны, уникальные только голова и хобот.

Автор обычно удаляет симметричные области и делает развертку отдельно для уникальных частей. Потом естественно соединяет обратно точки. Он считает этот способ более эффективным и легким. Он не описывает подробно создание развертки, но я думаю этот, этот и этот уроки вам помогут.
Конечный результат автора внизу

'Making'Making

Это очень важный шаг, от которого зависит очень многое, поэтому уделите ему побольше времени.
советы:
1) старайтесь размещать текстуру горизонтально или вертикально, так они приятней глазу
2) швы размещайте в труднодоступных местах (например: живот)
3) не экономьте пиксели на места, которые постоянно на виду

Шаг 11: настройка света

Еще один важный шаг это настройка карты нормалей и света.

делаем карту нормалей:

1) первое что я сделал это разбил развертку модели на отражения (см. скриншот внизу). Для этого я использовал инструмент Chugnuts UV.

'Making'Making

2) второе что я сделал, нажал \”О\”.

'Making'Making

3) импортирую высокополигонную модель, настройки импорта на скриншоте

'Making'Making

4) следующим шагом я еще раз убеждаюсь что моя low-poly полнлстью перекрывает high-poly

'Making'Making

5) опять нажимаю \”0\”, у вас должна открыться вкладка \”Render to Texture\”

'Making

6) введите настройки как на картинке

'Making'Making

7) см. картинку ниже

'Making

Теперь все настрйки более менее мы закончили. Нажмите на Pick и выберите высокополигонную модель. То что у нас получилось вы можете видеть на картинке внизу

'Making'Making

Моя задача привести все это в порядок. Зайдите во вкладку Cage и нажмите Reset, введите значение amount около 0,75

'Making'Making

Нажимаем кнопку Render

'Making'Making

на этом этапе я смотрю, что мне надо поправить. Наша задача избавиться от \”красных пятен\”.

'Making'Making

Совет: на данном этапе вы можете скрыть высокополигонную модель.

я зафиксировал проблемные участки, постарался их исправить и сделал повторный рендер. Как вы видите \”красные пятна\” исчезли, чего мы и добивались.
В принципе, все что от вас требуется это \”чистая\” низкополигонная модель, \”чистая\” выскокополигоная модель, ну и конечно же хорошая развертка. Специальных инструментов здесь не надо (их и нет), от вас требуется терпение и усердие.

'Making'Making

Настрйка света:

Держа сохраненную карту нормалей в открытом состоянии, я сделал копию данного файла и переименовал его в Paragalis light map. Дальше я следовал за этими шагами:
1) Я открыл редактор материалов (М) и создал белый материал. Применил его и к low-poly, и к high-poly.

'Making

2) я создал коробку (box) и разместил ее чуть ниже модели. Коробка нужна для того, что бы была тень. Чем ближе коробка, тем темнее тень, и наоборот.

'Making

3) далее я добавил skylight чуть выше модели

'Making

4) теперь нажмите F10, откроется окно Render Scene. я переключился на Light tracer во вкладке Advanced Lighting. Вы можете поэксперементировать с настройками General Settings и Adaptive Under sampling. я советую изучить вам что за что отвечает.

'Making

5) далее я нажал \”0\” для вызова окна Render to Texture. выберите Lighting Map, когда нажмете pick

'Making

6) ну думаю здесь все понятно, мы просто любуемся своей работой

'Making'Making

7) вы также можете создать \”световую карту\” для low-poly.

Шаг 12: текстурирование

Создание Diffuse Map:

для начала я открываю в Photoshop мою \”световую карту\” и группируую части тела модели.

'Making'Making

1) сохраняю psd. Делаем все как на скриншоте

'Making

2) рисуем первичную, \”грубую\” кожу

'Making'Making

3) делаем первые наброски кожы, фундамент для финальной кожы.

'Making

4) работаю с оттенками и цветами

'Making

5) из своей коллекции текстру пытаюсь скомбинировать что-нибудь интересное

'Making

6) эксперементирую с фильтрами в photoshop.

'Making'Making

7) пытаюсь добавить реалистичности.

'Making'Making

8) добавляю яркости

'Making

9) когда кожа более менее готова, перехожу к языку

'Making

10) продолжаю комбинировать, доводить модель до ума.

'Making'Making

11) теперь самое интересное – детализация. Главное не переборщите!

'Making'Making

Создание спектральной карты:

Теперь над Diffuse map я создаю слои в Photoshop. 1-ый слои окрашиваю в синий, 2-ой в зеленый, 3-ий в темно-оранжевый.

'Making'Making

Я убрал цвет, остался только черно-белый эскиз. белый- отражает свет, черный- нет. То что у нас получилось вы можете посмотреть внизу.

'Making'Making

Ну а теперь все карты которые мы сделали мы заносим в 3d-max:

'Making'Making

проверяем то, что у нас получилось, смотрим все ли хорошо с нашей моделью.

Добавляем несколько источников света:

'Making

Внизу я показал как наша модель зависит от настройки карт:

'Making'Making

Наши карты:

'Making

То, что у нас получилось:

'Making'Making
'Making

скачать paragalis

Автор: Marcus Dublin
Перевод: ConteS
Источник: http://demiart.ru

Контроль качества визуализации в mental ray

\"alt\"Урок по настройке  качества визуализации в mental ray. В большинстве своем будут рассмотрены только глобальные настройки сцены. Теоретические вопросы, того или иного процесса рассматриваться будут только кратко или сокращенно.

Естественно урок не даст  четкого алгоритма «Как сделать красиво и быстро» – это невозможно, каждая сцена уникальна, а вот показать в каком направлении искать, думаю, урок поможет.

В уроке будут приводиться некоторые цифровые параметры настроек – относиться к ним нужно философски – это наиболее усредненные цифры, понятие качественно и красиво везде разные.

Рассчитан урок на тех,  кто пошел уже в работе над сценой стадию моделинга, шейдинга и освещения и подошел к стадии визуализации

Рассмотрены будут следующие моменты:

  1. Сглаживание (выборка и фильтрация изображения)
  2. Настройка алгоритма трассировки  BSP (BSP-2)
  3. Алгоритм расчета тени и отступление от глобальных настроек – настройка семплирования полутени и фильтрация текстур
  4. Глобальное освещение
  5. Final Gather 

Рассматриваются настройки с позиции, что мы делаем статичный рендер  (используем исключительно трассировку)

Описание приведено для 3d Max 2009.

Сглаживание

Сглаживание это наверное, один из основных показателей качества при визуализации. Различные виды ступенчатых артефактов, мозаичность, муар, зернистый шум и т.д. как правило, возникают из-за неверно настроенного сглаживания. Поэтому мы с него и начнем.

Пример ступенчатого артефакта на кромках фигуры (получено путем неадаптивной выборки 1 семпл на пиксель и треугольный фильтр размером 1х1)

\"alt\"

Процесс сглаживания происходит за счет выборки и фильтрации относительно каждого пикселя (иногда группы пикселей)  изображения.

Контроль качества процесса сглаживания производиться в настройках Рендеринга («F10», закладка Renderer):

\"alt\" 

рис №1

Процесс начинается с Выборки

В mental ray реализована адаптивная и фиксированная выборка, мы пользуемся адаптивной, когда процесс получения цвета точки усложняется с появлением проблемных зон изображения, что позволяет экономить время и повышать качество выборки.

Суть адаптивной выборки в общем упрощенном варианте поясню на рисунке:

\"alt\" 

рис №2

9 квадратов, на которые разделен рисунок символизируют пиксели будущего изображения, чайник на заднем плане – элемент сцены, которую визуализируем.

Для первой точки изображения (квадрат А) происходит трассировка в направлении сцены 4 лучами, получаются четыре значения цвета, которые сравниваются между собой. Если значение составляющих цветов не превышает допустимого контраста, то выборка для данного пикселя заканчивается  и берется следующий пиксель.

В квадрате «Б» один из четырех лучей должен получить цвет фигуры, который отличается от цвета фона и будет явное превышение допустимого контраста. В этом случае выборка для данной точки усложниться до 4 семплов на пиксель, после чего состоится трассировка каждого с последующей проверкой и если нужно то следующему усложнению до 16 семплов на пиксель. И так до тех пор, пока контраст, полученный в результате трассировки не будет превышать допустимый, либо достижения максимального значения выборки. 

Пороговые значения контраста задаются в поле Spatial Contrast  (рис №1) для каждой составляющей цвета

Минимальное значение выборки задается в поле Samples per Pixel – Minimum.  Значение = 1 обозначает один семпл на пиксель.   Дробные значения  это недостаточная выборка (несколько пикселей на один семпл). При значения больше 1-го,  пиксель сразу делиться на указанное количество семплов.  Выборка начинается именно с указанного минимального значения.

Максимальное значение выборки указывается соответственно в поле Samples per Pixel – Maximum это та граничная глубина по достижению которой выборка закончиться даже если есть превышение порога контраста.

После того как выборка закончиться полученные значения отфильтровываются для каждого пикселя

Фильтрация

Фильтрация зависит от типа фильтра и его размера – размер указывается в точках от центра.

Пример работы четырех из пяти фильтров (размеры фильтра по умолчанию)

\"alt\"

Фильтр типа Бокс – самый примитивный использует средне взвешенное значение цвета взятые согласно размеру фильтра,  фильтры Митчелла и Ланчоса самые качественные (последний наиболее контрастный и наиболее медленный)

Тип фильтра и его размер устанавливается в разделе Filter (рис №1)

Дополнительные опции

Опция Jitter (пер.  дрожание изображения в телевизоре)  дает небольшое смещение внутри выборки, дабы трассировка происходила немного хаотичнее, что позволяет избежать «выбитых» элементов, муара. Как пример на рисунке №2  квадрат «Г» геометрически точно направленные 4 луча в углы семпла пропустят носик чайника между собой,  при включении «дрожания» повыситься шанс пересечься с фигурой. На фоне массива точек это дает результат.

Опция Lock Samples – запомнить выборки, актуальна при обсчете анимации – запоминает информацию о выборках и учитывает ее в следующем кадре.

Опция Bucket Weight – размер мозаичного элемента обсчета (далее бакета) с одной стороны размер не должен влиять на качество обсчета, но есть некоторые расчеты, которые не передаются в соседние бакеты при закачивании обсчета своего. Как, например алгоритм отслеживания краев,  может получиться так, что тонкий элемент сцены определится в одном бакете и не наметится в соседнем – получиться обрыв. Бороться с этим можно только увеличением размера бакета.

Опция Bucket Order – порядок следования бакетов при обсчете сцены теоретически,  если  путь назначает сам рендер, то это позволяет экономить память и время. Вот только необходимости к переназначению на другую схему нет (кроме эстетической). Если нужно посмотреть фрагмент сцены, но не ожидая полного рендеринга, то можно воспользоваться рендером региона.

Опция Frame Buffer Type – тип буфера.  Если вы сохраняете сцену в форматы с динамическим диапазоном (exr ,  hdr) то оставляем 32-битный буфер. Если такие форматы не нужны то 16-битный буфер. Это позволяет экономить оперативную память. Правда есть некоторые пост-эффекты которые хотят наличие 32-битного буфера, так что это тоже надо учитывать.

Итак с назначением параметров сглаживания понятно, теперь можно поговорить о поиске приемлемых значений.

Порог контраста  как правило, используется от 0,03 до 0,05  (меньшее лучше)

Минимально значение выборки думаю следует назначать равным 1 – меньше уже не эффективно изначально, а вот большее это  трата времени на трассировку ровных поверхностей.

Максимальное значение – с этим сложнее и поможет нам диагностическая выборка:

Активировать диагностическую выборку можно из настроек рендера («F10») , закладка «Processing», свиток «Diagnostics»

\"alt\"

Устанавливаем галку Enable и выбираем Sampling Rate. Жмем ренедер:

\"alt\"

Градации серого символизируют глубину выборки – чем ярче тем глубже. Но нас интересует белый цвет – это там где выборка достигла предела и закончилась не по контрастности, а по максимальному ограничению. На краях объектов это допустимо ,  а вот на гладких однотонных поверхностях от белого цвета лучше избавиться, подняв количество семплов в выборке на следующую ступень.  Как правило, значение 16 достаточно для многих сцен.

Из просмотров диагностического рендера легко убедиться, что высокие значения максимальной выборки, как правило, приводят только к увеличению времени просчетов поскольку на краях объектов контраст будет высоким и в этих местах  всегда выполняется максимальная выборка. Как только увеличение выборки позволит убрать белый цвет на ровных поверхностях и плавных переходах цвета на текстурах, можно останавливаться с настройкой максимума. Оставшиеся проблемные места можно попытаться настроить с помощью уменьшения порогового контраста.

Фильтр лучше выбирать Митчелла, а при попытке подчеркнуть контрастность – Ланчоса.

Использовать опцию дрожания Jitter – рекомендуется всегда. 

Алгоритмы трассировки

Использование алгоритма трассировки  позволяет ускорить процесс рендеринга путем упорядочивания объектов сцены и на качество обсчета не влияет.

В mental ray теоретически присутствуют  два алгоритма – Иерархическая сетка и BSP (двоичное разделение пространства) , BSP в свою очередь имеет вариацию BSP-2 (Large BSP). Но в связи с устареванием Иерархической сетки и отсутствием ее выбора в 3D Max 2009 , мы о ней говорить не будем (жалеть тоже)

Настройка алгоритма трассировки производиться  в поле Raytrace Acceleration, закладки Renderer:

\"alt\" 

рис № 3

Алгоритм BSP работает по принципу разделения сцены на объемные контейнеры (вокселы) как и алгоритм иерархической сетки, но BSP допускает внутренне деление вокселов на вокселы нижнего порядка  и так на указанную глубину  Depth или пока в каждом вокселе будет меньше полигонов (листьев дерева BSP) чем указано в параметре Size.

Настраивать алгоритм BSP есть смысл, наверное, только при рендере анимации, в других случаях тратить время на диагностические рендеры и накручивание параметров невыгодно, легче подождать выигрываемые минуты рендеринга один финальный раз.

Тем не менее алгоритм имеет визуальную диагностику по глубине и размеру. Удобнее настраивать по глубине:

\"alt\"

Рендерим сцену:

\"alt\"

Синий и зеленый цвет это минимальная глубина, желтый близкая к пределу и красная предельная.  Большое количество красного цвета на сцене будет говорить о том что BSP не хватает глубины для классификации полигонов и почти везде вокселы достигнув максимальной глубины содержат большое количество листьев, которые не мешает классифицировать еще на несколько порядков. Увеличивая глубину нужно добиться минимальных проявлений красного цвета.

Алгоритм BSP-2 полностью идентичен простому BSP, но у него есть одно очень полезное свойство, которое станет палочкой-выручалочкой любителям громадного числа полигонов. BSP-2 выгружает неиспользуемые вокселы из ОЗУ на диск и по мере надобности подгружает их, тем самым резко снижается скорость рендера, но высвобождается ОЗУ, которой часто не хватает.

Глубина трассировки

Параметры глубины трассировки находятся ниже назначения алгоритма трассировки  (рис №3)  поле Reflection / Refraction

Max. Reflection – это количество отражений луча трассировки, после которого трассировка заканчивается

Max. Refraction – это количество преломлений  через прозрачные (полупрозрачные) поверхности, после которого трассировка заканчивается

Max. Trace Depth – сумма отражений и преломлений после которых все равно трассировка закончиться .

Данные параметры часто упускают из вида, хотя ими можно ускорять процесс предварительных рендеров и после небольшого анализа максимально повысить производительность и качество на финальном. Главное помнить что преломление в объемных предметах происходит дважды – на входе трассирующего луча и на выходе из объекта.

Тени

Спускаемся  в закладке Renderer окна настроек рендера (F10) ниже до свитка «Shadows&Displacement»

Нас интересует алгоритм расчета теней:

\"alt\"

Регулярный (simple)  алгоритм является самым быстрым смысл его состоит  в определении расстояния от источника света до точки трассировки и прозрачности (непрозрачности) пересекающих поверхностей, без учета их последовательности.

Сортирующий (sort) выстраивает объекты  в порядке следования от источника света, делая расчеты более правильными. Как правило для правильного расчета это достаточно (активирован  по умолчанию)

Сегментирующий (Segments) – дополнительно учитывает в расчетах невидимые объекты. Такие как мех, эффекты атмосферных контейнеров, объемные эффекты, более того многие архитектурно-дизайнерские материалы имеют сложные эффекты рассеивания, которые могут учитываться только этим алгоритмом. В противовес всему этому – увеличение времени визуализации.

Отвлекаясь от глобальных настроек посмотрим на качестве тени от поверхностных источников света, которая  настраивается в настройках ИС:

Иногда в области полутени заметен шум, особенно когда тень скользящая и чем дальше от объекта тени, тем шум заметнее:

\"alt\"

Избавиться от этого можно увеличив количество семплов для сглаживания тени в настройках ИС

Параметр Shadow Samples:

\"alt\"

Фильтрация текстур

Параметр фильтрации текстур настраивается не глобально а относительно каждой текстуры в свитке настроек растровой карты:

\"alt\"

По умолчанию установлена пирамидальная фильтрация, которая позволяет избежать шума на поверхностях текстур при обсчете анимации. Смысл ее состоит в том, что на поверхность объекта с текстурой накладывается сетка согласно виду из камеры (чем меньше угол наклона камеры – тем ячейки больше) значение цвета в ячейках сетки интерполируется и получается готовый вид текстуры для нашего вида из перспективы.

К сожалению в 3d Max не поддерживается настройка эллиптической фильтрации, которая бы нам позволила получить максимально четкое изображение. Поэтому в статичных, высоко-четких изображениях  можно наблюдать потерю детальности на текстурах в зависимости от положения камеры, особенно сильно это чувствуется на использовании растровых карт для бампа (неровностей).

Поэтому если наблюдается эффект потери качества текстуры и необходимо выполнить только статичный рендер, то возможно есть смысл отключить фильтр (None) для использования просто точечной выборки при отображении текстуры (что приведет к гарантированному шуму при анимации)

\"alt\"

Глобальное освещение (GI)

Настройка в разделе «Global Illumination» , закладки «Indirect Illumination»

\"alt\"

рис № 4

Допустим у нас в качестве примера есть довольно непривлекательный вариант визуализации:

\"alt\"

Использование глобального освещения больше испортило нам картину чем улучшило. Для того чтобы избавиться от данного недоразумения нужно решить по какому из двух путей пойти в зависимости от требований к GI:

  1. получить от глобально освещения ровный эффект, без подчеркивания мелких деталей
  2. получить максимально контрастный эффект с выделением мелких деталей геометрии.

В первом случае нужно увеличивать радиус семпла сбора фотонов (в простонародье радиус фотонов)  Maximum Sampling Radius (рис 4)  пока семплы не станут равномерно друг на друга накладываться. Такой способ себя оправдывает при нахождении на сцене источников прямого света, которые формируя тени подчеркнут всю геометрию и использования в материалах правильно настроенного шейдера (опции)  Ambient-Occlusion, который подчеркнет затенение от рядом находящийся геометрии.

Во втором случае контрастный эффект получается путем уменьшения радиуса семпла и увеличения количества фотонов Average GI Photons per Light (Рис 4) , как бы рисуя свет и тень с помощью фотонов.

И в том и другом случае возникает вопрос – какой делать радиус семпла и сколько нужно фотонов?  Более того придется еще настраивать параметр Maxsimum Nun Photons per Samples (рис 4) который показывает сколько фотонов нужно учитывать для расчета в семпле сбора из всех прилетевших.

Опять нас спасет диагностический рендер:

\"alt\"

Который позволяет оценить и наполнение  сцены семплами (density)   и яркость эффекта (irradiance)

Произведем в режиме density

\"alt\"

И начинаем с настройки размера площадок Maximum Sampling Radius под требуемую задачу (в первом случае до полного или даже избыточного перекрытии, а во втором подгоняем под размер самых мелких деталей сцены которые надо подчеркнуть) после чего по необходимости добавляем  фотонов Average GI Photons per Light. Добиваемся плавности  нанесения семплов на поверхность объектов (плавные переходы цвета)

Далее переключаемся в режим диагностики irradiance:

\"alt\"

Сейчас нам нужно настроить  оптимальное использование фотонов.  На рисунке мы видим ярко выраженные красные пятнышки  в хорошо освещенных областях, а по идее нам нужно опять добиться плавности эффекта. Как правило такая пятнистость возникает из-за не учета всех фотонов которые попадают на поверхности, поэтому нужно поднимать параметр Maximum Nun Photons per Samples  до подобающих размеров

После чего подправить по ситуации предыдущие параметры, пока не добьемся равномерной засветки с плавным переходом (если не ограничивает геометрия) яркости.  

\"alt\"

Еще стоит заметить о параметре Maximum Nun Photons per Samples – поднимая количество фотонов для учета в семплах, мы подходим к учету всех выпущенных в сцену фотонов, что обеспечивает физически корректную модель освещения. Но бывает, что чисто из эстетических соображений нужно погасить излишне яркие места (красный цвет). В этом случае нужно найти оптимальный размер Maximum Nun Photons per Samples (уменьшая его) когда в местах падения большого количества фотонов они не будут учитываться все,  и в тоже время будет хватать для учета в семплах, которые находятся  в темных местах.

Окончательная сборка Final Gather  (FG)

Настройка в разделе «Final Gather» , закладки «Indirect Illumination»

\"alt\" 

рис №5

Разработчики тут позаботились о нас и сразу прописали профиля работы  Final Gather, сделав ползунок «FG Precision Presets»

Тем не менее можно попытаться адаптировать просчет максимально эффективно.

Основные параметры настройки это

Initial FG Point Density – плотность испускаемых из камеры лучей для получения FG точек  

Rays per FG Point – количество основных  лучей из FG точки

Interpolate Over Num. FG Points – это количество точек для интерполяции,  для физически корректного эффекта должен захватить все точки, повышенное значение параметра результат не ухудшит ( и лишнее время не займет), а понижено приведет ( как и в случае с GI), к понижению интенсивности освещения наиболее ярких мест

В настройке плотности лучей и количества первичных лучей, как всегда поможет диагностический рендер (который надо включить в режим Final Gather).

делаем рендер

\"alt\" 

Судя по документации точки FG от  лучей испускаемых из камеры должны различаться по цвету от точек  первичных  лучей  – но…

В нашем случае точки имеющие одинаковый шаг и четко просматривающиеся на ровных поверхностях, это шаг FG точек (Initial FG Point Density).

Шаг желательно подобрать с таким расчетом чтобы заполнить освещаемые места сцены, естественно, чем плотнее тем лучше, но тратиться больше времени. Поэтому для начала не стоит превышать размера 0,4 – 0,6

Делаем рендер:

\"alt\"

Явственно видны артефакты освещения на местах отдаленных от точек попадания непрямого света в сцену. В этом случае есть смысл увеличить количество лучей  Rays per FG Point либо включить вторичное рассеивание.

Параметр Diffuse Bounces обозначает максимальное количество вторичных лучей, правда на сцене станет несколько ярче, поэтому параметр Weight  (вес вторичных лучей) желательно уменьшить.

Для предыдущего рендера  включен  Diffuse Bounces на 5 и Weight равен 0,6:

\"alt\"

Параметр Interpolate Over Num. FG Points можно установить в 30 или выше, как обычно предлагает программа по умолчанию

Стоит обратить внимание на фильтрацию. В настройках по-умолчанию  включен стандартный режим фильтрации, но не всегда его имеет смысл использовать. Фильтрация служит для сглаживания HDR изображений которые используется на фоне сцены в качестве освещения

\"alt\"

Если в качестве освещения используются стандартные методы (у меня mr sky) либо хорошо подготовленные изображения, то фильтр можно отключить, это уберет излишнюю контрастность и уменьшит время расчетов:

\"alt\"

Маленькое примечание: удобно настроить качество ФГ  на копии сцены с назначенным матовым серым материалом всем объектам, это не позволит учесть отражения и преломления основного луча от точки FG до контакта с поверхностью, но  тем не менее,  будет очень хорошо видно распространение основной массы света. После чего вернуться в оригинал сцены и выставить настройки:

\"alt\"

Тут и закончу свою попытку объять необъятное.

Надеюсь, кто-нибудь найдет для себя что-нибудь полезное.

С Уважением КАА

kaa936@rambler.ru

Автор: Alex Kras
Источник: http://www.render.ru

Анимация мимики по принципу \”Blended Morph\”

Об авторе:

Зовут меня Поклонов Максим, родился живу и тружусь в городе-герое Усть-Каменогорске, том, что в Казахстане. Графикой занимаюсь где-то года с 99, естественно персонажкой занялся много позже, пройдя множество трудностей и поборов кучу глюков, наработал кладезь ценного материала, коим спешу поделиться с вами.

Введение

Привет, друзья. Это снова я, и я хочу порадовать вас, очередным уроком. Я расскажу о довольно мало известном, но весьма интересном приеме анимации мимики при помощи морфинга. В этом уроке я буду использовать уже известного персонажа для мульт заставок игры Air Xonix, изготовленного мной для компании Axysoft. Правда, для демонстрации возможностей данного приема анимации, лицо персонажа пришлось немного модифицировать.

Идея данного способа, скрипты и некоторые специальные наработки были почерпнуты мной в четвертом DVD Пола Нила (Paul Neale) «Facial Rigging Techniques». Эта идея была полностью переработана и настроена под меня, так что на DVD Пола Нила все будет по другому. В этом уроке я покажу только сам способ анимации, ну а если вам этого будет мало, и вы захотите научиться сохранять мимические позы, или научиться делать костную анимацию на профессиональном уровне, и так далее, то ищите DVD Пола Нила (Paul Neale) «Facial Rigging Techniques», он будет для вас невероятно полезен.

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

Сразу определимся со сторонами лево-право. Все что касается лица персонажа, надо понимать с его точки зрения, то есть, что для него лево, то для нас право. Все что не касается непосредственно модели, следует рассматривать с нашей позиции, то есть где лево – там лево, и где право, там соответственно право.

Подготовка модели к анимации

По мере написания урока мне пришлось столкнуться с одной досадной ошибкой. Когда я полностью настроил правую половину лица персонажа, и принялся копировать и зеркалить морф-цели, то выяснилось, что модель содержит скрытые ошибки, не склеенные точки, и даже Pivot немного смещен. В результате мне не удалось правильно отзеркалить цели. И мне пришлось править модель и все начинать по новой. Чтобы избежать подобной ошибки, в самом начале давайте подготовим модель. Для начала преобразуйте ее в Editable Poly (если она таковой не является). Первым делом надо склеить разлепленные точки, их может быть не видно во вьюпорте, но они могут доставить массу неожиданных сюрпризов. Для этого войдите в подобъект «Vertex», выделите все точки модели и примените к ним операцию «Weld». Ее можно вызвать как в панели инструментов Editable Poly, так и Quad Menu (на мышке).

\"alt\"

Обратите внимание, что операция «Weld» вызывается нажатием не на саму надпись, а на изображение окошка, рядом с ней. Это дает нам возможность настроить параметры в окошке с настройками.

\"alt\"

Включите во вьюпорте отображение сетки, и внимательно смотрите, какие точки склеиваются при увеличении параметра Weld Threshold. Этот параметр должен быть минимальным, чтобы склеить только незаметные для глаза точки. В секции Numbers of Vertices можно видеть, что даже при минимальном значении параметра Weld Threshold количество точек стало существенно меньше. После того как точки склеены, визуально проверяем модель, и исправляем все ошибочки, если найдем.

Затем нужно обнулить Pivot. Для этого выделяем модель головы, заходим в панель Hierarchy, выравниваем Pivot по центру модели (Center to Object) и сбрасываем трансформации вращения (Align to World).

\"alt\"

После этого, применяем к модели модификатор Symmetry, делаем Reset XForm (это в панели Utilites) и конвертируем в Editable Poly. Последние операции с Pivot, я заменяю скриптом «Collapse Selected To Poly At Origin» из бесплатного пакета TIM Scripts. Для этого я помещаю модель центром в нулевую точку и применяю скрипт. Он сбрасывает все скрытые трансформации и преобразует модель в чистенький и готовый к анимации Editable Poly и помечает Pivot в кулевую точку, за один клик.

Кости и скин

Способ то конечно морфинговый, да не совсем. Челюсть будет управляться костью. Поэтому начнем работу с создания костей и скина. Вот и делаем. Создаем кости для шеи, головы и челюсти. Челюстную кость линкуем к кости головы. Сустав между шейной и головной костью должен находиться примерно в месте последнего шейного позвонка. Сустав челюсти должен быть в районе уха. В моем случае, сустав челюсти расположен прямо в месте шейного позвонка.

\"alt\"

Теперь применяем модификатор «Skin» и скиним нижнюю челюсть. Помещаем в скин три кости, шейную головную и челюстную. Включаем «Edit Envelopes». Чтобы была возможность работать с точками, в настройках модификатора включаем галку «Vertices». Выбираем енвелоп головы и выделяем все точки. Устанавливаем вес точек на 100%, то есть 1.

\"alt\"

Чтобы удобнее было работать с нижней челюстью, сделайте анимацию кадров на 5, это позволит открывать челюсть, не выходя из редактирования енвелопов. Теперь выбираем енвелоп челюсти и выделяем точки, которые будем ему назначать. Это удобнее делать выделением типа Lasso. Грубо выделяем точки района нижней челючти. Так же выделяем точки полости рта внизу и устанавливаем вес =1. Теперь точки нижней челюсти назначены на кость.

\"alt\"

При выделении мы захватили точки верхней губы, нужно исключить их из выделения. Для этого выделяем точку посередине верхней губы и увеличиваем область выделения кнопкой Grow. Устанавливаем вес на 0 и точки возвращаются под влияние головной кости.

(Копка Grow, как и ряд других нововведений, появилась в скине сравнительно недавно, и в более ранних версиях макса ее не было. Чтобы, все же иметь возможность увеличивать и уменьшать выделение точек в скине, можно воспользоваться скриптами из пакета TIM Scripts, в нем есть эти инструменты).

\"alt\"

А теперь самое интересное. Просто включаем инструмент «Paint Weights» и смягчаем вес точек вокруг рта. (Обратите внимание, галка «Paint Blend Weights» под кнопкой «Paint Weights» должна быть включена).

\"alt\"

С косметическими процедурами закончили, теперь, нужно проделать то же самое в полости рта.

\"alt\"

После этакого «лифтинга» наш «пациент» выглядит уже намного лучше. Если есть необходимость, можно поднастроить некоторые точки индивидуально. Не забудьте удалить ключевые кадры с кости, когда мы привяжем ее к управляющему объекту, они будут только мешать. Все, с челюстью закончили.

Управляющий объект

Для управления мимикой будем использовать некую внешнюю контрольную панель состоящую из отдельных управляющих объектов. Управляющий объект представляет собой сплайновые объекты, прямоугольник с кругом внутри.

\"alt\"

Перемещения круга ограничены стенками прямоугольника. Сделано это при помощи скрипт контроллеров на позиции круга. Управляющий объект, (я буду называть его «Контрол») взят как есть, с DVD Пола Нила (Paul Neale) «Facial Rigging Techniques». Мы не будем строить его, а просто воспользуемся готовым скриптом Пола:

rec=Rectangle length:10 width:10 name:(uniqueName \"FaceControl\") wireColor:[0,0,200] displayRenderMesh:false

cir=circle radius:1 name:(uniqueName \"FaceControlHandle\") wireColor:[200,0,0] displayRenderMesh:false

cir.parent=rec

setTransformLockFlags cir #{3..9}

conName=text text:\"Control\" size:2 wireColor:[0,150,0] pos:[0,5.5,0] alignment:2 displayRenderMesh:false

conName.parent=rec

addModifier conName (meshSelect())

setTransformLockFlags conName #{1..9}

rec.rotation.x_rotation=90

listCon=cir.pos.controller=position_list()

scCon=listCon.available.controller=position_script()

def=attributes clamp

(

      parameters clampP

      (

            l type:#float

            w type:#float

            x type:#float

            y type:#float

      )

)

custAttributes.add scCon def

scCon.l.controller=rec.length.controller=bezier_float()

scCon.l=10

scCon.w.controller=rec.width.controller=bezier_float()

scCon.w=10

scCon.x.controller=listCon[1].x_position.controller=bezier_float()

scCon.y.controller=listCon[1].y_position.controller=bezier_float()

script=\"

x=0

y=0

w=this.w/2

l=this.l/2

if this.x>w then (x=-this.x+w;this.x=w)

if this.xl then (y=-this.y+l;this.y=l)

if this.y<-l then (y=-this.y-l;this.y=-l) [x, y, 0] \" scCon.script=script

Запустив этот скрипт, вы как раз получите готовый контрол, который будет создан в нулевой точке координат.

Обнуление контроллера челюстной кости

Привязку будем осуществлять через Wire Parameters. Но перед тем как делать привязку, кость нужно сначала подготовить. Дело в том, что при привязке кость может получить существенное смещение (кто пользовался Wire Parameters, поймет, о чем я). Для этого мы применим хитрый прием, и условно назовем его обнуление контролера. Не знаю, получится ли у меня объяснить, но смещение кости при привязке на контрол через Wire Parameters будет происходить потому, что кость, в данное время, имеет свое собственное, определенное значение ориентации, при привязке на контрол, это значение стирается, и кости просто передается новое значение которое дает контрол. Чтобы при привязке смещения не происходило нужно применить List контроллер. List контроллер позволяет добавить в список несколько контроллеров, и каждый последующий контроллер в списке будет потомком по отношению к предыдущему. Получается самая что ни на есть обычная иерархия прямо как у костей. Соответственно на первом контроллере у нас останется текущее положение кости, второй контроллер, по отношению к первому будет иметь нулевые координаты, как потомок, к этому контроллеру мы и будем привязываться. То есть текущее значение ориентации кости у нас ни куда не стирается, а остается на первом в списке контроллере, а влияние контрола будет распространяться только на второй контроллер, и значение первого контроллера будет суммироваться со значением контроллера потомка и таким образом мы избегаем непредсказуемой перемены значения при привязке кости на контрол.

Если не понятно, не страшно, перейдем к практике и просто сделаем все то же самое по шагам. Итак, выделяем челюстную кость, и открываем Curve Editor и на Rotation челюстной кости делаем «Assign Controller» и назначаем контроллер Rotation List.

\"alt\"

Так у нас получилось, что на Rotation челюстной кости, назначен List Контроллер. Первым и единственным в списке идет контроллер Euler XYZ. Чтобы добавить в список еще один контроллер, выделяем параметр «Available» и назначаем на него еще один Euler XYZ.

\"alt\"

Таким образом у нас в списке получилось два контроллера Euler XYZ. Теперь давайте зайдем в панель Motion и для удобства дадим имена этим контроллерам. Первый назовем Zero, а второй Animation.

\"alt\"

Если посмотреть ниже, то можно увидеть как раз то, что я пытался объяснить сначала, то есть родительский контролер (Zero) по оси Z имеет значение -101,79, а потомок (Animation), равен 0.

\"alt\"

Теперь, если активировать контроллер Animation и задать на него анимацию, то она просто добавится к той, что «зашита» на первом контроллере. (Кстати таким образом можно делать анимацию для различных объектов как бы по слоям, то есть каждый контроллер в списке может иметь абсолютно свой набор ключей анимации).

Ну все, оставляем активным контроллер Animation и переходим непосредственно к привязке.

Привязка челюстной кости к контролу

Наша задача, теперь заключается в том, чтобы заставить челюстную кость перемещаться под влиянием контрола. При перемещении контрола вверх-вниз, то есть по локальному Y, кость должна вращаться по ее локальному Z. Вот и выделяем контрол, заходим в Wire Parameters и находим там параметр позиции контрола по Y.

\"alt\"

И привязываем этот параметр к Z вращению кости, вот того самого второго контроллера-потомка «Animation».

\"alt\"

При прямой привязке, кость реагирует на перемещения контрола слишком интенсивно, поэтому привязку осуществляем через понижающий множитель, то есть умножаем параметр Y_Position на 0.1

\"alt\"

Теперь не закрывая этого окна привязываем X_Position контрола к Y_Rotation кости с тем же множителем.

\"alt\"

Нижняя челюсть готова.

\"alt\"

Создание и привязка морф-целей для губ

Теперь можно смело приступать к созданию морф-целей. На данном этапе нам нужно создать четыре цели, для управления губами правой половины лица. Для этого просто копируем голову, удаляем с нее все модификаторы. Понадобятся цели с губами «в трубочку», с сильно растянутыми губами, губами выгнутыми вниз и губами выгнутыми вверх.

\"alt\"

Первые цели готовы, можно приступать непосредственно к морфингу. Итак, добавляем модификатор Morpher. Но Morpher должен быть ниже модификатора Skin в стеке, то есть, добавляем его сразу после Editable Poly. И тут же заводим туда первые морф-цели.

\"alt\"

Дам маленький совет, при настройке морф-целей, нужно постоянно перегружать их в морфере, чтобы увидеть изменения. Чтобы миновать это неудобство, включите галку Automatically Reload Targets. Таким образом в риалтайме вы сможете видеть на модели все изменения производимые с морф-целью.

Сразу же копируем и располагаем контролы возле модели и даем им удобные названия.

\"alt\"

Немножко поясню, как работает контрол. В дефолтном положении контрол находится в нулевой точке по локальной оси. Если его смещать вверх, (по Y) то он уйдет в положительную сторону, если вниз, то в отрицательную. Так же, если смещать контрол вправо (по X), он уйдет в полюс, влево, в минус. Соответственно у нас есть четыре морф-цели, которые будут привязываться ко всем трансформациям контрола.

Первым делом привяжем ту цель, которая сводит губы «в трубочку». Выделяем контрол для правой половины губ и идем в Wire Paramrters и находим параметр X позиции.

\"alt\"

Тащим связь на модель и привязываемся к первой морф-цели.

\"alt\"

Влияние контрола получается очень слабым, поэтому параметр X_Position подключаем через множитель. В данном случае этот множитель 20. В принципе могу объяснить почему. Дело в том, что при создании контрола, его размеры указаны так, что сам управляющий объект – круг, можно смещать на 5 единиц от центра в каждую сторону. Пределы работы морф-цели от 0 до 100, оттуда и этот множитель, то есть 5 единиц умножть на множитель 20, получаем как раз 100 единиц на управление морф-целью.

\"alt\"

Не закрывая этого окна привязываем остальные цели. На этот же X_Position привяжем цель которая растягивает губы. То же самое, только учтем, что в этом случае контрол смещается в минус, соответственно знак меняется на отрицательный.

\"alt\"

Теперь, точно так же привязываем цель с губами согнутыми вниз. Привязку делаем по оси Y в отрицательную сторону.

\"alt\"

И цель с губами вверх, в положительную сторону.

\"alt\"

С губами закончили, должно получиться что-то вроде этого.

\"alt\"

Создание и привязка морф-целей для глаз

Дальше, проделываем, то же самое, что и в прошлый раз. Копируем модель головы, и создаем морф-цели для глаз. Поясню, как работают морфы для глаз. Как работает морфинг? Он перемещает точки модели из положения одной цели, в положение другой цели, но перемещение происходит по прямой линии, это значит, если сделать две цели на открытый глаз и на закрытый, и сделать морфинг, то веко пройдет сквозь глазное яблоко.

\"alt\"

Но нам-то нужно чтобы веко закрывалось по окружности, ну или по крайней мере, чтобы оно огибало выпуклый глаз персонажа. Специально для этого сделаем, морф-цель, полузакрытого века, на самой выпуклой точке. А теперь перечислю какие морфы понадобятся (на картинке с низу вверх): полузакрытое веко (для огибания глазного яблока), закрытое веко, сильно открытое веко, закрытое нижнее веко, сильно открытое нижнее веко и еще две дополнительные цели – смещение век вправо и смещение век влево. Эти две дополнительные цели позволят сделать анимацию глаз более живой, используя движение контрола в стороны.

\"alt\"

Назначаем цели морферу и начинаем привязывать их к контролу правого глаза. Тут, пожалуйста повнимательнее, из-за огибания веком глаза нам придется поработать с целью полузакрытого века. По ходу повествования, я обращу на это внимание. Итак выделяем глазной контрол и идем в Wire Paramers.

\"alt\"

Так же, как и в прошлые разы, привязываем Y_Position контрола к первой цели, с полузакрытым веком.

\"alt\"

Эту цель пропишем позже, а пока просто устанавливаем ее на 100% и пишем Y_Position=100

\"alt\"

И связываем остальные цели. На Y_Position вторую цель с закрытым веком.

\"alt\"

На Y_Position третью цель с сильно открытым веком.

\"alt\"

Вот сейчас внимание, займемся первой целью, с полузакрытым веком. Если сейчас подвигать контрол по Y, то видно, что морфинг работает не правильно. Это потому, что мы установили первую морф-цель (с полузакрытым веком) на 100% и она добавляется к остальным целям. Вот и займемся ею. Вернемся к первой цели и пропишем туда вместо «Y_Position=100» такое выраженьице «if Y_Position >= 0 then (100-Y_Position*20) else (100+Y_Position*20)»

\"alt\"

Выраженьице это значит, что если положение контрола по Y больше или равно 0, то значение, которое будет передано на морф цель будет 100% минус положение контрола (от 0 до 5) помноженное на коэфициент 20, иначе (если контрол уйдет вниз), к 100% прибавится значение положения контрола (отрицательное естественно, а значит оно отнимется от 100) помноженное на 20. Например при контроле задранном вверх первая цель будет убрана на 0, а выражение можно понять так: «100%-(5*20)» то есть 0. Или же при контроле опущенном вниз первая цель будет так же убрана на 0, а выражение можно понять так: «100%+(-5*20)» то есть опять же 0. Теперь наши цели будут работать правильно, и глаз будет закрываться корректно, не проходя сквозь глазное яблоко.

Все, заводим остальные цели. Нижнее веко, при опускании контрола, поднимается (коэффициент я поставил не 20, а 15, чтобы веко не поднималось слишком сильно):

\"alt\"

Нижнее веко сильно открывается (опускается) при поднятии контрола вверх:

\"alt\"

Движение век вправо, при движении контрола вправо (в плюс по X)

\"alt\"

Движение век влево при движении контрола влево (в минус по X)

\"alt\"

Веки готовы.

\"alt\"

Создание и привязка морф-целей для бровей

Ну а теперь самый последний и самый сложный этап работы. Брови. Принцип работы бровей будет немного другой, потому что привязка будет не к одной оси, а к двум, поэтому сначала рассмотрим как это работает. При поднятии контрола вверх, поднимается центральная часть брови, при движении поднятого конторла в лево, центральная часть брови опускается, но поднимается левый край брови. При движении поднятого конрола вправо, так же опускаются центр и левый край брови, но поднимается правый край. То же, и при опущенном контроле. Так же, если подвигать в стороны контрол находящийся в нулевой точке, то есть в центре, бровь будет смещаться влево-вправо.

\"alt\"

Таким образом, достигается очень гибкое управление бровью.

Теперь рассмотрим один из узлов более детально. Для примера возьмем цель, которая поднимает центр века вверх. Суть данного приема в следующем: при движении контрола (из нулевой точки) вверх, добавляется морф-цель с поднятой серединой века. Но при движении поднятого контрола в стороны, вес этой цели сходит на ноль. Следовательно, каждая морф-цель века реагирует как на положение контрола по Y, так и по X. Для того, чтобы реализовать привязку к двум осям, вместо одной, нам нужно будет немного изменить контроллеры управляющие каждой целью. Сейчас начнем это делать и походу, я поясню, что конкретно нам дает смена контроллера.

Но сначала, надо сделать сами морфы. Нам нужны следующие цели: (с низу вверх) поднятый центр брови, поднятый носовой край брови, поднятый височный край брови, опущенный центр брови, опущенный носовой край брови, опущенный височный край брови, бровь смещенная к носу, бровь смещенная к виску.

\"alt\"

Теперь добавляем эти цели в Morpher. Постарайтесь сделать последовательность как у меня, целей много, можно легко запутаться в них. Можно править контроллеры. Как я уже говорил, нам нужно сделать управление одной целью, зависимой от двух параметров, X_Position и Y_Position контрола. Сейчас пока начнем делать, а там я растолкую, что к чему. Итак, выделяем модель головы и идем в Curve Editor и находим там наш Morpher. Выделите все цели бровей, кроме двух последних (бровь влево и бровь вправо) и назначьте им контроллер Float List.

\"alt\"

Рассмотрим, что это дает. Как видно на рисунке ниже, у нас в списке есть контроллер Bezier Float. Однако есть и еще один параметр Weight: Bezier Float. Что накое Bezier Float, надеюсь понятно, это собственно контроллер который будет управлять добавлением морф-цели, а вот Weight: Bezier Float ничто иное как вес контроллера в списке. То есть даже если морф-цель в контроллере выведена на 100%, то с помощью веса все равно можно свести ее на нет.

\"alt\"

Если все понятно, то поехали делать связи. (Если не понятно, то все равно поехали, по ходу прояснится). Итак, закрываем Curve Editor, выделяем контрол для правой брови, идем в Were Parameters и проделываем все как в прошлые разы, только привязываем Y_position контрола к Bezier Float первой бровной цели (поднятая середина брови).

\"alt\"

Привязываем Y_Position к контроллеру Float Wire через множитель, как обычно 20.

\"alt\"

А теперь, новый прием, внимание! Тут же, X_Position контрола, привязываем к весу контроллера морф-цели Weight: Float Wire. Выражение для управления весом пмшем:

«if X_Position <=0 then (1+(X_Position*.2)) else (1-(X_Position*.2))» Это выражение означает, что если контрол по X (по горизронтали) ушел в минусовую сторону, то значение которому будет равен вес контроллера будет 1 (это вес контроллера от 0 до 1) плюс положение контрола по X (может быть от 0 до -5) которое помножено на понижающий коэффициент 0.2, иначе, если контрол ушел в плюс, то значение будет 1 (максимальное значение веса) минус положение контрола по X (возможно от 0 до 5) пониженное через множитель на 0.2 Например если контрол поднять вверх, и сдвинуть его влево (в минус), то морф-цель будет равняться 100%, но вес всего контроллера дудет равен 0, и значит и влияние морф-цели будет равно 0, а выражение следует понимать как «1+(-5*0.2)» в итоге 0. Или если контрол поднять вверх и сдвинуть вправо (в плюс), то морф-цель выведется на 100%, но вес, так же будет 0, а выражение можно понять как «1-(5*0.2)» в итоге опять же 0.

\"alt\"

Таким образом, мы привязали управление морф-целью к двум параметрам, к положению контрола по Y и по X.

\"alt\"

Выражения для краев бровей, будут немного отличаться, потому, что нам нужно, чтобы край брови поднимался, только при движении контрола в какую-то одну сторону. Поэтому, не закрывая окна привязываем следующую цель, с поднятым краем брови со стороны носа. Выбираем обратно Y_Position, и вяжем его на Float Wire следующей цели с множителем 20.

\"alt\"

И так же переходим к X_Position и так же, вяжем его на Weight: Float Wire. Только выражение пишем: «if X_Position <=0 then X_Position=0 else X_Position*.2» Надеюсь, к этому времени вы уже стали великими программерами и выражения больше «разжевывать» не придется.

\"alt\"

И опять переходим обратно к Y_Position и вяжем его с Float Wire следующей цели (поднятый височный край брови) с множителем 20.

\"alt\"

И опять вяжем X_Position на Weight: Float Wire и выражение пишем: «if X_Position <=0 then -X_Position*0.2 else X_Position=0»

\"alt\"

С поднятиями брови закончили.

\"alt\"

Опускание брови делается точно так же. Я пошагово объясню что делать но уже обойдемся без картинок.

Итак, разворачиваем в списке следующую цель, опускание центра брови, выбираем Y_Position и вяжем его к Float Wire. Выражение пишем: «-Y_Position*20»

Открываем Weihgts и вяжем X_Position на Weight: Float Wire. Выражение пишем: «if X_Position <=0 then (1+(X_Position*.2)) else (1-(X_Position*.2))»

Цель опускание носового края брови. Выбираем Y_Position и вяжем его к Float Wire. Выражение пишем: «-Y_Position*20»

Открываем Weihgts и вяжем X_Position на Weight: Float Wire. Выражение пишем: «if X_Position <=0 then X_Position=0 else X_Position*0.2»

Цель опускание височного края брови. Выбираем Y_Position и вяжем его к Float Wire. Выражение пишем: «-Y_Position*20»

Открываем Weihgts и вяжем X_Position на Weight: Float Wire. Выражение пишем: «if X_Position <=0 then -X_Position*.2 else X_Position=0»

Готово.

\"alt\"

Привязываем оставшиеся две цели. Они смещают бровь влево-вправо. Тут все просто:

Цель смещение брови к носу. Выбираем X_Position и вяжем его к цели. Выражение пишем: «Y_Position*20»

Цель смещение брови к виску. Выбираем X_Position и вяжем его к цели. Выражение пишем: «-Y_Position*20»

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

\"alt\"

Ура, половину победили! Теперь займемся второй половиной.

Зеркальное копирование морф целей

Ну, что ж, самое трудное позади. Половина лица у нас готова и правильно работает. Осталось сделать все то же самое на другую половину. Для начала нужно подготовить морф-цели, для левой половины лица, но тут есть одно «но». Дело в том, что если просто отзеркалить модель, то ничего не изменится, потому, что точки модели так же зеркалятся, сохраняя значение на позиции. То есть все точки имеют то же имя, и ту же позицию только в зеркальном отображении. Поэтому обычное зеркальное копирование тут не получится. Вот для этого мы и подготавливали модель в самом начале урока.

Для зеркального копирования морф целей, возьмем еще один скрипт Пола Нила:

rightAr=#()

leftAr=#()

centerAr=#()

tempAr=#()

fn getMirrorData threshold:0.05=

(

rightAr=#()

leftAr=#()

centerAr=#()

tempAr=#()

baseObj=$.baseObject

vertSel=(polyOp.getVertSelection baseObj)as array

for i = 1 to vertSel.count do

(

pos=polyOp.getVert baseObj vertSel

if pos.x threshold then

(

append tempAr vertSel

)

)

for i in rightAr do

(

pos=polyOp.getVert baseObj i

found=false

for c = 1 to tempAr.count do

(

cPos=(polyOp.getVert baseObj tempAr[c])*[-1,1,1]

dist=distance cPos pos

if dist< threshold then ( append leftAr tempAr[c] deleteItem tempAr c found=true exit ) ) if found==false then append leftAr undefined ) #(rightAr.count,leftAr.count,centerAr.count) ) fn mirrorMorph symmetry:false= ( for i = 1 to rightAr.count do ( if leftAr!=undefined do

(

Rpos=polyOp.getVert $ rightAr

if symmetry==false then Lpos=polyOp.getVert $ leftAr

polyOp.setVert $ leftAr (((Rpos-$.pos)*[-1,1,1])+$.pos)

if symmetry==false then polyOp.setVert $ rightAr (((Lpos-$.pos)*[-1,1,1])+$.pos)

)

)

if symmetry==false then

(

for i = 1 to centerAr.count do

(

Cpos=polyOp.getVert $ centerAr

polyOp.setVert $ centerAr (((Cpos-$.pos)*[-1,1,1])+$.pos)

)

)else

(

for i = 1 to centerAr.count do

(

Cpos=polyOp.getVert $ centerAr

polyOp.setVert $ centerAr (((Cpos-$.pos)*[0,1,1])+$.pos)

)

)

)

Суть работы скрипта в следующем: сначала мы показываем ему нашу модель (которая должна быть симметричной), и он запоминает ее. Причем запоминает он ее не просто всю, а делит ее пополам (относительно Pivot, примерно как модификатор Symmetry), находит и запоминает противоположные (зеркальные) точки. Для поиска зеркальных точек в самом начале скрипта имеется параметр «threshold:0.01». 0.01 означает, что модель должна быть практически идеально симметричной, в противном случае можно немного увеличить threshold. Потом мы берем любую морф-цель, копируем (обычным способом) и применяем скрипт. Скрипт на основе данных об исходной модели, зеркально перекидывает данные о положении точек с левой половины на правую, а с правой на левую. Таким образом, точки модели остаются в том же порядке, по позиция их зеркально меняется. Вот и получается, что цели зеркалятся корректно.

Теперь объясню, как пользоваться.

    1. Сохраните этот скрипт как «PEN_mirrorVerts.ms» (на самом деле имя не имеет значения). Потом запустите его, через MaxScript->Run Script.

    2. Выделите модель головы, перейдите в стеке модификаторов в самое начало к Editable Poly (модель обязательно должна быть в Editable Poly) и перейдите на уровень Vertex. Выделите точки модели (точки не обязательно выделять все, главное, чтобы были выделены точки затронутые морфингом). В данном случае лучше выделить все точки.

    3. Откройте MaxScript Listener, (MaxScript-> MaxScript Listener, по умолчанию F11) и напишите в нем команду которая запускает функцию запоминающую модель: «getMirrorData()» (без кавычек), нажмите ввод. Выделенные точки модели будут запомнены. Если все верно, то Listener покажет что-то типа этого: «#(384, 384, 78)». Это значит, что 384 точек справа соответствует 384 точкам слева, и 78 точек по центру. Выйдете из подобъекта Vertex.

    4. Теперь возьмите любую морф-цель. Скопируйте ее и разместите рядышком. Она (цель для отзеркаливания) должна выть выделена. Идем в Listener и пишем «mirrorMorph()»(без кавычек), ввод. Оп, модель отзеркалилась!

    5. Если что-то пошло не так и скрипт не сработал, значит либо что-то не так с моделью, либо модель не очень симметричная. Попробуйте запустить скрипт немного увеличив параметр threshold и проделайте все сначала.

Теперь два слова о том, как я пользуюсь этим скриптом. Я сохранил скрипт с именем «PEN_mirrorVerts.ms» и разместил его в 3dsmax root/scripts/startup, написал макроскрипт под названием «PEN_mirrorVerts.mcr»:

macroScript GetMirrorData

buttontext:\"GetMirrorData\"

category:\"Morph Mirror Targets\"

internalCategory:\"Morph Mirror Targets\"

tooltip:\"GetMirrorData\"

(

getMirrorData()

)

macroScript MirrorMorph

buttontext:\"MirrorMorph\"

category:\"Morph Mirror Targets\"

internalCategory:\"Morph Mirror Targets\"

tooltip:\"MirrorMorph\"

(

mirrorMorph()

)

и разместил его в 3dsmax root/UI/MacroScripts. После чего добавил его себе в Quad Menu.

\"alt\"

И теперь, этот инструмент у меня теперь всегда наготове, не надо ничего запускать и ничего писать.

Зеркальное копирования морф-целей

Но вернемся к нашим «зайцам». Выделите модель головы, войдите в подобъект Vertex и выделите все точки. Откройте Listener и напишите в нем getMirrorData(), нажмите ввод.

\"alt\"

Теперь скопируйте морф-цель (можете скопировать сразу все морф-цели), и выделяя их по очереди пишем в Listener mirrorMorph(), нажимаем ввод.

Таким образом нужно подготовить все морф-цели.

Настройка второй половины лица

Когда все зеркальные цели готовы и удобным образом названы (!), добавляем их по порядку в Morpher и начинаем привязывать. Делается это точно так же как и при настройке первой половины. Поэтому растолковывать тут больше ничего не буду. Просто дам параметры для всех остальных целей.

Губы (контрол для левой половины губ)

X_Position –> цель с губами «в трубочку», выражение: -X_Position*20

X_Position –> цель с губами растянутыми в сторону, выражение: X_Position*20

Y_Position –> цель с губами выгнутыми вниз, выражение: -Y_Position*20

Y_Position –> цель с губами выгнутыми вверх, выражение: Y_Position*20

Глаз (контрол для левого глаза)

Y_Position –> цель с полузакрытым верхним веком, выражение: if Y_Position >= 0 then (100-Y_Position*20) else (100+Y_Position*20)

Y_Position –> цель с закрытым верхним веком, выражение: -Y_Position *20

Y_Position –> цель с открытым верхним веком, выражение: Y_Position *20

Y_Position –> цель с закрытым нижним веком, выражение: -Y_Position *15

Y_Position –> цель с открытым нижним веком, выражение: Y_Position *20

X_Position –> цель с веком смещенным в сторону носа, выражение: -X_Position *20

X_Position –> цель с веком смещенным в сторону виска, выражение: X_Position *20

Бровь (контрол для левой брови) Не забываем назначать List контроллеры.

Y_Position –> цель с поднятым центром брови, выражение: Y_Position *20

X_Position –> цель с поднятым центром брови, выражение: if X_Position цель с поднятым краем брови со стороны носа, выражение: Y_Position *20

X_Position –> цель с поднятым краем брови со стороны носа, выражение: if X_Position цель с поднятым краем брови со стороны виска, выражение: Y_Position *20

X_Position –> цель с поднятым краем брови со стороны виска, выражение: if X_Position <=0 then X_Position=0 else X_Position*.2

Y_Position –> цель с опущенным центром брови, выражение: -Y_Position *20

X_Position –> цель с опущенным центром брови, выражение: if X_Position цель с опущенным краем брови со стороны носа, выражение: -Y_Position *20

X_Position –> цель с опущенным краем брови со стороны носа, выражение: if X_Position цель с опущенным краем брови со стороны виска, выражение: -Y_Position *20

X_Position –> цель с опущенным краем брови со стороны виска, выражение: if X_Position <=0 then X_Position=0 else X_Position*.2

X_Position –> цель с бровью смещенной в сторону носа, выражение: -X_Position *20

X_Position –> цель с бровью смещенной в сторону виска, выражение: X_Position*20

Ну вот, наше лицо полностью готово готово! Не забывайте, что вы можете добавлять сюда какие угодно цели, на свое усмотрение, \”губы в дудку\” и другие специальные цели для реализации фонемных особенностей, морщины и даже язык, можно сделать подобным образом. Так что, тут вам все карты, как говорится.

\"alt\"

Если после этого урока у вас не пропало желание работать в 3dsmax, то могу вас поздравить, в ваших жилах течет крепкий бульон! Удачных работ и профессионального роста вам. Пока!

Автор: Максим Поклонов
Источник: http://www.render.ru