Mental ray для 3ds max. Часть 6.

Hair, fur и mental ray.


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

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

В данной статье будут рассмотрены возможности описания (представления) сложных многосоставных динамических систем, реализованные в mental ray, и их практическое применение для моделирования волос, меха и травы в 3ds max 7.5.

Объекты, примитивы и API-функции mental ray

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

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

Представление многосоставного объекта с помощью hair - primitive основывается на использовании Безье-кривых. Каждый элемент составного объекта представляется Безье-кривой степени 1 (линия), 2 (квадратичная кривая) или 3 (кубическая кривая). Каждая кривая аппроксимируется набором прямолинейных сегментов и их вершин, количество которых не может быть меньше, чем степень кривой, умноженная на число сегментов + 1. Эта особенность является следствием математических свойств Безье-кривой. На практике это просто означает, что для построения прямой линии требуется минимум две точки, для простой кривой -три точки, две для определения концов и одна для управления кривизной. Для кубической кривой, состоящей из одного сегмента, требуется не менее четырех точек.
Каждый элемент и его вершины описываются набором скаляров: координаты вершины, координаты вектора нормали вершины, текстурные координаты вершины, координаты векторов смещения вершины (для motion blur), радиус элемента для данной вершины и другими.

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

Если моделировать волосы при помощи геометрических объектов, например - четырехгранных цилиндров, то каждый элемент - волос должен быть представлен как минимум одним цилиндром. Чтобы волос мог иметь кривизну, количество сегментов волоса должно быть не меньше двух и для его представления потребуется два цилиндрических сегмента. Значит, для геометрического описания одного, очень простого по форме, волоска потребуется не меньше 20 треугольников и 13 вершин (восемь треугольников на сегмент + четыре треугольника для верхней "крышки" цилиндра).
Если использовать hair-primitive, то для описания потребуется всего 3 вершины, один радиус и ни одного треугольника. Учитывая, что типичные системы волос на практике могут содержать от нескольких тысяч до нескольких миллионов элементов-волос и гораздо большее количество сегментов на один элемент, становится понятно, насколько прогрессивно описание при помощи hair-primitive.

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

Hair-primitive является фундаментальным объектом mental ray. Для описания многосоставных систем он также важен, как полигонное представление для описания поверхностей. Поэтому, я позволю себе здесь привести точную спецификацию и подробное описание параметров hair-primitive.

object " name "
[ visible [ on|off] ]
[ shadow [ on|off] ]
[ shadowmap [ on|off] ] *3.3
[ trace [ on|off] ]
[ reflection [ mode] ] *3.4
[ refraction [ mode] ] *3.4
[ transparency [ mode] ] *3.4
[ select [ on|off] ]
[ tagged [ on|off] ]
[ caustic [ on|off] ]
[ globillum [ on|off] ]
[ caustic [ mode] ]
[ globillum [ mode] ]
[ finalgather [ mode] ] *3.4
[ box [min_x~~min_y~~min_z~~max_x~~max_y~~max_z] ]
[ motion box [min_x~~min_y~~min_z~~max_x~~max_y~~max_z] ]
[ max displace value ]
[ samples min~~max ] *3.1
[ data null|" data_name " ]
[ tag label_numberint ]
hair
[ material " material_name" ]
radius radius ]
[ approximate segments ]
[ degree degree ]
[ max size size ]
[ max depth depth ]
[ hair n ]
[ hair m hm ]
[ hair t ht ]
[ hair u hu ]
[ hair radius ]
[ vertex n ]
[ vertex m vm ]
[ vertex t vt ]
[ vertex u vu ]
[ vertex radius ]
scalar [ nscalars ]
scalar list
hair [ nhairs ]
hair offset list
end hair
end object

Все параметры между object " name " … hair описывают общие свойства многосоставного объекта и позволяют индивидуально для него определять будет ли он виден в камеру, имеет ли он тень и каков тип тени, его прозрачность, участие в расчетах глобального освещения и motion blur. Раздел общих свойств hair primitive идентичен свойствам обычных объектов и в этом смысле для mental ray он ничем не отличается от геометрического объекта.

