Волосы под микроскопом

И снова здравствуйте! Во избежании всяких кривотолков:Гудини--моя религия и я здесь(в уроке) проповедую как хочу,никого не принуждаю принять мою точку зрения,и, как говорится--в чужой монастырь со своим уставом не ходят, посему....Поехали)))

В этом вольном изложении хочу показать как я делал волосы. Увеличенные во много раз.Это не урок,а как бы случай из жизни,где мне была поставлена задача сделать полностью процедурные волосы,со всеми мыслимыми и немыслимыми анимируемыми параметрами. Естественно всё создавалось под определённый ракурс,количество растительности тоже было другое(здесь я щажу пользователей,ибо не у всякого есть мощная машина).Урок этот так называемый отредактирован,сетка более-менее приведена в порядок,потому что оригинал насыщен творческим беспорядком))На какое-то откровение не претендую,повторюсь,это случай из жизни.
Сегодня сделаем кожу,сами волосы с чешуйками, перхоть и тд.Может кому-то показаться,что они не будут соответствовать настоящим,человеческим, будем считать,что это шерсть неведомого зверушки.

Создаём Grid, это наша будущая кожа.На всяких мелочах я уже не буду останавливаться, наподобие этой,где взять этот Grid и как его создать,я думаю это будет уже лишним,не взыщите).
Итак,создали. Размер,в принципе,значения не имеет.Пусть остаётся по умолчанию.Нодой Fractal слегка "бугрим" кожу.Настройки здесь особо не сложные,трудности тут не возникнут.

Теперь занесём некие точки в группу,которые в последствии станут нашими корнями для волос,углублениями в коже,для луковиц и тд.Вызовем ноду Group. В кратце-выставляем режим Points, работаем с точками.В свитке Operation выбираем Group by Expression.Это позволяет нам заносить точки в группу согласно некоему экспрешну.Например,как здесь експрешн rand($PT) рандомно выбирает точки по всему гриду,где rand() собственно сама функция,a $PT это переменная обозначающая номер точки.То есть эта функция перебирает весь массив точек и рандомно "выдёргивает" их в группу.Группу назовём point_root,дабы потом не рыскать.Немного "разбавим" количество точек,попадающих в группу.И да простят меня гуру Гудини за последущий топорный способ,но мне он показался в принципе быстрым.Я из этого значения вычитаю некое число,варьирующее от 0 до 0.5
Чем ближе число к 0.5 тем меньше точек будет в группе,ибо просто rand($PT) даёт ненужную мне кучу точек.

Ну что,начнём формировать поры,в которых будут расти волосы.
Следующим шагом будет цепляние ноды SoftTransform, которая делает то же самое как и трансформ,но с одной хитрой уловкой.Мы можем двигать вершину,а за ней будет плавно перемещаться некая область из вершин,радиус которой мы зададим сами.В меню Group выбираем нашу группу, point_root,работать будем только с этими точками.
В Translate в среднем окошке(если вы помните,то это ось Y,"верх-низ")выставляем значение,которое вам подходит.Делаем небольшие бугорки.У меня например получилось 0.32
В Soft Radius выставляем значение,позволяющее сформировать из острых вершин более округлые бока,посредством мягкого выделения соседних точек.Кидаем ноду Subdivide, в принципе из названия понятно что она делает.Это нужно нам для того,чтоб сделать аккуратные вмятины в этих бугорках.Теперь,собственно,сами вмятины.Опять вызываем ноду SoftTransform,так же в выпадающем меню выбираем нашу группу,только в Translate по этой же оси уже опускаем точки,делая этим подобие углублений.Естественно Soft Radius уже меньше,чем в предыдущем варианте.Получается некая такая "лунная" поверхность.

Далее назначаем PolyReduce.Это позволит нам в дальнейшем сделать неоднородной поверхность кожи.Эта нода оптимизирует поверхность,удаляя "ненужные" полигоны.В поле Keep вводите то значение,в процентах,которое вам нужно оставить от общего числа полигонов.Например--если стоит 100,то модель не будет подвержена оптимизации.Я поставил около 25%.Далее делаем PolyExtrude.Дадим толщины для нашей кожи.В Translate по локальной оси Z немного задайте значения.У меня получилось около 0.02
В опции Keep Points Shared выбераете Use Normals,что позволит выдавить полигоны не по одиночке,а всем скопом,единым массивом.Тут же,во вкладке Options отметьте галочку Output Back,что "замкнёт" меш с обратной стороны,модель станет замкнутой.Назвал её--PolyExtrud_KNOT.
Завершим кожу.Тут уже всё просто.Назначаем ещё раз PolyExtrude,значение выдавливания делаем небольшое,у меня 0.017 ,всё остальное по умолчанию.Теперь как раз-таки выдавливание полигонов по-одиночке нам на руку.Создадутся некие такие бугорочки,передающие фактуру кожи.Теперь довершим результат ещё раз нодой Subdivide.Такс,с кожей покамест всё.Результат получается вроде вот такой.

