?

Log in

No account? Create an account
 
 
06 June 2012 @ 12:01 pm
Renderman tutorial :Раскрасить дерево c помощью переменной  
Распостраненная ситуация — много похожих объектов, и хочется их как то разнообразить по цвету или по фактуре, а возможно даже назначить разные текстуры. Можно, конечно, сделать каждому объекту свой материал и перекрасить их вручную. Но если таких объектов больше 100?..
Для этого в Renderman используются переменные, (primitive variables) например Rman Prim Var Color и Rman Prim Var Float. В этом примере я возьму Rman Prim Var Color, которая позволит управлять цветом объекта.






Показательный пример — листья на деревьях. Это может быть много камней, разбросанных в сцене, окошки в многоэтажном здании, итд итп. Для этой сцены я нарисовала дерево с помощью Paint Effects, а точнее -- взяла готовое дерево из Visor и немного его подредактировала на свой вкус (степень раскидистсти веток, насыщенность листьями — все это очень просто управляется в атрибутах дерева.). Window-->General editors-->Visor-->trees-->keyakkiStreet
Renderman for Maya 3.0 позволяет считать paint effects, что, несомненно очень хорошо. Но качество таких объектов очень низкое, и для использования метода с переменными не подходит, так как листья не являются отдельными геометрическими объектами, а представляют собой один объект — "дерево с листьями". Поэтому конвертирую дерево в полигоны.
Modify-->Convert-->Paint Effects to polygons.  Таким образом, получается группа с геометрией (ствол, листья).
В hypershade при конвертации создаются материалы листьев и ствола. Управление цветом происходит на уровне материала.
С исходным материалом листья выглядят так:



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

1. Создать Rman Prim Var Color ноду и воткнуть ее в слот Color материала листьев. Также нужно отцепить текстуру с зеленым листом от всех связей, чтобы зеленый ни на что не влиял и можно было бы полностью контролировать цвет.
В переменной нужно обязательно прописать имя. Это важно, так как на именах завязан скрипт, и чтобы он сработал — нужно чтобы имена совпадали. Вписываем в поле name : leaf_Color
2. Создать ramp (Hypershade-->Create-->2d textures-->ramp). Здесь задать те цвета, которые хочется видеть в качестве оттенков. Переменная будет брать из рампа цвета и произвольно назначать их на геометрию. Ноду с рампом назвать Leaf_ColorRamp
3. Выделить все листья. Не группу! Нужно выделить каждый лист внутри группы, это важно.
Запустить 2 скрипта. 1-й добавит к каждому листу переменную, а 2-й привяжет к этой переменной определенный оттенок.

string $sel[] = `ls -sl`;
for($current in $sel)
{
string $shape[] = `listRelatives -s $current`;
if(!`attributeExists rmanCleaf_Color $shape[0]`)
{
addAttr -ln "rmanCleaf_Color" -at double3 $shape[0];
addAttr -ln "rmanCleaf_ColorX" -at double -p rmanCleaf_Color $shape[0];
addAttr -ln "rmanCleaf_ColorY" -at double -p rmanCleaf_Color $shape[0];
addAttr -ln "rmanCleaf_ColorZ" -at double -p rmanCleaf_Color $shape[0];

setAttr -e -keyable true ($shape[0] + ".rmanCleaf_Color");
setAttr -e -keyable true ($shape[0] + ".rmanCleaf_ColorX");
setAttr -e -keyable true ($shape[0] + ".rmanCleaf_ColorY");
setAttr -e -keyable true ($shape[0] + ".rmanCleaf_ColorZ");
}

float $vCoord = rand(0,1);
setAttr "Leaf_ColorRamp.uvCoord.vCoord" ($vCoord);
vector $color = `getAttr Leaf_ColorRamp.outColor`;
setAttr ($shape[0] + ".rmanCleaf_Color") ($color.x) ($color.y) ($color.z);
}


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

Я добавила в рамп разные оттенки зеленого, и после нескольких экспериментов получилось такое:

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

NB! После каждого изменения оттенков в рампе нужно опять повторить процедуру №3, прогнать скрипт с назначением цветов. Без этого никаких изменений при рендере не будет, листья не перекрасятся.

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



Shading network материала листьев выглядит так:

Рамп ни к чему не должен быть привязан. Можно его привязать к чему-нибудь не существенному, чтобы он не отвалился при чистке сцены.

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

 
 
 
fivestep: Q?fivestep on June 6th, 2012 01:25 pm (UTC)
В природе листья ближе к концу ветви обычно светлее. Они сформировались позже и хлорофила в них меньше. А у некоторых растений, например Японских Pieris в листьях сначала формируется каротин, а потом только хлорофил. Поэтому молодые побеги красные, постарше - желтоватые и потом сосем тёмно зелёные.
ScallyFox: owl's springscallyfox on June 6th, 2012 02:11 pm (UTC)
Класс! очень интересно про японские.. никогда такого не видела..
fivestep: Q?fivestep on June 6th, 2012 02:48 pm (UTC)
У меня был japanese pieris mountain fire - поищи картинки, он красивый. А из европейских растений такое заметно у дуба. Молодые дубовые листочки почти жёлтые, а потом темнеют.

Так это я к чему - может вместо рампа попробовать листьям цвет назначать как параметр от их координат?
ScallyFox: snakescallyfox on June 6th, 2012 04:46 pm (UTC)
Чтобы, например, красные были все по краям дерева, а зеленые -- к центру? Правильно я понимаю?
fivestep: Q?fivestep on June 6th, 2012 08:41 pm (UTC)
Да. Очевидно во втором скрипте последняя строка

setAttr ($shape[0] + ".rmanCleaf_Color") ($color.x) ($color.y) ($color.z);

должна быть функцией от координат
ScallyFox: snakescallyfox on June 20th, 2012 12:25 pm (UTC)
надо подумать. Они же хаотично растут, не по времени и без привязки к определенным веткам. И как задать что с краев листья старее, чем в середине -- я с ходу не соображу. Но задачка интересная
count_onecount_one on June 6th, 2012 06:38 pm (UTC)
Я Рендерменом не пользуюсь, но выглядит круто)
Вообще пока сложности с материалом, но знаю, что люди нодами такие дикие вещи делают, что писец.
Ничо - коль нужно будет, изучу)
ScallyFox: owl's springscallyfox on June 6th, 2012 06:56 pm (UTC)
Очень мощный инструмент. Но без поллитры грамотной документации не разобрать, что куда. Сижу вот, конспектирую:)))