Вся специфика заключена в параметрах, заключенных между hair … end hair. Рассмотрим их подробнее.

  • [ material ] - параметр определяет материал, который используется при расчете цвета каждого элемента (например, отдельного волоска) объекта. Материал может определять один цвет для всего элемента целиком, или многосоставной цвет - отдельно для каждого из сегментов элемента. Последнее возможно благодаря тому, что вершины элемента могут иметь текстурные координаты.
  • [ radius ] - задает значение радиуса, общее для всех элементов объекта. Этот параметр может быть заменен значением радиуса элемента или вершины элемента, если они указываются явно. Величина радиуса определяется в объектном пространстве и по умолчанию имеет значение, равное 1.
  • [ approximate ] - число прямолинейных сегментов для аппроксимации каждой Безье-кривой, описывающей элемент объекта, если ее степень 2 или 3. Значение по умолчанию равно 1.
  • [ degree ] - степень Безье-кривой, описывающей элемент объекта. Допустимые значения: 1 (пряма линия), 2 (квадратичная кривая) или 3 (кубическая кривая).
  • [ max size ] - определяет максимальное число элементов - кривых для одного листа BSP - древа, которое используется для ускорения трассировки лучей при рендеринге. Значение по умолчанию равно 32.
  • [ max depth ] - максимальная глубина BSP - древа. Значение по умолчанию равно 20.
  • [ hair n ] - statement (далее вместо "statement" будет употребляться "параметр - флаг"), необязательный параметр, если указывается явно, означает, что каждый элемент - кривая имеет вектор нормали, определяемый тремя скалярами. Индекс n используется для обозначения того, что параметр описывает нормаль элемента. Если для элементов или вершин указываются нормали, то элемент в расчетах пересечений интерпретируется уже не как цилиндр, а как плоский прямоугольник малой толщины.
  • [ hair m hm ] - необязательный параметр - флаг, если указывается явно, означает, что каждый элемент имеет hm векторов смещения для расчета motion blur, каждый из которых определяется тремя скалярами. Индекс m используется для обозначения того, что параметр описывает вектора смещения элемента, hm определяет число векторов, а конкретные значения векторов для каждого элемента будут указаны в списке скаляров (scalar list).
  • [ hair t ht ] - необязательный параметр - флаг, если указывается явно, означает, что каждый элемент имеет текстурные координаты, определяемые скалярами в количестве ht. Индекс t используется для обозначения того, что параметр описывает текстурные скаляры элемента, ht определяет число текстурных скаляров, а их значения будут указаны в списке скаляров.
  • [ hair u hu ] - необязательный параметр - флаг, если указывается явно, означает, что каждый элемент имеет определяемые пользователем скалярные величины в количестве hu. Индекс u используется для обозначения того, что параметр описывает пользовательские скаляры элемента, hu определяет число скаляров, а их значения будут указаны в списке скаляров.
  • [ hair radius ] - необязательный параметр - флаг, если указывается явно, означает, что каждый элемент имеет индивидуальный радиус. Это значение отменяет значение, заданное параметром [ radius ] (см. выше), а его конкретное значения для каждого элемента будет указано в списке скаляров.
  • [ vertex n ] - необязательный параметр - флаг, если указывается явно, означает, что каждая вершина имеет вектор нормали, определяемый тремя скалярами. В этом случае параметр [ hair n ] игнорируется. Индекс n используется для обозначения того, что параметр описывает нормаль вершины.
  • [ vertex m vm ] - необязательный параметр - флаг, если указывается явно, означает, что каждая вершина имеет vm векторов смещения, определяемых тремя скалярами каждый. Параметр [ hair m ] игнорируется. Индекс m используется для обозначения того, что параметр описывает вектора смещения вершины, vm указывает количество векторов, а значение скаляров для каждой вершины будут указаны в списке скаляров.
  • [ vertex t vt ] - необязательный параметр - флаг, если указывается явно, означает, что каждая вершина имеет текстурные координаты, определяемые скалярами в количестве, заданном vt. Индекс t используется для обозначения того, что параметр - флаг описывает текстурные скаляры вершины, vt определяет число текстурных скаляров, а их значения будут указаны в списке скаляров.
  • [ vertex u vu ] - необязательный параметр - флаг, если указывается явно, означает, что каждая вершина имеет vu скаляров, определяемых пользователем. Индекс u используется для обозначения того, что параметр описывает пользовательские скаляры вершины, vu определяет число скаляров, а их значения будут указаны в списке скаляров.
  • [ vertex radius ] - необязательный параметр - флаг, если указывается явно, означает, что каждая вершина имеет свой радиус. Глобальный [ radius ] и [ hair radius ] игнорируются, значение радиуса будет указано для каждой вершины в списке скаляров.
  • [ scalar list ] - список скаляров, содержит значения всех используемых в описании объекта скаляров. Начинается с цифры, указывающей общее числа всех скаляров, далее в определенном порядке следуют значения самих скаляров (координат, нормалей, векторов смещения и так далее).
  • [ hair list ] - список смещений, определяющих начало описания очередного элемента в списке скаляров . Начинается с цифры, указывающей общее число всех элементов объекта + 1, затем следуют значения смещений, определяемых количеством скаляров, используемых для описания элемента и его вершин. Длины смещений элементов будут разными, если количество вершин, составляющих элементы, неодинаково.

Логика такого описания довольно проста. Существует группа глобальных параметров, определяющих свойства для всех элементов объекта - это material, radius, approximate, degree, max size и max depth. Значения этих параметров всегда определены - они либо явно указываются, либо используются их значения по умолчанию, либо определяются mental ray по некоторым внутренним правилам, как например, в случае, если не указан материал.
Все другие параметры необязательны, но если они указаны, то выполняют роль параметров - флагов (statement), сигнализирующих о том, что значение соответствующего параметра имеет индивидуальное значение для каждого элемента или вершины и значение это нужно искать в списке скаляров.
Список скаляров состоит из групп, каждая группа описывает свой элемент. Число скаляров в группе зависит от объявленных явно параметров элемента (hair), объявленных явно параметров вершин (vertex) и количества вершин в каждом элементе.