Теперь давайте изготовим волос.Он у нас будет как положено,с чешуйками,со всякими наростами и прочей дрянью.Выбрал такое выражение потому что насмотрелся много рефов по волосам и хуже зрелища,чем крашеные волосы,высушенные феном я не видел)))
Итак,приступим-с.
Создаём тут же,в этом контексте, Line.
Параметры немудрёные--Distance у меня 6, Direction стоит 1 по оси Y.Вызываем ноду Sort нам сейчас от неё нужно только одно--поменять местами точки кончика и корня нашего волоска.Если вы включите отображение номеров точек,то увидите,что "корень" это ноль,а кончик--единица.Нам нужно это дело поменять.Пояснение ниже,для чего это.В ноде Sort включаем режим Reverse.
Теперь "наращиваем мясо" нодой PolyWire.Теперь начинается колдовство)))В поле Wire Radius вобьём знакомое уже нам выражение,а именно локальную переменную $PT. Что мы видим?Естественно,у нас получился конус.Объясню.Так как эта переменная обозначает номер точки,а у нас в волоске две точки,то и получается,что для задания толщины волоса он берёт по порядку значения,которые ему "подсовывает" эта переменная.А именно--в корне у нас точка под номером 1,радиус волоса тут тоже будет 1,а в конце точка ноль,соответсвенно и радиус тут тоже будет нулевой.Поэтому мы и вставляли ноду Sort.Продожаем колдовать.Естественно,нас такой волос не устраивает.Давайте уменьшим его раз в десять,например.Получается такая надпись $PT/10
Ну,соответсвенно ноль делим на десять--всё равно ноль,волос остаётся немного странным,поэтому просто "накидываем" некое значение,для придания толщины всему волосу.Например плюс .1
Этим мы прибавляем к каждому значению точки ЕЩЁ по маленькому значению,в итоге волос приобрёл форму,а наша запись стала такой $PT/10+.1
Продолжаем модифицировать.Divisions--тут уж сколько поставите,столько и будете,если вам нужно вблизи потом рендерить ваши волосы,то ставте,не жалейте.Ну,как минимум с десяток,это сделает их более круглыми.Теперь сегменты.Можно выставить и руками,но при изменении длины волоса естественно их надо будет постоянно корректировать,а если волосы разной длины,а ещё нюанс в том,что желательно сетка должна быть более-менее квадратной(объясню ниже зачем это)и ещё много других факторов привели меня к тому,что тут тоже нужно делать процедурно.
Ну,во всяком случае новые фишки вам не помешают)))
Идём обратно в ноду Line, с которой всё начиналось и там клацаем ПКМ на Distance и выбираем Copy Parameter, затем возвращаемся в PolyWire к нашему полю Segments и клацаем ПКМ,выбираем Paste Copied Relative References.Напишетс выражение.В нём будет прописана ссылка на канал dist,который отвечает за длину волоса.Теперь в этом поле будет стоять значение точно такое же как и в длине волоса.Сейчас у меня это 6.Этого маловато для более-менее квадратно сетки,нужно уплотнять.Я прибавляю к экспрешну ещё 70.Эта цифра вообще может быть любая,может и 100,лишь бы количество сегментов давало приемлемый результат.ВСё,теперь можем менять длину волоса как хотите,а сегменты всегда будут в достаточном вам количестве.Да,кстати,тут ещё стоит добавить такое выражение как round(),оно округляет значения внутри него.Прсто если длину волоса сделаете 11.34,да ещё тут прибавится 70,получится 81.34,а для количества сегментов нужно целое число,вы ж понимаете.В итоге получится нехитрая надпись round(ch("../line1/dist")+77)

