Среди индивидуальных свойств динамических кривых (follicle) присутствуют также атрибуты Parameter U/V, определяющие UV-координаты точки, из которой произрастает конкретный пучок. Имея эту информацию можно вычислить цвет текстуры, лежащей на поверхности, из которой растут кривые (кстати, не обязательно забирать цвет именно с этой текстуры, можно использовать любую карту) и назначить этот цвет на кривую, то есть на весь пучок.
Как догадались взрослые мальчики, речь идет о небольшом скрипте, поэтому страдающие аллергией на скрипты читатели должны срочно перейти к следующему разделу.
Проделаем небольшое упражнение.
• Создайте полигональную сферу, задайте радиус равным пяти.
• Создайте систему волос на поверхности.
• Откройте Option Box операции Create Hair и задайте Output=Paint Effects, U_Count=20 V_ Count=20, Equalize=off. Это дополнительный (но необязательный) трюк для выращивания волос точно в центре граней.
• Жмите Create.
• Задайте «для красоты» следующие параметры для системы волос hairSysteml: Hair Per Clump=20; Clump Width=1.2. Форму Clump Width Scale можно сделать уже к основанию и шире к концам.
• Выберите сферу и положите на канал Color материала lambertl какую-нибудь цветастую текстуру, например Ramp. Задайте для текстуры ramp1 значение Noise=1.
Задача состоит в том, чтобы назначить тот же самый цвет и на волосы, растущие на сфере. Сохраните файл (texturedHairStart.ma).
• Выберите hairSystem1, а в Script Editor выполните следующие строки:
// перевод выбранной системы волос в отдельные кривые
convertHairSelection "follicles";
// получение списка кривых
string $list[] в 'ls -sl'; string $it;
// цикл по всем кривым
for (Sit in $list) {
// получение UV координат основания кривой float $u = 'getAttr ($it+".parameterU")'; float $v = 'getAttr ($it+".parameterV")';
// запрос цвета в точке с такими коодинатами на текстуре rampl
float $col[] = 'colorAtPoint -о RGB -u $u -v $v rampl';
// назначение полученного цвета на кривую
setAttr <$it+".color") -type double3 ($col[0]) ($col[l}) ($col[2]);
// задание полного индивидуального цвета
setAttr ($it+".colorBlend") 1;
}
Естественно, что вместо текстуры ramp1 можно использовать любую карту. Следует также отметить, что цвет унаследовали не отдельные волосы, а целые пучки, внутри которых все волосы имеют одинаковый цвет. Чтобы написать более изысканный скрипт окрашивающий отдельные волосины внутри пучков в цвет текстуры, понадобится некоторое количество кода и немного времени, поэтому я оставлю это за рамками изложения.
Приведенный выше скриптовый подход позволяет моментально наследовать с текстуры любые свойства системы волос, а не только цвет или «лысость». Это может быть плотность пучков, их упругость, кучерявость и пр.