Вот точная последовательность групп скаляров в scalar list, описывающих каждый элемент многосоставного объекта:

Header (заголовок элемента hair):

  • если параметр - флаг [ hair n ] указывался явно при описании объекта, следуют три скаляра координат нормали (X, Y, Z)
  • если параметр - флаг [ hair m hm] указывался явно при описании объекта, следуют скаляры смещения числом = 3 х hm (по три координаты на вектор: X, Y, Z, X, Y, Z, ...)
  • если параметр - флаг [ hair t ht] указывался явно при описании объекта, следуют текстурные скаляры числом ht
  • если параметр - флаг [ hair u hu ] указывался явно при описании объекта, следуют пользовательские скаляры числом hu
  • если параметр - флаг [ hair radius ] указывался явно при описании объекта, следует один скаляр со значением радиуса элемента

Vertices (группа скаляров, описывающих каждую вершину данного элемента):

  • три обязательно присутствующих скаляра координат вершин элемента, определяющих его положение в объектном пространстве (X, Y, Z)
  • если параметр - флаг [vertex n ] указывался явно при описании объекта, следуют три скаляра координат нормали (X, Y, Z)
  • если параметр - флаг [vertex m vm ] указывался явно при описании объекта, следуют скаляры векторов смещения в количестве = 3 х vm ( по три координаты на вектор: X, Y, Z, X, Y, Z, ...)
  • если параметр - флаг [vertex t vt ] указывался явно при описании объекта, следуют текстурные скаляры числом vt
  • если параметр - флаг [vertex u vu] указывался явно при описании объекта, следуют пользовательские скаляры числом vu
  • если параметр - флаг [vertex radius ] указывался явно при описании объекта, следует один скаляр со значением радиуса для вершины

Каждый элемент может содержать только один заголовок элемента (Header) и несколько блоков скаляров вершин (Vertices).

Пример. Рассмотрим листинг описания объекта, состоящего из трех волосков.

object "hair1"
visible trace shadow
hair
material "mtl"
radius 0.3
degree 1
hair t 2
vertex t 1
scalar [ 42 ]
11 22
0.0 0.0 0.0 1111
0.0 1.0 0.0 1112
1.0 1.0 0.0 1113
33 44
0.0 0.0 0.0 1114
0.0 -1.0 0.0 1115
-1.0 -1.0 0.0 1116
55 66
0.0 0.0 0.0 1117
0.0 -1.0 0.0 1118
-1.0 -1.0 0.0 1119
hair [ 4 ]
0 14 28 42
end hair
end object

Итак:

object "hair1" // объект hair1, уникальный символьный идентификатор (имя) объекта;

visible trace shadow // объект видим в камеру (видим для первичных лучей из камеры), участвует в трассировке лучей (видим для вторичных лучей), и может быть затенен другими объектами;

hair // начало описания свойств элементов hair1;
material "mtl" // назначен материал "mtl";
radius 0.3 // все волоски будут иметь одинаковый радиус;
degree 1 // все волоски - прямые линии;
hair t 2 // каждый волосок имеет 2 текстурных скаляра-координаты;
vertex t 1 // каждая вершина имеет один текстурный скаляр-координату;

scalar [ 42 ] // начало списка значений скаляров, описывающих каждый волосок, 42 - общее число скаляров в списке;
11 22 // первый волосок, заголовок состоит всего из двух текстурных скаляров со значениями "11" и "22", поскольку явно объявлен только параметр hair t 2;
0.0 0.0 0.0 1111 // блок описания первой вершины первого волоска - три обязательных скаляра координат вершины и один текстурный скаляр со значением "1111". Поскольку кроме [ vertex t 1 ] другие вершинные параметры явно не определялись, каждая вершина будет содержать только 4 скаляра;
0.0 1.0 0.0 1112 // скаляры второй вершины первого волоска;
1.0 1.0 0.0 1113 // скаляры третьей вершины первого волоска;

33 44 // заголовок второго элемента;
0.0 0.0 0.0 1114 // скаляры первой вершины второго волоска;
0.0 -1.0 0.0 1115 // скаляры второй вершины второго волоска;
-1.0 -1.0 0.0 1116 // скаляры третьей вершины второго волоска;

55 66 // заголовок третьего элемента;
0.0 0.0 0.0 1117 // скаляры первой вершины третьего волоска;
0.0 -1.0 0.0 1118 // скаляры второй вершины третьего волоска;

hair [ 4 ] // смещения для определения начала записи каждого волоска, 4 = (общее число волосков объекта hair1 + 1) - всего у объекта три волоска;

0 14 28 42 // Смещения. Группа скаляров первого волоска имеет смещение 0 и описывается 14-ю скалярами с 0-го по 13-й. Скаляры второго волоска начинаются с 14-го скаляра и заканчиваются на 27-м. Скаляры третьего элемента начинаются с 28-го и заканчиваются на 41-м, 42-й скаляр - конец списка.

API - функции