Завершим эту ветку нодой Group,нам нужно занести рандомное количество точек,нам нужен хаос,поэтому как в предыдущей ноде Group выберем режим Group by Expression и вобьём туда наше знакомое rand($PT).Ноду тоже отметим красным(от неё будут идти разветвления на всякие наросты на волосах,на чешуйки покрывающие волос и тд),назовём ноду как нибудь Group_BASE_SCATTER, саму группу тоже что-то типа этого base_scatter.Фух,кажется всё.Подготовительную часть закончили,начинаем детализировать.Выглядит пока что у меня вот так

Ну,а теперь начинается лютая жесть))))
Начнём создавать чешуйки.Они будут облеплять хаотично волос и не очень плотно прилегая к нему будут создавать видимость "взлохмаченного" состояния.Но перед тем как их создать немного поколдуем с волосом,нам нужно его подготовить к расселению на нём чешуек.Для этого ответвляем от Group_BASE_SCATTER ноду Delete и поставив режим Points выбираем группу base_scatter.Нам удалит хаотично некие куски меша,на оставшемся будем "рассаживать" точки,по которым уже в свою очередь и расклонируем наши чешуйки.По этому оставшемуся мешу раскидаем точек с помощью ноды Scatter в поле которого Number of Points введём любое число,которое и будет отвечать за количество чешуек раскиданных по волосу.Например 90.Далее цепляем ноду Point.Обзовите её point_NORMAL.Великая нода,без преувеличения.Можно написать целый трактат по теме для чего используется эта нода.Нам она нужна сейчас для того,чтоб выставить нормали точек.Нам следует сделать так,чтоб нормали смотрели от центра волоса наружу,чтоб чешуйки в свою очередь так же располагались по точкам,следуя нормалям,то есть не стройными рядами,а центробежно.Включите режим отображения нормалей точек.В ноде во вкладке Keep Normal меняем режим на Add Normal после чего нам появляется возможность принудительно изменять нормали точек.Например,вбейте единицу в значение X.Увидите,что все нормали повернулись в направлении оси X.Побаловались?.Теперь верните обратно значение $NX.Нам нужно чтоб они лежали в плоскости X & Z, поэтому в оси Y ставим ноль.Теперь нам нужно расположить их радиально.Для этого к значению $NX прибавляем $TX.Это означает,что к текущему значению нормали мы прибавляем значение текущего местоположения точки.Так же делаем и в третьем окошке,которое отвечает за вектор Z.Заметьте,что для каждого вектора переменная отличается.Для Z это будет $TZ.
В итоге получается что-то вроде этого.Вид сверху.

Не кипит ещё мозг? Тогда продолжаем.Делаем чешуйки.Создаём Circle.Делаем его немного приплюснутым.Цифрами в окошечках Center смещаем его немного.Смысл сего действа таков--та часть которая будет в области центра координат,та и будет корнем чешуйки,станет её точкой вращения.Чешуйки же будем анимировать,лучше сразу и позаботиться о таких нюансах.Дабы не тормозиться на мелочах настройки этого круга можете увидеть на скрине.

Далее нодой Fractal делаем этот круг немного хотичным.Настройки по желанию,главное только изменить вектор действия.По умолчанию он равняется по Y.Вбейте в Direction везде по нулю,только d Z ставте единицу.Это действие "сомнёт" круг по плоскости.Следующая нода тоже Fractal,там то же самое,только "мнём" уже по оси Y.Спросите почему двумя нодами,можно же и одной?Да,можно,но..Так мы получаем гибкость,мы можем отдельно настравивать мятость как для плоскости,так и для объёма.Получается что-то вроде такого.


Теперь придадим ему толщины.Цепляем PolyExtrude.Если вы помните как обращаться с ней,то нам нужно выдавить немного по локальной оси Z,поставить режим Use Normals,в Options отметить галочку Output Back.
Теперь немного изогнём нашу чешуйку.Для этого есть нода Twist.
В Operation выбираем режим Bend, Primary Axis & Secondary Axis ставим соответсвенно Y axis и Z axis.Этим мы очерчиваем как бы плоскость,перпендекулярно которой будет происходить сгиб.Поясню на рисунке.Теперь немного загнём другие края.Опять нода Twist режим Bend,но оси теперь--Y&X.


Ниже настройки одного и другого Twist`a.

Ну что ж,теперь самое время рассадить наши чешуйки по волосу и посмотреть что получилось.
Создаем ноду Copy.Сразу обзовите её copy_FLAKES.В левый инпут подаём,ЧТО копируем,а во второй--НА ЧТО копируем.Итак,в левый мы подключаем выход из последнего Twist`a во второй подаём выход нашей Point_NORMAL.Получается,что наши чешуйки встали аккуратненько,радиально,благодаря поправленным нормалям, вокруг волоса.

