Часто приходится в работе из нетворка Sop вытаскивать какую-то его часть и вставлять в Object merge в другой ноде.
Вот вам скриптик, который это делает автоматом:
https://pastebin.com/qerXB8c7
Ставите его как обычный тул на полку, можно даже назначить горячую клавишу. Выделяете в Sop любую ноду, жмете на новый инструмент, он создаст новую Geo-ноду, внутри которой появится Object merge с подгруженной геометрией с выделенной ноды.
Привет, спасибо большое за интересные уроки и полезную информацию! Не могли бы вы написать способ позволяющий перевести содержание стрингового атрибута в число (int или float), при условии что внутри стрингового атрибута гарантированно находится числовое значение. Спасибо!
Функции atof(”строка”) для перевода во флоат или atoi(”строка”) для перевода в инт. Но они работают, если в строке нет других символов кроме цифр, десятичной точки или “е” для экспоненциальной записи типа 1.25e+5.
Например
@out=atof(”12.5″);
В случае, если в строке есть другие символы, но число только одно (например “ghdh125.3ghfjh”), то задача сводится к тому, чтобы удалить из строки все, кроме цифр и точки.
Это делается с помощью регулярных выражений (regular expressions, regex, за подробностями в гугл). В Вексе есть функции работы с регексом (re_), надо только перед строкой регулярного выражения ставить r.
Во второй строке мы используем функцию re_replace, которая ищет в атрибуте @in подстроку по регулярному выражению [^.0-9]+, то есть все, кроме точки и цифр 0-9. Буква r перед кавычками важна.
Дальше мы заменяем найденное на пустую строку “”. На выходе у нас остаются только цифры и точка, к которым мы уже применяем atof. В результате получится 1234.2
А вот если нужно распарсить строку, где может быть несколько чисел с буквами и символами между ними, то используем такую конструкцию:
s@in=“123hjh765.4hsdjfh12hh”;
string array[]=re_split(r”[^.0-9]+“,@in);
Эта функция создаст массив строк, а в качестве разделителя использует все то же выражение. Единственное, если исходная строка начинается не с цифры, то в начале массива создастся пустой элемент, надо это учитывать. В данном примере на выходе будет массив из строк “123″, “765.4″, “12″. Дальше уже можно по этому массиву идти циклом и использовать atof().
Все кавычки при копи-пэйсте с сайта станут неправильными, так что выражения лучше копировать отсюда: https://pastebin.com/yY2Tt8re
Если вы, например, работаете с VR и стереоскопией, то наверняка оцените возможность сразу после рендера в Гудини рассмотреть картинку в шлеме VR.
Самый простой вариант здесь такой: в роп-ноде пишем Post-frame script, который будет запускать сторонний плеер, сразу открывая в нем результат рендера.
Скрипт выглядит так:
https://pastebin.com/hudjxiqZ
Его надо целиком вставить в поле Post-frame Script и изменить язык на Python.
Сейчас этот скрипт запускает GoPro Vr Player и предназначен для работы с роп-нодой Redshift. Если вы рендерите, например, Мантрой, то замените RS_outputFileNamePrefix на vm_picture (это название параметра, в котором записывается путь и имя файла).
Также можно заменить путь до плеера и открывать в чем-то еще.
Если вам хочется, чтобы Houdini после рендера проигрывал звуковое оповещение, как, например, в After Effects, то вот вам рецепт.
В рендер-нодах (например в Mantra или Redshift) есть вкладка Scripts. Можно запускать определенные скрипты до и после рендера - как отдельных кадров так и всей секвенции.
Так вот, в строку Post-render script надо вставить код по ссылке:
https://pastebin.com/9a3n4GtE
Вставляется именно сам код, обе строки, а не ссылка на файл. Дальше, надо переключить язык на Python.
Очень нестандартная задача, но вдруг кому-то пригодится.
Понадобилось мне спарсить список маркеров, сохраненных из Adobe Premiere Pro. Написал скриптик на Python.
Итак, в Премьере идем в File - Export - Markers, выбираем там .csv файл.
Дальше его надо будет открыть в блокноте и пересохранить как utf-8. После чего в Гудини на SOP уровне создаем ноду Python и копипастим туда код отсюда: https://pastebin.com/PMnW4XfX
На этой ноде надо создать два параметра.
“txt” типа File
“framerate” типа Integer
Дальше в файл загружаем наш csv файл, ставим правильный фреймрейт и на выходе ноды получаем столько точек, сколько было маркеров.
И на каждой будет атрибут start (начало маркера в фреймах) и end (конец).
Чтобы организовать в Гудини переключение режима обновления Авто-Ручной по горячей клавише (типа как Caps Lock в AE), создаем на любой верхней полке новый инструмент, вставляем в него Python-code отсюда:
https://gist.github.com/mattebb/5217818
А потом во вкладке “Hotkeys” этого инструмента выбираем, например, F12. Теперь при тормозах сцены жмем F12, правим ноды, нажимаем F12 снова и продолжаем работать.
Добро пожаловать в нашу новую рубрику “Веселые сниппеты”. В ней я буду показывать маленькие и полезные куски кода на вексе.
Сегодня у нас по плану создание работающего аналога ноды Join.
Итак, очень часто в результате процедурных манипуляций у нас получается вот такая картина.
Как видите, это вроде бы замкнутый сплайн, но при этом состоящий из множества примитивов. Иногда слетает порядок следования вертексов и их может быть даже больше, чем нужно.
Круто было бы получить из этого один примитив. По идее для этого существует нода Join, но она работает из рук вон плохо и часто выдает примерно такой результат:
Так что давайте напишем свой рабочий аналог ноды Join. Сразу поставим условие: на входе у нас должны быть точки после Fuse, в одну точку приходит максимум два отрезка.
Нам надо пройтись в цикле по всем примитивам. При этом, поскольку в геометрии их порядок может быть абсолютно рандомный, то мы идем не по номерам, а по сцепке - примитивы цепляются друг за друга крайними точками, мы берем эту крайнюю точку одного и по ней находим второй. Дальше мы последовательно записываем точки этих примитивов в массив - и в конце соединяем их линией.
В результате у нас получается такой код:
https://pastebin.com/HxUxU0sF
Его надо вставить в Attribute wrangle, в режиме Run over Detail (only once).
На выходе нумерация точек не меняется. Чтобы она стала красивой, поставьте следом ноду Sort в режиме “Vertex order”.
И вот результат:
Скрипт отрабатывает проблемную геометрию, как замкнутые, так и открытые сплайны, нарушенный порядок вертексов и т.п. Важно, что на вход подается только один сплайн, который нужно объединить. Если их больше - пользуйтесь For Each циклом.
Часто в моушен-дизайне требуется создавать какие-то сложные текстовые сцены, будь то облака тегов, всплывающие титры и так далее. Конечно, можно их всех расставлять вручную, но это не наш метод. Было бы здорово читать тексты из отдельного файла!
Существует нода table_import, которая позволяет работать с CSV-файлами. По сути это Python-script, заточенный под работу с таблицами данных. С его помощью я, например, создал сцену, показанную выше, - где на глобусе автоматически подставляются названия 100 крупнейших городов мира (при этом учитывается их реальное положение и население).
Но для чтения простых текстовых файлов это перебор. Давайте сделаем свой упрощенный аналог этой ноды!
Итак, ставим ноду python, в ней редактируем интерфейс, добавив два параметра: File с названием txt (это будет путь до файла) и String с названием attr (в него мы будем записывать название атрибута, который хотим создать).
Теперь в окно Python копируем следующий код:
https://pastebin.com/Hkb0Sdyx
Дальше в параметр Файл выбираем наш текстовый файл, где каждая строка текста будет означать новую точку. Вбиваем название атрибута, который хотим менять, и вуаля! У нас создалось количество точек, равное количеству строк в файле. И на каждой точке есть атрибут, в который записана соответствующая строка.
Важно! Если вы хотите работать с кириллицей, не забудьте сохранить файл с кодировкой UTF-8!
Вот, собственно, и все. Сохраняйте этот код в пресет и пользуйтесь!
Дальше вы можете как угодно расставить эти точки в пространстве и с помощью ноды COPY скопировать на них надпись, созданную в ноде FONT. Ну и учитывайте, что шрифт тоже должен иметь кириллическое начертание, иначе ничего не получится.
Здесь все просто, единственная хитрость, выражение stamp() для строковых переменных записывается как stamps().
Допустим, вам надо загружать с диска несколько файлов и переключаться между ними. Может это просто разные уровни детализации, а может разные модели, которые вы хотите где-то заскаттерить. Можно воспользоваться нодой Switch, но зачем?
Напишем выражение в самой ноде File! Сначала подготовим ее. В Edit parameter interface добавим:
- Integer с названием num - это будет номер файла, который мы хотим грузить
- Folder, в его настройках включим Multiparm (list)
- Внутрь Фолдера положим параметр File-geometry, назовем его load# - решетка подставляется автоматом, она будет заменяться на номер из списка мультипараметра
Все, теперь в поле File пишем выражение. Маленький нюанс - обычным бэктиком здесь не обойтись, придется делать сложение строк через функцию strcat. Это конкатенация, то есть слияние двух строк. Strcat(“Houdini”,” rulez”) вернет “Houdini rulez”.
Выражение:
`chs(strcat("load",ch("num")+1))`
strcat сливает название параметра с номером. Нумерация в мультипарме начинается с 1, так что прибавим единицу. chs обращается к строковому параметру с названием, полученном в результате слияния строки - то есть к одному из пунктов списка. Обратные апострофы преобразуют выражение в строку.
Теперь мы можем плюсиком добавлять столько файлов, сколько нам нужно и переключаться между ними ползунком num. Или можно в него поставить выражение Stamp. В общем, удобно.
Ну и конечно, не забудьте записать пресет, чтобы снова не проделывать все эти операции.
Если вы так же, как я, любите раскрашивать ноды на уровне Obj - камеру, скажем, в черный, свет в желтый и так далее, то у меня для вас маленький лайфхак. Можно сделать так, чтобы ноды определенного класса уже при создании раскрашивались в нужный цвет.
Все очень просто. Нажимаем правой кнопкой на нужном инструменте на полке. Например, на камере. И выбираем Edit tool.
Во вкладке Script там будет короткий код добавления новой ноды. Все, что нам нужно сделать, - это в его конец добавить одну строку:
newnode.setColor(hou.Color([0, 0, 0]))
В квадратных скобках цвет - R, G и B компоненты, от нуля до единицы. Все, теперь при создании новой ноды камеры она будет черного цвета. И работать это будет даже при добавлении ее через Tab.
Я пользуюсь Гудини как последней программой в пайплайне и весь рендер делаю именно в ней. На мой взгляд система рендера сложных сцен здесь одна из самых продуманных и удобных. Поэтому для меня важна возможность просто подгрузить модель, нажать кнопку и получить картинку. И не только в Мантре, но и в Октане и Редшифте.
Поэтому я написал скрипт для импорта моделей OBJ, который парсит mtl-файл и создает необходимые шейдера с текстурами.
Скрипт можно скачать по ссылке (в зависимости от версии Гудини):
H16: http://pastebin.com/MwYPAZ1t
H17: https://pastebin.com/C1H0D4HT
Как установить? Добавляем новую полку на верхнюю панель (Нажимаем “Плюс”, потом New shelf). Назовем ее “Scripts”.
Теперь щелкаем по ней правой кнопкой и выбираем “New tool”. Даем новому инструменту адекватное название и копируем скрипт во вкладку Script. Не забываем убедиться, что в качестве языка стоит Python.
Теперь, когда нам надо загрузить модель, нажимаем на новую кнопку и выбираем файл в открывшемся окне.
Скрипт создает ноду, в которой содержится File со ссылкой на obj, shop network с созданными шейдерами и дополнительные ноды для перелинковки атрибута shop_materialpath.
Скрипт пытается решить некоторые проблемы типа неправильных символов в именах материалов. Также можно подгружать секвенции файлов, у которых не совпадает название mtl файла - скрипт попросит его выбрать отдельно. Известные ограничения - он не любит пробелы и вопросительные знаки в именах файлов.
Важный момент - скрипт можно доработать для использования с любым шейдером. По умолчанию он создает Mantra Surface. Но в первой секции скрипта вы можете выбрать новое имя шейдера и названия его параметров.
Конечно, после импорта шейдеры нуждаются в настройке, но в них уже будут все текстуры, так что процесс сильно ускоряется.
Второй момент, связанный с импортом OBJ-файлов - это группы. Наверное вы замечали, что при импорте из других пакетов в этих группах содержится что угодно, кроме адекватной и полезной информации. Я как-то работал с моделером, у которого за спиной тяжелое прошлое архвиза и привычка мерджить кучу моделей в одну сцену. Так при импорте у меня было около 5000 групп (это всего при миллионе полигонов). И Гудини начал притормаживать.
Так вот, если вы хотите, чтобы в группах при импорте оказывалась полезная информация (например, название материала), рекомендую программу под названием MooTools 3dBrowser.
Во-первых это браузер моделей (если у вас большая библиотека, то очень удобно), во-вторых конвертер, а в третьих, и самое главное, в нем есть функция Merge by materials. После нее группы на модели будут соответствовать назначенным материалам.
Единственное, 3D Browser не работает с алембиком. А в остальном довольно удобный инструмент.
Все знают, что такое разбиение по Вороному и как оно работает?
На всякий случай напомню. На вход Voronoi fracture SOP подается геометрия и некий набор точек. Геометрия разбивается так, что разрезы проходят точно посередине между точками. Все просто.
Почему-то эту ноду в основном используют для разрушений. А зря.
Пример: нам нужно порезать геометрию слоями, чтобы получить модный хипстерский эффект.
Я собственными глазами видел, как для этого делают цикл с булевыми операциями внутри!
А ведь достаточно на второй вход вороного подать линию, проходящую через геометрию. Количество точек в линии определяет количество слоев. Можно даже написать выражение для удобства, чтобы линия ограничивалась размерами модели. Вот так:
Если убрать галку Create Inside Surface, то получим вместо слоев ленточки.
Расстояние между слоями регулируется параметром Cut plane offset.
***
Второй пример. Подаем на оба входа одну и ту же геометрию, в данном случае обычный Grid с достаточным количеством полигонов. Теперь, если отключить галку Create Inside Surface и включить кластеринг, можно получить симпатичный паттерн из фигур сложной формы. Главный параметр здесь - Size во вкладке Cluster.
Таким образом можно быстро создавать разные абстрактные панели.
А вот в этом шоте я так сделал светящиеся линии сложной формы.
Быстрый совет для тех, кто хочет подружить Redshift render и Quixel. В Квикселе пока нет пресета для редшифта, но это не проблема.
Создаем пустой шейдер (Redshift network), в него кладем обычный RS_material. В нем надо поставить Fresnel type в metalness.
Далее создаем три текстуры - для карт Albedo, Roughness и Metalness. Подключаем их к соответствующим входам Material1. Нехитрый фокус в том, что карту Albedo надо воткнуть и в diffuse_color, и в reflectivity. По сути карта metalness определяет, с какого из этих входов брать цвет.
Добавляем ноду normal map и подключаем ее к bump map.
Вот и все. Осталось слинковать имена текстур с помощью приема, описанного в этом посте, и создать ассет.
У меня на верхний уровень вынесены только карта Albedo и сэмплинг отражений.
В Quixel ставим пресет Metalness PBR (Disney), и можно пользоваться.
Часто при создании аниматика склеивают вместе флипбуки с разных камер. Можно их, конечно, просчитать отдельно и воспользоваться монтажной программой, но проще и легче склеить камеры прямо в Гудини.
Для этого есть нода Switcher. На ее вход подключаем разные камеры и переключаемся между ними с помощью ползунка, так же, как в ноде Switch в SOP-контексте. Дальше можно этот параметр анимировать ключевыми кадрами.
Но ведь ключевые кадры - это не наш метод! Давайте автоматизируем процесс! Попробуем задавать номера кадров, на которых должна происходить смена камеры, списком.
Идем в Edit parameter interface ноды Switcher и добавляем Folder, который назовем Cameras. Штука в том, что Фолдер можно использовать не только как папку, но и как Multiparm - тот самый, в котором плюсиком добавляются новые параметры.
Переключаем тип Фолдера на Multiparm block (list) и внутрь добавляем параметр типа Integer, который назовем frame.
Теперь у нас появилась возможность добавлять новые параметры, к которым можно обращаться как к frame1,frame2 и т.д. В них мы будем записывать номер кадра, с которого должна стартовать соответствующая камера.
Дальше нам нужно написать простой скрипт. Переключаем язык скриптов на Python.
Нажимаем Ctrl+E на окне параметра Switch camera и пишем…
Все отступы табуляции важны. Ими в Питоне обозначается диапазон действия условных операторов и циклов.
По ссылке текстовая версия:
https://pastebin.com/jgz00cya
Это очень простой кусок кода. Он в цикле проходит по всем параметрам с названием frame+число (их общее количество лежит в параметре cameras) и, если число в параметре меньше чем номер текущего кадра, записывает это значение в переменную cam. В конце цикла у нас в ней будет номер камеры с самым большим стартовым кадром до текущего. Его мы и возвращаем.
Осталось переключиться на switcher в списке выбора камеры, и вуаля!
Можно записать все это дело в пресет, но в него не запишется выбор языка, так что на Python придется каждый раз переключаться вручную.
3D-художнику важно уметь работать со светом. Самую унылую сцену можно оживить грамотным освещением. В этом смысле мы похожи на кинооператоров, только возможностей у нас гораздо больше, мы не зависим от количества си-стэндов, которое помещается в фургон.
Всем начинающим тридэшникам хочу порекомендовать книгу “Digital Lighting and Rendering” by Jeremy Birn. Ее можно купить по ссылкам на сайте http://www.3drender.com/light/index.html. Ну или, я не знаю, найти где-нибудь еще.
Насколько мне известно, она не переводилась, но если вы читаете по-английски хотя бы со словарем, очень рекомендую ее прочесть, это одна из лучших книг по свету, материалам и рендеру.
Помимо прочего автор книги в свое время стал проводить так называемые Lighting challenge. Система очень проста. Любой может скачать пустую (без света и шейдеров) сцену под разные пакеты и попробовать сделать из нее красивую картинку. Результаты работы выкладываются на всеобщее обозрение и обсуждаются.
Вот ссылка на старые сцены: http://www.3drender.com/challenges/index.htm
А вот ветка форума, на котором подобные челленджи продолжаются по сей день: http://forums.cgsociety.org/forumdisplay.php?f=185
Так вот, если вы хотите изучить какой-то рендер-движок, то это идеальный вариант. Скачивайте сцену, делайте шейдера, расставляйте свет, ищите интересную композицию кадра, пытайтесь отрендерить результат за приемлемое время. Попутно научитесь решать возможные проблемы с моделями, делать UV и в целом работать с пакетом.
Когда я начинал знакомство с Мантрой, я брал оттуда самые простые сцены и рендерил их.
Ничего сложного, но очень помогло разобраться в шейдинге.
А на днях тут купил себе Redshift, который, в отличие от некоторых других известных GPU-рендеров, позволяет нормально работать со светом. И, конечно, пришлось снова лезть в архив сцен из челленджей и пробовать отрендерить их новым движком.
Несколько часов пролетело незаметно. Очень рекомендую!