Эти функции позволяют определять значения данных hair-объекта и предназначены для программирования шейдеров, реализующих инструменты моделирования и редактирования многосоставных hair-объектов в прикладных программах.

miHair_list *mi_api_hair_begin(void)
Функция mi_api_hair_begin начинает блок описания объекта. Возвращает список miHair_list, который может быть использован для определения глобальных переменных hair-primitive: material, radius, degree, approx, space_max_size, space_max_depth.

miBoolean mi_api_hair_info(int where, char what, int num)
Функция mi_api_hair_info используется для определения параметров-флагов элементов (если where = 0) или вершин (если where = 1). Символьный параметр "what" позволяет определить тип флага, а целочисленный параметр "num" задает число скаляров:

  • what = 'n' - нормаль, num = 0 или 3 скаляра
  • what = 'm' - вектора смещения, num должен быть равен либо 0, либо кратен 3
  • what = 't' - текстурные скаляры, num определяет их число
  • what = 'u' - пользовательские скаляры, num определяет их число
  • what = 'r' - радиус, num должен быть равен либо 0 либо 1

Эта функция за один вызов может определить только один параметр-флаг. Если требуется определить несколько параметров-флагов, mi_api_hair_info должна вызываться столько же раз.

miScalar *mi_api_hair_scalars_begin(int num)
Функция используется для определения общего числа скаляров в списке объекта при помощи целочисленного параметра num. Функция возвращает пустой массив скаляров числом num, значения которых должны быть определены.

miBoolean mi_api_hair_scalars_end(int num)
Функция должна быть вызвана для завершения процесса определения значений скаляров. Она также выполняет некоторые тесты корректности определения массива значений скаляров и возвращает соответствующее булевское значение true в случае успешного прохождения тестов.

miGeoIndex *mi_api_hair_hairs_begin(int num)
Функция определяет величины смещений - количество скаляров, описывающих каждый элемент. Параметр num должен быть равен общему количеству элементов hair-объекта + 1. Возвращает указатель miGeoIndex на массив индексов числом num, значения которых теперь нужно определить при помощи повторных вызовов функции mi_api_hair_hairs_add.

miBoolean mi_api_hair_hairs_add(int si)
Определяет значение индекса смещения для одного очередного элемента. Функция должна вызываться повторно столько раз, сколько всего элементов в объекте плюс еще один раз для определения индекса последнего скаляра, завершающего список скаляров объекта.

miBoolean mi_api_hair_hairs_end(void)
Эта функция завершает определение индексов смещения.

void mi_api_hair_end(void)
Функция завершает определение всего hair - объекта.

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

mi_api_hair_begin
mi_api_hair_info
mi_api_hair_scalars_begin
mi_api_hair_scalars_end
mi_api_hair_hairs_begin
mi_api_hair_hairs_add
mi_api_hair_hairs_end
mi_api_hair_end

Из всего вышесказанного можно сделать следующие выводы об общих свойствах hair-primitive:

  • это полноценный геометрический объект, который может участвовать во всех типах расчета освещения и использовать любые типы материалов
  • он использует процедурное описание элементов и при рендеринге для него строится специальное BSP-древо для ускорения расчетов трассировки лучей, что делает доступным весь арсенал средств трассировки лучей и работы с памятью
  • пространственное положение, материальные свойства и motion blur элемента или его вершины могут быть определено индивидуально
  • возможно использование любых материалов, но может потребоваться и специальный - mib_illum_hair, если элемент тонкий, для правильного расчета и разделения диффузного освещения и подсветок. Цвет и освещение вдоль всей длины элемента вычисляются интерполяцией по его вершинам
  • процедурный bump для радиусов элемента

Хочу подчеркнуть, что mental ray не обладает функциями или шейдерами для конвертирования других объектов, например полигональных, в многосоставные объекты. Он лишь обеспечивает необходимые базисные функции, переменные и фундаментальный hair - примитив для создания инструментов моделирования и редактирования в прикладных программах.

3ds max версий более ранних, чем 7.5, не имеет таких инструментов, встроенных в ядро программы. В 3ds max 7.5 интегрирован Hair and Fur Extension, который впервые позволяет достаточно полно использовать предоставляемые mental ray возможности для работы с многосоставными объектами.

Система волос в 3ds max - Hair and Fur Extension от Joe Alter

Полноценное использование возможностей mental ray для представления и рендеринга многосоставных систем впервые стало возможным в 3ds max 7.5 благодаря появившемуся Hair and Fur Extension (далее - H&F). Давайте поближе познакомимся c его возможностями.

Hair and Fur Extension, являясь расширением 3ds max, основывается на хорошо известной программе Shave and a Haircut, разработанной Joe Alter, Gonzalo Rueda и Dean Edmonds, которая в 2003 году получила "Innovation Award" от Computer Graphic World. Shave and a Haircut заслуженно пользуется высокой репутацией и в настоящее время, как плагин, работает в Maya, C4d, XSI и 3ds max под различными операционными системами - Windows, Linux, Mac OS X. Shave and a Haircut успел сняться во многих фильмах, в том числе и анимационных - достаточно вспомнить впечатляющие "Шрек" и "Шрек-2".