Так же,благодаря нормалям,чешуйки вытянулись вдоль них,а нам нужно чтоб они облегали вокруг "ствола".Просто добавьте ноду Transform после Twist перед Copy_FLAKES и в поле Rotate медленно крутите значение в отрицательную сторону,и вы увидите,что чешуйки начинают прилегать к стволу.У меня получилось около минус 70-ти.Получилось что-то вроде такого.

Ну что,теперь будем добавлять грязи на волосы.Возвращаемся к ноде group_BASE_SCATTER,она у нас отмечена красным.От неё мы отводили ноду Delete для выявления площади под чешуйки.Теперь выделим площадь под грязь.Ctrl+C и Ctrl+V по ноде Delete.Во втором экземпляре единственно что мы поменяем это в Operation изменим на Delete Non-Selected.

Получается,что мы как бы инвертнули выделение и оставили другую часть меша,на котором будем выращивать эту самую грязь.В результате этой операции мы разделили площадь волоса вроде хаотично,но поровну.На одной части мы рассеяли чешуйки,на остальной мы рассеим наросты всякие.Далее вызываем ноду PolyBevel, с помощью которой закруглим немного угловатости наших будущих наростов.В поле Relative Inset будем немного повышать значение,пока внешний вид полигонов не станит округлым.Потом Subdivide,потом Polyextrude.Опять--режим Use Normals,значение выдавливания ставтьте немного,нам лишь бы обозначить выпуклости.Получаются вот такие вот наросты.

Далее нодой Fractal немного добавим хаотичности,тут уж на любителя.Главное,выставьте галочку Use Vertex Normals, шум будет добавляться соответственно нормалям,никаких векторов вбивать не нужно.
Ну что,последние штрихи над стволом и будем собирать воедино то,что у нас уже получилось!
Ещё раз отводим от ноды group_BASE_SCATTER ответвление,на этот раз ноду Fractal.С помощью её мы немного придадим волнистости,наслоения основному стволу волоса.Настройки на картинке ниже.Уделите внимание настройкам Direction.Вектор Y поменяйте на минус один,а остальные снизте до 0.22 получится наподобие наростов,наплывов.

А сам ствол будет выглядеть как-то так.

В итоге сетка наша будет выглядеть приблизительно так.
1)-Чешуйки рассаженые по стволу.
2)-Наросты выращенные по стволу.
3)Конечная нода,определяющая ствол.


Теперь создаём ноду Merge и подаём на её вход все три выхода этих крайних нод.

Выставив нехитрое освещение,пробный рендер--вуаля.

Если не устали,то вперёд,осталсь совсем немного.Теперь нам нужно рассадить готовый волос по точкам,которые мы ещё в самом начале урока выдернули в группу,для создания ямок для луковиц,помните?Теперь по этим же точкам и рассадим наши волосы.Создаём ноду Copy и по предыдущему принципу делаем: в левый подаём собранный волос(крайняя нода Merge,зелёная на рисунке),а в правый ответвление от ноды group_POINT_ROOT(созданную в самом начале).Сетка выглядит теперь вот таким образом.


