Часто приходится в работе из нетворка Sop вытаскивать какую-то его часть и вставлять в Object merge в другой ноде.
Вот вам скриптик, который это делает автоматом:
https://pastebin.com/qerXB8c7
Ставите его как обычный тул на полку, можно даже назначить горячую клавишу. Выделяете в Sop любую ноду, жмете на новый инструмент, он создаст новую Geo-ноду, внутри которой появится Object merge с подгруженной геометрией с выделенной ноды.
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
✓ Live Streaming✓ Interactive Chat✓ Private Shows✓ HD Quality✓ Free Actions
Free to watch • No registration required • HD streaming
Привет, спасибо большое за интересные уроки и полезную информацию! Не могли бы вы написать способ позволяющий перевести содержание стрингового атрибута в число (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.
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
✓ Live Streaming✓ Interactive Chat✓ Private Shows✓ HD Quality✓ Free Actions
Free to watch • No registration required • HD streaming
Очень нестандартная задача, но вдруг кому-то пригодится.
Понадобилось мне спарсить список маркеров, сохраненных из 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. В общем, удобно.
Ну и конечно, не забудьте записать пресет, чтобы снова не проделывать все эти операции.
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
✓ Live Streaming✓ Interactive Chat✓ Private Shows✓ HD Quality✓ Free Actions
Free to watch • No registration required • HD streaming
Если вы так же, как я, любите раскрашивать ноды на уровне 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), и можно пользоваться.
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
✓ Live Streaming✓ Interactive Chat✓ Private Shows✓ HD Quality✓ Free Actions
Free to watch • No registration required • HD streaming
Часто при создании аниматика склеивают вместе флипбуки с разных камер. Можно их, конечно, просчитать отдельно и воспользоваться монтажной программой, но проще и легче склеить камеры прямо в Гудини.
Для этого есть нода 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-рендеров, позволяет нормально работать со светом. И, конечно, пришлось снова лезть в архив сцен из челленджей и пробовать отрендерить их новым движком.
Несколько часов пролетело незаметно. Очень рекомендую!