В рабочей среде 3ds max H&F выполняет роль прикладного интерфейса высокого уровня и позволяет работать с многосоставными системами привычными инструментами моделирования, не задумываясь об особенностях их программной реализации. H&F совершенно "прозрачен" для mental ray - при рендеринге hair - объекты могут конвертироваться в "родной" формат описания hair-primitive mental ray, который мы рассмотрели выше.

Создать hair - объект можно либо из геометрических поверхностей практически любого типа: mesh, poly, NURBS, patch, геометрических примитивов 3ds max (куб, сфера и других), либо из набора кривых - сплайнов. Все что требуется сделать - это назначить модификатор Hair and Fur (WSM) геометрическому объекту, группе полигонов или группе сплайнов и затем выполнить настройку параметров модификатора.

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

Hair and Fur (WSM) является неразрушающим модификатором - тип объекта, к которому он применен, остается неизменным. Например, назначение модификатора кубическому примитиву не приводит к его конвертированию в mesh. Элементы hair - объекта могут быть собраны в отдельные группы - пучки травы, локоны и тому подобное. Доступно конвертирование hair-объектов в набор сплайнов или обычные геометрические объекты.

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

Элементы hair-объекта можно "причесывать" с помощью инструментов стилизации специального редактора. В арсенале различные режимы выбора элементов, изменения их положения и размера: Brush, Drag, Shake, Translate, Stand, Puff Roots, Clump, Rotate, Scale и другие. Редактирование выполняется интерактивно в отдельном OpenGL - окне Style Dialog, которое имеет собственный интерфейс и средства навигации сцены, в большинстве идентичные 3ds max.

Элементы hair-объекта могут быть анимированы как единая система, находящаяся под влиянием внешних динамических сил, например гравитации или ветра. В качестве внешних сил используются 3ds max Forces (Space Warp), а расчет анимации учитывает detect collision - расчет столкновений с другими объектами.

При рендеринге объекты H&F рассчитываются как render effect, который автоматически создается и появляется в списке эффектов Rendering > Effects. Возможны три различных режима рендеринга: buffer, geometry и MR prim.

Buffer является собственным режимом рендеринга модуля H&F, элементы многосоставной системы генерируются процедурно во время рендеринга по настройкам модификатора. В этом режиме допустимо дополнительно задавать такие опции, как подготовка рассчитываемого изображения к компоузингу, motion blur, oversampling, определение некоторых свойства источников освещения (разрешение карты Shadow map для расчета тени).
H&F в режиме рендеринга buffer может рассчитывать освещение только от источников 3 ds max типа omni и spot, любые другие источники игнорируются. Единственный допустимый тип теней элементов hair-объекта - Shadow Map. Расчет изображения может быть выполнен только для вида из камеры или перспективного вида. Порядок расчета - сначала изображение объекта, на основе которого создается hair- объект, затем - тени, в последнюю очередь рассчитываются сами элементы многосоставного объекта.

В режиме geometry hair-объект преобразуется в стандартный полигональный объект, состоящий из треугольников. Это самый медленный режим рендеринга, требующий большого количества памяти.

В режиме MR prim H&F преобразовывает свои объекты в mental ray hair-primitive и происходит это непосредственно во время рендеринга. Такое преобразование возможно благодаря библиотеке дополнительных шейдеров, основывающихся на шейдерах и функциях mental ray. Как правило, файл библиотеки находится в диск:\корневой каталог 3dsmax7\mentalray\shaders_autoload\shaders\hairMRShader.dll, файл декларации шейдеров - диск:\корневой каталог 3dsmax7\shaders_autoload\include\ hairMRShader.mi. Библиотека содержит два типа шейдеров - для геометрического представления hair-объектов и для конвертирования материалов в цвет элементов. Основная задача этих шейдеров - описать hair-объекты модуля H&F на "языке" hair-primitive mental ray.

Использование режима MR prim превращает модуль H&F в инструмент моделирования 3ds max, результаты работы которого рендерятся mental ray. При этом сразу становятся доступны все возможности mental ray: hair- объекты освещаются любыми источниками света, рассчитываются все типы освещения, включая global illumination и ambient occlusion, доступны тени и материалы любого типа. Можно также выполнить экспорт сцены в mi - файл для рендера в standalone mеntal ray.

Рассмотрим пример - вырастим мех у крысы. Трехмерная модель выглядит следующим образом:



Сетка модели



Рендер сцены с источниками света

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

Выращивание шерсти из полигонов основывается на генерации модификатором Hair and Fur (WSM) так называемых guide - кривых, или направляющих, которые определяют каркас всего многосоставного объекта.
В текущей версии Hair and Fur для 3ds max 7.5 guides - кривые генерируются в каждой вершине всех треугольников полигонного объекта - одна guide на вершину. Управлять количеством генерируемых направляющих непосредственно нельзя, только через количество треугольников поверхности. На практике количество guides желательно иметь таким, чтобы их можно было редактировать в интерактивном режиме. Например, для Athlon XP@2500 c 1Gb RAM и видеокартой GeForce FX 5700, верхняя планка находится на уровне 10-20 тысяч треугольников на поверхность. Превышение этого числа чревато серьезными "тормозами" при редактировании hair-объекта. Редактор Style Dialog (Hair) работает в отдельном OpenGL окне, поэтому производительность видеокарты напрямую определяет максимальное количество волос, с которым можно работать комфортно.