Естественно,возникнет закономерный вопрос--а как разнообразить эти волосы,ибо они выглядят как клоны!(по сути они ими и являются,конечно).Мы воспользуемся одним чудным свойством ноды Copy.Рассмотрим маленький пример.Сохранитесь и создайте новую сцену.Создайте Grid.Создайте Platonic Solids,в Solid Type выберите Utah Teapot.Orientation--Z axis.Потом копируете эти чайники нодой Copy по плоскости.Получаются ровные ряды чайников.Чтоб разнообразить это дело заходим в ноде Copy во вкладку Stamp.В поле Variable 1 введите название своей переменной.Например мы сейчас хотим разнообразить чайник по радиусу.Ну,чтоб они были разного радиуса.Так и запишем-radius_pot.В поле Value 1 впишем знакомый нам уже експрешн rand($PT). Не забудьте выставить галочку Stamp Inputs,это активизирует стампы.Теперь идём в настройки чайника и пишем в поле Radius такое вот выражение(да,его нужно запомнить,ничего не попишешь)
stamp("..copy1","radius_pot",1)
Смысл сего таков:
stamp()--вызывает вариации,созданные вами в ноде Copy и подсовывает их в это поле.
"..copy1"--это путь,в котором указывается нода Copy.Так как нода находится в этом же контексте,поэтому и путь у неё начинается не со слеша,как обычно,а с двоеточия.Например начните вводить путь со знака / и увидите,что Гудини вам предложит в подсказку.
"radius_pot"--название вашей переменной,которую вы создали там
1--это значение по умолчанию,принимается,если ни одна из вариаций "не работает" так сказать.Когда вы это ввели,посмотрите,что получилось.Теперь их можно покрутить под разным углом.Идём опять в Copy, создаём новый стамп.Вторая переменная--z_rot, а в значении пишем пока что(!) rand($PT).Чтоб крутить чайники вокруг оси создадим ноду Transform и впихнём её ДО ноды Copy.Там в поле Rotate,по оси Z пишем такое же выражение stamp("../copy1","z_rot",1)
Только обратите внимание,что имя переменной поменялось.Ну чтож,сильного отличия мы не заметили.Всё потому что выражение rand() выдаёт значение от нуля до единицы.Убедиться в этом можно нажав просто мышкой на слове Value2 .И естественно,что такие повороты нам незаметны(шутка ли--доли одного градуса!)Поэтому мы смело умножаем это выражение на 300.Ещё раз нажмите на название.Видите?Уже значение такое в принципе нам подойдёт,и чайники вроде как веселее стали выглядеть.

Но вернёмся к нашим баранам.
Открываем нашу сцену и сразу идём в нашу последнюю ноду Copy.Там создаём подобным макаром переменные rot, scale_uni
И вбиваем им вот такие значения. См. рис.

Рассмотрим по-подробнее второе.Первое нам уже более-менее знакомо.
Есть такое выражение fit01(num,newmin,newmax)
которое оперириует некеими значениями и выдаёт их в определённом интервале,заданным двумя числами.В нашем примере мы подаём ему нашу рандомную "кашу" из чисел и как бы говорим ему,что нам нужны ЛЮБЫЕ числа,но только не меньше единицы и не больше двойки.То есть мы отсекаем ненужные нам значения.Так как я планирую этот стамп подать на размер волоса,то с помощью этих двух чисел я могу варьировать рандомный скейл от одного(истинный размер) до двух(увеличенный в два раза).Вам ничто не мешает вбить туда например 0.5 и 1.5
Теперь нам нужно их куда-то применить.Создаём ноду Transform и по аналогии с чайниками пихаем её ДО ноды Copy.
Вот как собственно выглядит Transform с подставленными значениями.

Можно скопипастить из Rotate по оси Y в остальные окошки,но так как мы умножали на 300,поворот получится очень большой,поэтому можно "проредить" делением на 100,например.

За счёт этого волосы будут немного наклонены в разные стороны.

Теперь осталось сделать перхоть,ну или что это будет,я не знаю,короче отмершие пластинки на коже.
Создаём PolyExtrude,назовём её polyextrude_PERX, сразу подключим ко входу выход ноды PolyReduce1,которая идёт перед polyextrude_KNOT
То есть мы из поверхности кожи создадим лоскутки меша,который будет в последствии нашей перхотью.Удобство заключается в том,что наша перхоть будет всегда повторять контуры кожи,облегать все её бугорки и впадины.Чтоб этот мусор не утопал в коже мы эту заготовку и выдавливаем этой нодой(polyextrude_PERX).Выдавливание делаем чуть больше,чем в polyextrude_KNOT,опять же для того,чтоб вся эта фигня всегда была на поверхности.Далее мы создадим группу,в которую занесём рандомные участки кожи.Для этого вызываем ноду Group,тут уже оставляем по умолчанию(работаем с примитивами),только Operations выставляем Group by Expression там прописываем уже знакомое нам выражение rand($PR).Обратите внимание,что переменная поменялась,теперь это PR, так как работаем уже с примитивами.Это то же самое как и $PT,только обозначает номер не вершины,а примитива(полигона).И чтоб немного проредить,вычитаем 0.2
Название группы я дал perx