Оптимальным для выращивания меха из полигонных поверхностей является low-poly объект с хорошей топологией и примененным к нему модификатором Mesh Smooth.
В случае высокополигонных mesh-поверхностей, как в случае данной сцены, можно пойти другим путем - назначить поверхности модификатор Mesh Optimize и уменьшить число треугольников поверхности до приемлемого. Если этот способ по каким-либо причинам не подходит, остается строить волосы по созданному вручную набору сплайнов.

Для данной модели мех нужно вырастить на туловище и голове крысы. Уши, лапы и хвост покрыты "голой" кожей и волос не имеют. Поэтому, модель разделена на несколько отдельных mesh - поверхностей выделением групп полигонов туловища и головы и использованием функции detach.



Две поверхности, на которых будет выращен мех

Также, можно просто выделить нужные полигоны после применения модификатора Hair and Fur и нажать кнопку Update Selections.



Модификатор Hair and Fur,
секция Selection

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

Количество полигонов туловища модели крысы не превышает 20 тысяч, что вполне приемлемо, поэтому сразу применяем к ней модификатор Hair and Fur (WSM).
По умолчанию в видовом окне отображаются hair, а не guides, в соответствии с настройками секции Display модификатора.



Отображение в видовом окне
сгенерированных модификатором волосков

Теперь переходим к секции General Parameters модификатора и устанавливаем следующие значения параметров:



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

Hair Count определяет общее количество элементов для поверхности, к которой применен модификатор Hair and Fur. Для туловища крысы вполне достаточно 65 тысяч волосков, а максимум для одного модификатора составляет 999 999 элементов.

Hair Segments определяет количество сегментов одного элемента - волоска. Поскольку волоски щетины крысы почти прямые, 4 сегментов вполне достаточно. Если волосы длинные и завиваются, потребуется увеличить число сегментов.

Hair Passes реализует свойство прозрачности волосков. Для этой цели волоски рендерятся указанное в Hair Passes число раз в специальные буферы с разным значением seed и затем смешиваются друг с другом. Чем больше Hair Passes, тем прозрачнее волоски. Щетина крысы довольно груба, поэтому всего 2. Для волос человека потребовалось бы 4 или даже больше.

Density - плотность распределения волос по поверхности. Этот параметр интересен тем, что может использовать растровую карту для определения плотности. В данной сцене эта возможность не используется, плотность оставлена равномерной и равной 100 %.

Scale и Cut Length управляют длиной волос (в процентах от общей длины). Задать явное значение длины волос нельзя, соответствующий параметр просто отсутствует в модификаторе. Поэтому, частично управление длиной возложено на указанные параметры, а основной способ изменения длины - масштабирование в редакторе Style Hair. В общем случае длина волос в H&F пропорциональна размеру полигона.

Rand Scale определяет случайное изменение длины для разных волосков. Поскольку щетина крысы на теле довольно равномерна, этот параметр имеет относительно небольшое значение - изменение длины задано в пределах 20 %.

Root Thick и Tip Thick задают толщину волоска у основания (корня) и у верхушки соответственно. Значения этих параметров определены экспериментально, по результатам рендеров, и имеют значения 1 и 0.5. Значения толщин не абсолютны, а пропорциональны размеру полигона, из которого выращивается. Для планирования результата удобно считать, что значения толщины измеряются в процентах от размера полигона.

Displacement позволяет задать смещение основания волоска по высоте относительно поверхности. Этот параметр может быть полезен при присоединении сгенерированных по сплайнам волос к поверхности - для настройки контакта элементов с самым верхним слоем ("землей") в многослойных композициях.

Interpolate - основной режим генерации волос по guides-направляющим. Если галочка установлена, элементы в данной точке поверхности генерируются как результат линейной интерполяции по ближайшим направляющим. Если галочку убрать, hair - объект будет состоять и рендериться только из guide-направляющих.

Теперь выполним предварительную настройку материала волосков. Переходим к секции Material Parameters.



Occluded Amb определяет соотношение фонового освещения и освещения от источников света в сцене. Значение параметра равное 100 задает освещение только от источников сцены и полностью отключает фоновое освещение. Пока оставим значения по умолчанию - 60 % фонового освещения и 40 % от источников сцены (четыре источника типа spot).

Tip color и Root Color - цвет верхушки и основания волоска соответственно. Для меха крысы используется чистый белый цвет для обоих параметров, хотя для корней можно взять чуть более темный оттенок.

Для определения цвета также можно использовать растровые и процедурные карты или материалы, текстурные координаты для элементов наследуются от поверхности, на которой они выращены. Для волос использование материалов почти бессмысленно по причине малой их толщины. Если же в качестве элементов составного объекта посредством Instance Node секции Tools модификатора используются объекты с бОльшей площадью поверхности, для них назначение материалов для определения цвета вполне может иметь смысл. Например, задавая dgs - материал для цвета таких элементов, можно рассчитать фотонную карту для поверхности многосоставного объекта (рендер должен выполняться с использованием MR Primitive).

Если Instance - объекты имеют собственные материалы, они могут быть использованы. Тогда необходимость определения материалов в самом модификаторе отпадает. При использовании растровой карты/материала для определения цвета следует иметь ввиду, что цвет Tip color и Root Color выполняет роль множителя и всегда участвует в определении цвета. Конечный результат будет определяться умножением цвета карты/материала на цвет Tip color и Root Color.

Hue Variations и Value Variations определяют вариации оттенка и интенсивности цвета вдоль длины волосков. Эти параметры нужны для получения многообразия цветовых оттенков элементов, если это необходимо. Поскольку щетина крысы преимущественно белая, значения этих параметров имеют относительно небольшие значения - 10 и 5, можно меньше.

Specular и Glossiness определяют цвет и размер пятна подсветки волосков. Если элементы нужно отделить друг от друга, Glossiness должен иметь довольно большое значение, что обеспечивает маленький размер пятен подсветок. Наоборот, если требуется, чтобы волоски образовывали однородную массу, Glossiness должен быть небольшим. Диапазон значений Glossiness составляет 0 -100.

Self Shadow - самозатенение элементов, или тени от волосков, которые они отбрасывают друг на друга. Параметр имеет силу только в том случае, если рендер выполняется Hair and Fur в режиме buffer. Для рендера сцены выбрано значение 20.
Способ расчета тени, используемый Hair and Fur в режиме buffer, хотя и называется Shadow Map, таковым не является. Обычные Shadow map не в состоянии рассчитать тень для таких тонких элементов, как волосы. В Hair and Fur используется более сложный алгоритм - deep-shadow-accumulation buffers, или расчет буферов теней с накоплением по глубине объектов относительно источника света с учетом прозрачности волос. Этот алгоритм работает только с источниками типа spot. Детализация теней будет зависеть от фокусировки spot и размера Shadow map.
В mental ray аналогичный результат может быть достигнут расчетом ray trace теней в режиме segment. Это почти вдвое медленнее, но зато тени могут быть рассчитаны для источников света любого типа.

Geom Shadow позволяет изменять прозрачность тени, отбрасываемой на мех другими объектами. Также имеет силу только для рендера в режиме buffer.

Mutant Color и Mutant % позволяют определить цвет и процентное содержание волосков с цветом или материалом, отличающимся от основной массы остальных волос. Например, так можно определить "седые" волосы в прическе. В данной сцене эта возможность не используется.

Теперь самое время посмотреть, что у нас получается и выполнить предварительный рендер. Но прежде еще несколько замечаний.
На этой стадии настройки используется тип рендеринга buffer (модификатор Hair and Fur > секция Tools > Render Settings > Hair Rendering Options). В сцене четыре spot-источника, тип теней Shadow map (точнее deep-shadow-accumulation, поскольку тип рендера - buffer).

Итак, первый рендер:



Самое время "причесать" волоски.

Выделяем hair-объект и вызываем окно редактора Style Hair (секция Tools модификатора H&F > Style Hair).



Окно редактора Style Hair

Окно редактора предназначено для стилизации guides и имеет инструменты для выбора элементов, их редактирования, средства навигации и различные дополнительные функции. Подробности можно получить из справки по Style Hair.

Для редактирования меха крысы сначала использовалась "Attenuate the hair length by growth poly size". Эта функция изменяет длину волоска пропорционально размеру полигона, из которого он выращен - меньше полигон, короче волосок. Полезно для мест поверхности, где много складок и изгибов и где волосы естественным образом должны быть короче.

Затем длина всех волос одновременно была отмасштабирована инструментом Brush в режиме Scale до приблизительно нужной длины.

Далее, при включенном расчете столкновений с поверхностью-основой меха (Toggle collisions on), использовалась функция Recomb, которая "прижала" волоски по всей их длине к поверхности-основе и при помощи Brush в режиме Translate выполнено "причесывание" волосков в нужных направлениях. Этот процесс более всего сходен с рисованием, а степень его интерактивности может сделать работу либо удовольствием, либо сущим кошмаром.

Наконец, волоски у основания были немного приподняты от основы при помощи все того же Brush, но в режиме Poof Roots out, который выпрямляет часть волоска по направлению нормали у его корня. Это сделано для придания "прическе" объема, или "распушенности".

В результате всех этих манипуляций было получено следующее:



Редактор Style Hair имеет режим предварительного просмотра, который дает бОльшее представление о конечном результате и считает довольно быстро:



Окно предварительного просмотра Style Hair

Жмем Done, возвращаемся в 3ds max и выполняем рендер.



Волосы образуют излишне однородную, прилизанную массу. Ну так исправим эту однородность! И сделаем это при помощи секции Frizz Parameters:



Секция параметров Frizz