Далее, удаляем всё,кроме этой группы,естественно нодой Delete в режиме Delete Non-Selected.
И дальше схожая процедура,как мы делали наросты для волос.Нода Polybevel для скругления краёв, Subdivide, потом ещё один Delete, в Operation которого есть схожая функция как и в группе-Delete by Expression, где вбиваем уже до боли знакомое rand($PR)-0.3---это позволит нам немного наделать прорех в лоскутках
Потом ещё один PolyExtrude, чтоб немного придать объёма этой всей шелухе,а затем заключительный(ну наконец-таки,скажут многие!!) штрих--нода Fractal c настроечками по желанию,и включеной галочке Use Vertex Normals дабы придать немного помятый вид всему этому.И в довершении всего выводим концы от наших трёх сеток в одну ноду Merge то бишь соединяем волосы,рассеяные по точкам,кожу с созданными ямками под волосы,созданных теми же точками и перхоть,полностью повторяющую контуры ландшафта.

Некоторые моменты я сознательно упускал,надеясь,что внимательный читатель "просечёт фишку",ну а не совсем внимательный будет сподвигнут на вопросы,на которые я с удовольствием отвечу).

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

Я создавал отдельные ноды для изгиба волосьев,делал отдельно анимированный мусор на поверхности головы,текстурил,анимировал, в итоге эти волосы превращались из страшных в здоровые,гладкие и красивые,в общем ещё куча работы,но это уже другая история)))

697 0 850 22
13
2012-11-21
Отлично! Как-то пытался влезть в гудини - поставил, тупики, вопросы, ответы, тупики, снова вопросы, изумление... Но плотный поток работы, перемешанный ленью и усталостью, погасили мой энтузиазм. Увы. Когда в [u]привычном[/u] софте делаешь что-то быстрее в разы - "энтузиазизм" и вера в кумира улетучивается со временем, но благодаря подобным статьям снова руки чешутся:) Автору спасибос! Молодым порекомендую начать именно с гуди, даже настаиваю!
2012-11-23
Отличный "вброс" в систему Гудини, обязательно попробую)
2012-11-23
Урок хороший, что скажешь для анимации штука незаменимая. Кстати о ней, возможно посчастливится увидеть анимацию? хоть секунды 4. И капля дегтя )))) Про статику: можно было бы и в збраше отрисовать такой волос )))) получилось бы куда быстрее
2012-11-23
Mega Ko!obok, статика вам только на скетч сгодится потом)
2012-11-23
[quote=BlackAgate] Отличный "вброс" в систему Гудини [/quote] спасибо на добром слове)))[quote=Shirman] но благодаря подобным статьям снова руки чешутся:) [/quote] я рад,что труды мои оценены,спасибо!)
2012-11-23
первый урок по гудини, в котором всё понятно) Спасибо за подробные разъяснения сути, и второе спасибо за то, что не было излишних подробностей типа «кликните таб в поле с нодами, начинайте набирать название ноды...»
2012-11-24
спаисбо за урок, но хотелось бы продолжения: анимация и главное маты + настройка рендера [smile=07]
2012-11-25
дошёл до места [/img][quote]Теперь по этим же точкам и рассадим наши волосы.Создаём ноду Copy и по предыдущему принципу делаем: в левый подаём собранный волос(крайняя нода Merge,зелёная на рисунке),а в правый ответвление от ноды group_POINT_ROOT(созданную в самом начале).[/quote] - небольшое уточнения, в ноде "copy" нужно в поле "Template Group" выбрать группу точек "point_root" и снять галочку с "Transform Using Template Attributes", у меня только после этого всё встало как надо.
2012-11-26
[quote=iVAt] в ноде "copy" нужно в поле "Template Group" выбрать группу точек "point_root" и снять галочку с "Transform Using Template Attributes" [/quote] Вот и первый внимательный читатель)))) Очень извиняюсь, да,всё верно! Спасибо за наблюдательность,я этот пункт забыл указать,извиняюсь!
2012-12-22
Хороший урок! Вот бы кто еще сделал урок по написанию шейдеров )))
2012-12-23
[quote=}{ищник] Хороший урок! Вот бы кто еще сделал урок по написанию шейдеров ))) [/quote] а фот,давным-давно уважаемый [b]wiTcHer[/b] выкладывал тут статью,пожалуйста [url]http://www.render.ru/books/show_book.php?book_id=729[/url]
2013-01-01
[quote=Mega Ko!obok] [/quote] https://vimeo.com/56382757
2014-05-19
Спасибо за урок)) у меня вот что получилось) [url=http://clip2net.com/s/i8ZEce]clip[/url]
RENDER.RU