Параметры этой секции позволяют определить завивания (или локоны) элементов-волосков. Для этого нормали двух концевых точек каждого волоска отклоняются на случайный угол. Величина угла определяется заданием в настройках начальных значений углов и по генерируемой внутренним образом карте шума типа Perlin noise. Изгиб вдоль длины волоса рассчитывается интерполяцией нормалей промежуточных точек волоска по нормалям концевых точек.

Frizz Root и Frizz Tip - начальный угол нормалей для корня и верхушки волоска соответственно. Эти величины могут быть постоянны для всех элементов, а их относительная разница определяет отклонение верхушки относительно корня (то есть - степень извилистости волоска). Или могут определяться растровой картой, тогда начальные углы нормалей будут вычисляться по растровой карте. Случайные отклонения, вычисляемые по карте шума, складываются с начальными отклонениями и таким образом получаются результирующие отклонения, свои для каждого элемента.

Можно сказать, что применение Frizz придает каждому волоску уникальную "индивидуальность" - неповторимую форму и положение, а их нулевые значения отключают действие Frizz. Результат изменения параметров Frizz можно наблюдать в видовом окне. Если в секции Dynamics модификатора включен режим Live, изменение параметров Frizz можно анимировать.
Выбранные значения для меха крысы - 45 для корней и 50 для верхушек.

Секция Frizz Parameters также позволяет также управлять частотой шума и анимацией шума. Теперь мех выглядит так:



Влияние параметров Frizz

Аналогичную функцию выполняют и параметры секции Kink, с той только разницей, что карта шума применяется к нормалям всех точек волоса, а не только концевых. В результате можно получить, скажем так, "кудри" вдоль всей длины волоса. То есть, направления нормалей могут изменяться резко, а не плавно, как при интерполяции. Для данной сцены необходимости в этом нет, поэтому соответствующие параметры имеют нулевые значения.

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

Теперь перейдем к параметрам Render Settings (секция Tools модификатора > Render Settings) и изменим режим рендеринга "buffer" на "MR Prim" - это позволит задействовать механизм представления волос средствами mental ray (mental ray должен быть назначен текущим рендером). Тип теней у источников пока оставим Shadow map и изменим значение Material Parameters > Occluded Amb с 40 до 95 (мех освещается только источниками, фон почти не учитывается). Выполним рендер с значениями AA 1 - 4 и фильтром Lanczos.



Рендер в режиме MP Prim c Shadow map

Как видим, мех стал темнее, а волоски выглядит толще и грубее, детализация меньше. Время сравнимо со временем рендера в режиме buffer.
Теперь зададим расчет ray trace теней у источников в режиме segment вместо Shadow map и снова выполним рендер.



Рендер в режиме MP Prim с ray trace тенями

Рендер стал гораздо более детальным за счет более точного расчета теней. Как видим, обычные Shadow map для рендера волос не очень хороши. Время рендера увеличилось почти вдвое. Но зато такие тени могут быть просчитаны у источников любого типа.

Теперь все вышеописанное нужно повторить для поверхности головы. Но сначала нужно применить модификатор Mesh Optimize и уменьшить число полигонов вдвое. Все параметры волос головы идентичны параметрам волос тела.
Еще я добавим sss-fast материал для ушей, лапок и хвоста и немножко glossy для поверхности подставки.

Финальный рендер:



"Лабораторная крыса"

Пир необходимости эту сцену можно экспортировать в mi - файл для рендера в standalone mental ray. Размер файла настроенной сцены в формате 3ds max - около 40 мегабайт. При экспорте в mi (ASCII) размер файла увеличится в несколько раз.

Рендер этой сцены, содержащей около 100 тысяч элементов-волосков и около 50 тысяч полигонов, выполняется довольно быстро. А вот памяти расходуется в пределах 2,7 гигабайт. Это почти предел для Windows XP-32.

Это означает, что для сцен с большим количеством элементов, например - экстерьеров с большой площадью, покрытой травой, придется выполнять раздельный рендер по слоям или по проходам, если мы захотим использовать Hair and Fur для "выращивания" травы. Отдельно - рендер травы и отдельно - остальной сцены.
Количество доступной в 32-битных ОС памяти все чаще становится самым "узким" местом CG - расчетов.



Двухслойная композиция: первый слой - трава, второй - цветы, реализованный при помощи Instance Node H&F. Освещение - Skylight + Spot, ray trace тени, рендер mental ray (HR Prim) c использованием Final Gather (один диффузный отскок)

Итак, благодаря расширению Hair and Fur, реализованы ранее недоступные возможности mental ray, а арсенал средств моделирования 3ds max обогатился мощным набором средств моделирования и рендеринга таких интересных и нужных объектов, как многосоставные системы. Кроме того, Hair and Fur обладает собственными эффектными и эффективными средствами рендеринга, использующими Shadow-depth map buffers. Есть из чего выбрать.

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

Нашли ошибку на сайте? Выделите текст и нажмите Shift+Enter

Код для блога бета

Выделите HTML-код в поле, скопируйте его в буфер и вставьте в свой блог.