Houdini FAQ

Вопросов в FAQ: 148. 

Предложить свой вопрос можно в нашем Телеграм-чате или на странице "Задать вопрос/предложить ответ". 

Вы можете получить ссылку на конкретный ответ, если нажмете правой кнопкой на вопрос и выберете "Копировать адрес ссылки". 

FAQ постоянно дополняется. Следить за появлением новых вопросов можно на этой странице.

Chop (4)

К сожалению, в ЧОПах Spare input не работает (по крайней мере в большинстве случаев), поэтому нужно записывать полный путь до нужной вам ноды.

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

Типичные варианты применения: добавить покачивания на движущийся объект, добавить тряску, сгладить анимацию, синхронизировать анимацию с музыкой, триггерить анимацию по событиям в сцене и так далее…

У нас есть подробный курс об этом контексте: https://gum.co/chopnet

При создании Constraint network по умолчанию ставится диапазон кадров «Use current frame», поэтому не будут работать ноды, фильтрующие по времени. Нужно пойти во вкладку Channel самой верхней ноды и переключить Range в «Use full animation range».

Такое случается, например, при изменении длины таймлайна, ФПС и так далее. Нужно в самой верхней ноде включить и выключить галку Unload во вкладке Common.

Также не забывайте при изменении параметров таймлайна менять параметры вкладки Channel в нодах-генераторах.

COP (IMG) (3)

Это контекст для работы с 2D-изображениями. По сути маленький нодовый компоузер типа Nuke или Fusion. Его можно использовать и для компоузинга финального рендера, но чаще он применяется для подготовки необходимых текстур, добавления нойзов, каких-то пиксельных вычислений и преобразований.

Прочитать результат работы COP-нетворка можно в любой ноде, которая принимает на вход 2D-текстуру с помощью синтаксиса op:/obj/Cop_net/OUT

Если вы рендерите Мантрой, то в COP есть нода Render, которая как раз автоматом подтягивает изображение, пришедшее с рендера.

Если вы работает с Редшифтом (или другими движками), то в COP добавьте ноду File, в которую через Relative reference скопируйте имя файла из rop-ноды. Добавляйте любые обработки (цветокоррекция, композ, надписи), и в конце нетворка поставьте Rop File output с новым названием файла. В этой ноде включите галку Reload all files. В ноде Редшифта выключите Non-blocking current frame rendering во вкладке Main.

В контексте out добавьте ноду Fetch, на ее вход подключите ноду Redshift. В ноде Fetch выберите Rop File output из COP.

Теперь, когда вы нажмете Render на ноде Fetch, сначала отрендерится картинка, потом она подтянется в COP-нетворк и оттуда сохранится заново.

Чтобы секвенция кадров из COP читалась без глюков, нужно в конце выражения добавить [$F].

Например:

op:/obj/cop_network/OUT[$F]

Gamedev (9)

При установке Гудини можно выбрать опцию с установкой Энжина. Если вы ее пропустили, то можно вручную скачать нужный билд с Гитхаба. Там в левом верхнем углу можно выбрать подходящую версию Гудини, после чего нажать зеленую кнопку и выбрать Download ZIP. В описании Гита обычно лежит руководство по установке.

Houdini Engine For Unity

Houdini Engine For Unreal

Houdini Engine For Unreal v2

Энжин.

Проверить произношение английских слов можно в гугле, введя слово + произношение. Например, так.

При покупке лицензии Houdini Indie вы получаете Engine бесплатно, его можно ставить на три компьютера.

Для лицензии Houdini FX с недавнего времени можно бесплатно запросить до десяти (а при личном запросе у менеджера и больше) лицензий Houdini Engine Unity/UE4. Эти лицензии можно запускать на отдельных компьютерах. На эти компьютеры нужно установить Houdini, а в качестве лицензии использовать лицензию от Engine. На них можно будет работать в игровом движке с энжином и использовать в нем ассеты из Гудини, не докупая дополнительно лицензии. Но запустить Гудини с полным интерфейсом уже не получится.

Проще говоря на студии на одном компьютере может быть установлена коммерческая версия Гудини, в которой производятся все необходимые ассеты, а еще на десяти с этими ассетами внутри Unity или Unreal могут работать другие люди, не платя за дополнительные рабочие места.

Важный момент, что если вам нужно распределять таски в PDG внутри Engine, то для этого понадобится коммерческая лицензия Houdini Engine.

При этом Houdini Engine for Maya/3dsMax etc для пользователей с лицензией FX остаются платными.

Есть возможность сохранять из Гудини Custom Property в FBX-файле. Для этого экспортировать файл нужно с помощью ROP-ноды в контексте Out (Rop Fbx Output в SOP не подходит).

На уровне Obj на ноде, которую нужно экспортировать, необходимо через Edit Parameter Interface создать параметр с именем (Name), которое будет начинаться с «fbx_». А отображаемое имя этого параметра (Label) будет использоваться в качестве названия для Custom Property. Теперь при экспорте этой ноды через Filmbox FBX, в файл сохранится значение данного параметра.

Анимированные Custom Property не поддерживаются.

  1. Через Vertex Animation Texture, VAT. Анимация точек запекается в текстуру, после чего читается в движке в шейдере.
  2. Через Алембик. Большие размеры файла.
  3. Через blendshapes. Можно сохранять блендшейпы в Fbx и анимировать в движке. Можно сконвертировать pc2 в блендшейпы (В Unity ассет Vertex Animation Tools).
  4. Сконвертировать в анимацию костей, например ассетом Labs Bones skinning converter.

Часто для использования в шейдерах в игровом движке необходимо запечь информацию на вертексы.

  1. Цвет и альфа.

На точках или вертексах атрибуты Cd и Alpha автоматически преобразуются в вертексный цвет. Важно, что Alpha не сработает без Cd, то есть нужны будут оба этих атрибута (но при этом можно использовать только Cd). В вертексный цвет и альфу сохраняются только положительные значения. Отрицательные клампятся до нуля.

2. UV

В fbx можно сохранить 8 наборов UV. В зависимости от движка вы можете прочитать их все, или только часть. Например в Shader Graph в Юнити доступно всего 4 набора UV.

UV могут лежать на точках или на вертексах, но все наборы должны лежать на одном уровне. При этом нельзя использовать UV2-8, если нет основного набора.

Таким образом из Гудини экспортируются атрибуты: uv, uv2, uv3, uv4, uv5, uv6, uv7, uv8

Несмотря на то, что в Гудини это векторные атрибуты с тремя значениями, в fbx они сохраняются как Vector2, то есть используются только первые два значения, uv.x и uv.y.

Нельзя. При работе Энжина в фоне запускается Гудини, поэтому он может использоваться только в режиме редактора.

Это плагин, который позволяет открывать цифровые ассеты Гудини в других программах, например в Unity3D и Unreal. Вы создаете ассет со всеми необходимыми параметрами, после чего загружаете его в Houdini Engine, и можете настраивать геометрию в интерактивном режиме.

KineFX (1)

Допустим, вам надо вставить в руки персонажа оружие, надеть шапку на голову и так далее. Все очень просто. Выставьте вашу модель аксессуара в нужную позицию, когда персонаж находится в исходной позе. После этого запакуйте ваш объект и используйте ноду Capture packed geometry, в которой можно вручную добавить связь. В Capture geo поставьте ноль (раз уж это пакед, то и примитив всего один). В joint нажмите на стрелку и выберете самую подходящую точку-джойнт. Теперь результат объедините со старым скином, и все будет работать.

Obj (10)

Привязать камеру к нескольким нулям, где каждый будет отвечать за разные типы поворотов.

А лучше всего использовать мой ассет. Проверен на многих крупных проектах.

Через констрейнты. На Obj-ноде во вкладке Transform внизу включаем галку Enable Constraints и нажимаем круглую зеленую кнопку справа. Появится список пресетов, там есть Follow path. Нужно будет выбрать кривую, а также опциональные объекты, отвечающие за направление поворота объекта и за направление вверх. В получившемся чоп-нетворке можно поменять анимацию (по умолчанию там стоит движение на протяжении всего таймлайна. Для гладкого скольжения кривая должна быть типа Nurbs.

Констрейнты — это ЧОП-нетворки, которые полностью перезаписывают значения всех трансформов.

Подробно про них я рассказываю в курсе про процедурную анимацию:

https://gum.co/chopnet

Выбрать камеру в режиме Manipulate, щелкнуть правой кнопкой по хэндлу и выбрать Focus Handle. Горячая клавиша «Z».

Кубик — точка фокуса, стрелки обозначают глубину резкости и меняют диафрагму в установках камеры.

Сами установки глубины резкости находятся во вкладке Sampling камеры. Focus distance — расстояние, F-Stop — диафрагма.

Obj-нодой Switcher. На ее вход подаются камеры, их можно переключать. Саму ноду Switcher можно выбрать в качестве камеры во вьюпорте и в РОП-ноде.

Есть Obj-нода Extract Transform. В ней указывается начальная геометрия и трансформированная геометрия. Сама по себе эта нода выступает в качестве нуля, к которому можно подключать другие ноды.

Если нужно перенести на уровень Obj трансформации точки (например поворот и скейл через N, orient, pscale и так далее), то в SOP добавляем Point VOP, в нем ставим ноду Make Instance transform и следом за ней Extract transform. Make Instance Transform позволяет из разных атрибутов трансформации получить матрицу, а нода Extract transform из матрицы получить углы эйлера и скейл. После чего можно записать повороты в атрибут и прочитать этот атрибут на уровне Obj выражением point().

Также существует obj-нода Rivet, которая позволяет вытащить трансформации с поверхности модели по группе точек. Это может быть полезно для прикрепления какого-то объекта к геометрии, которая деформируется в SOP. Альтернатива — нода Sticky, которая приклеивается к поверхности по UV-координатам, а не по номерам точек.

Добавить между родителем и дочерней нодой ноду Blend. В ней можно выбрать маску пэрентинга. Также эта нода позволяет блендить дочерний объект между несколькими входящими объектами — как по весам, так и последовательно.

Создаем Null, привязываем его к камере, отодвигаем по Z. Создаем Chop network, в нем две ноды Get World Position — в одну вставляем камеру, во вторую Null. Их втыкаем в ноду Vector, в которой нужно выбрать Operation — Distance between A and B. На выход добавляем Null и называем его OUT.

Теперь в Чопе, в канале с названием «dist» будет расстояние между камерой и нулем. Осталось прочитать его через выражение Chop() в параметре Focus Distance.

Вкладка Render — Display as. Там можно выбрать Hidden или любой другой режим отображения. Особенно полезно, если геометрия в ноде тяжелая.

Второй вариант — включить ноду в Forced в РОП-ноде.

Во вкладке Render поставить галку Display. Теперь, если в параметре Display будет ноль, геометрия с ноды не будет отображаться и рендериться.

Второй вариант — внутри Sop-нетворка сделать Switch с нодой Null.

Скорее всего проблема в претрансформации. Если нажать средней кнопкой мыши на Obj-ноде, можно увидеть графу Pre-transform. Если она не пустая, то вытащить претрансформы обратно в параметры ноды через Modify Pre-Transform — Extract Pre-Transform.

Redshift (12)

Без паники, перезагрузите Гудини!

Это зависит от формата изображения, по умолчанию в exr большинство эффектов не сохранится, а в jpeg сохранится всё. Настроить это можно на ROP ноде: Output — PostFX.

Для волюметриков нужен специальный материал RS Volume и необходимо повысить Volume Contribution Scale на источниках света.

Вам помогут настройки Opacity Affects Alpha Channel на вкладке Advanced материала, и Enable Legacy Opacity Affects Alpha Channel на ROP ноде: Redshift — System.

Нужно создать целочисленный параметр с названием RS_matprop_ID. При рендере его значение будет считаться Material ID и учитываться в аовах типа Puzzle matte.

В настройках Back-Plate на Dome Light.

Можно заменить камеры и ROP-ноды на новые. Скорее всего ваша версия Редшифта значительно новее чем в проекте, и могло появиться много новых параметров, которые конфликтуют со старыми.

Некоторые аовы, point base SSS и GI при рендере в режиме Progressive не отображаются. Аовы при этом просто не работают, а GI и SSS считаются методом Brute Force. Так что нужно переключиться в режим Bucket Rendering

Возможно указана неверная гамма на ноде RS Texture у карты нормалей. Необходимо включить Gamma Override.

Возможно полигоны направлены неверно, направление полигонов можно определить по цвету во вьюпорте. Обычные серые — всё в порядке, синие — это обратная сторона полигона. Нода reverse может развернуть направление полигонов, в том числе по группе. Вывернутые полигоны очень критичны при рендере стекла, или прозрачных объектов. Также они могут сильно влиять на освещение. Так же проверьте нормали, лучше просто пересчитать их нодой Normal. Они могут быть как просто неверно посчитаны, так и не нормализованы, что тоже вызывает артефакты.

Нет, нужно использовать Material Override, есть хороший урок на эту тему:

В настройках отражений стоит поднять сэмплы, также помогут настройки Sample Filtering на ROP ноде: Redshift — Settings — Sampling Options. В частности нужно опустить Max Subsample Intensity и Max Subsample Ray Intensity до 2 или 1.

Все нюансы настройки и оптимизации рендера вы можете узнать из нашего курса «Redshift в Houdini»:

Render (7)

На рендер-нодах есть вкладка Objects.

Candidate objects (Lights) — использует флаги видимости на нодах на момент рендера

Force objects (Lights) — включает объекты и светильники в рендер.

Exclude objects (Lights) — исключает объекты и светильники из рендера.

Если нужно отрендерить несколько РОП-нод, подключаем их к ноде Merge и нажимаем кнопку Render уже на ноде Merge. Важно, что при рендере анимации на всех РОП-нодах должен стоять диапазон Render Frame Range Only (Strict).

В случае рендера в Redshift, на ноде Merge нужно нажать Controls, и выбрать Order: Node by Node. И нажимать кнопку Render уже из этого окна.

На любые, начиная с Indie.

Существует, но он не работает с последними версиями Гудини и имеет кучу проблем. Ссылки ищите сами.

Скорее всего вы накладываете материал на Obj-параметрах ноды, а на полигонах геометрии лежит атрибут shop_materialpath с другим материалом. Такое может случиться на тестовых моделях, или после ноды UV Quick Shade. Атрибут приоритетнее, поэтому он перезаписывает материал с верхнего уровня. Удалите атрибут, или накладывайте материалы так же нодой Material

Мантра и Карма (в текущей версии) — CPU-рендеры, то есть работают на центральном процессоре. Они бесплатные, идут в комплекте с Гудини. Мантра — самый гибкий и хорошо интегрированный с Гудини движок рендера, но и самый медленный. Karma — движок, который пришел на смену Мантре в версии 18.0. Карма предназначена для работы с USD/Hydra, то есть в контексте LOP.

Redshift и Octane — GPU-рендеры, работают на видеокартах Nvidia. Поддержка AMD планируется в будущем. Эти движки быстро считают, скорость можно увеличивать, добавляя новые видеокарты в систему. Существуют некоторые ограничения. На мой взгляд из этих двоих Редшифт лучше интегрирован с Гудини. Это платные движки.

Самое важное: красиво можно сделать на любом движке рендера. Некрасиво тоже.

Рендер честного ДОФа — долгий процесс даже для GPU-движков. Если сцена простая с твердыми телами, без полупрозрачных объектов и дыма, то композный доф сработает на ура. Если же есть дым, полупрозрачные объекты типа шурешек, преломления и мелкие детали, то, возможно, придется считать честный ДОФ.

В любом случае имеет смысл сделать тестовый рендер одного кадра и проверить, как сработает ДОФ на композе. Все сильно зависит от вашей сцены.

SOP (21)

В Fog в каждом вокселе хранится плотность (или другие значения типа температуры) в этом месте. Именно в таком формате, например, хранятся дым, огонь и так далее.

В SDF в вокселе хранится расстояние до поверхности объекта. Если воксель находится внутри объекта, то знак минус, если снаружи, то знак плюс, на поверхности ноль. Таким образом через один volume sample можно выяснить, находится ли точка внутри объекта. Поэтому SDF волюмы часто используются для вычисления коллизий и любых поверхностных эффектов.

В стандартном представлении волюма, которое делается, например, нодой Iso offset, каждый воксель внутри куба имеет какое-то значение, даже если в нем ничего нет.

В VDB хранятся только те воксели, в которых реально что-то есть. Вокруг поверхности объекта создается так называемый Band, пояс из определенного числа вокселей. Все, что за пределами этого пояса, не учитывается.

Таким образом VDB занимает меньше памяти, его быстрее обрабатывать. Но при этом в нем сохраняется не вся информация, что может быть критично, если волюм используется для вычисления расстояния до поверхности через SDF.

В ноде Carve есть режим Extract — Extract Point(s). В нем от кривой останется одна или две точки (при включенном параметре Second U).

Если нужно решение в вексе, то здесь понадобится функция Primuv.

// На первый вход врангла подается одна точка, на второй - кривая. 
// Параметром anim можно перемещать точку по этой кривой.
// Ноль означает номер примитива. Если примитивов больше одного, нужно будет подставить вместо него правильные номера.
@P = primuv(1, "P", 0, ch("anim"));

У полигонов есть лицевая и изнаночная сторона, по-английски Front и Backface. Сторона определяется исключительно по порядку обхода вертексов. Если вертексы идут по часовой стрелке, то сторона лицевая.

Гудини подкрашивает тыльную сторону полигонов синим цветом, это поведение можно изменить в настройках вьюпорта (D над вьюпортом), меню Markers, Tint backfaces. Чтобы эмулировать поведение игровых движков, можно пойти в этом же окне во вкладку Optimize и включить Remove backfaces. В этом случае тыльные стороны полигонов не будут отображаться вообще.

Чтобы вывернуть полигон, необходимо поставить ноду Reverse, которая пересоберет вертексы в противоположном порядке.

Важно, что атрибут N, то есть нормаль, не связан с направлением полигона. При вывернутом полигоне нормаль может смотреть и в правильную сторону. Поэтому, если после ноды Reverse геометрия стала черной, надо пересчитать нормали нодой Normal.

Если вам нужно найти нормаль исходя из направления полигона, можно использовать VEX-функцию prim_normal(geo, prim number, u, v), которая вернет эту нормаль в полигоне prim number в позиции параметрических координат u,v.

Иногда из других пакетов (особенно из КАД) приходят модели с частично вывернутыми полигонами. Прежде чем паниковать, надо задать себе вопрос: а действительно ли это плохо?

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

  1. Они находятся на полупрозрачной геометрии с преломлениями. На рендере будут артефакты.
  2. Модель для игрового движка. Большинство шейдеров в движках по умолчанию не показывают бэкфейсы для оптимизации.
  3. Планируется еще процедурно менять модель. Например Extrude зависит от направления полигонов.

В остальных случаях, скорее всего, неправильно направленные полигоны не будут заметны на рендере. Можно отключить Tint Backfaces и не обращать на них внимание.

Если вы, все-таки, обнаружили артефакты, то придется эти полигоны корректировать. Универсального метода, который исправляет все плохие полигоны, не существует. Результат будет сильно зависеть от топологии.

Варианты исправления:

  1. Нода Polydoctor, вкладка Topology, Correct Winding of Polygons to Majority… Эта нода найдет направление большинства полигонов в острове геометрии и исправит оставшиеся. Соответственно, полигоны должны быть связанны друг с другом (Fuse).
  2. Добавить ноду Boolean в режиме Union. Если топология связная, то вывернутые полигоны пропадут. Остается найти, какие полигоны пропали и реверснуть их на исходной геометрии. Например, сохранить исходный номер примитива в атрибут index нодой Enumerate, создать на геометрии с булем атрибут @mask=1, а потом нодой Attribute copy скопировать этот атрибут на исходную геометрию, используя Index в качестве атрибута соответствия.

3. Вычислить объем. Создать атрибут сlass на полигонах нодой Connectivity по примитивам. Добавить Measure — Volume — Accumulate Per Piece. Если топология связная, после этого на вывернутых полигонах будет отрицательный объём. Его можно использовать в ноде Reverse, добавив в группу @volume<0

4. Если у вас на модели есть нормали, и они правильно направлены, то можно сравнить нормаль с вектором, который получается после prim_normal(). Если они противоположно направленные, то полигон вывернут. Это определяется функцией dot().

5. Можно вручную расставить точки снаружи объекта и воспользоваться следующим кодом для выделения перевернутых полигонов. Так можно быстро пофиксить полигоны на видимой части объекта. На второй вход врангла подается одна точка, позиция условной «камеры», из которой пускаются лучи. Врангл по примитивам. Можно поставить несколько вранглов подряд с разными точками. На выходе образуется группа с названием rev, по которой можно ставить Reverse.

vector cam = point(1,"P",0);
vector ray = normalize(@P-cam);
vector norm = prim_normal(0,@primnum,0,0);
vector pos, uv;
if (intersect(0, cam, ray*10000, pos, uv)==@primnum)
{
    if (dot(ray, norm)>0) @group_rev=1;
}

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

Group expression — Points — пресет Point valence. Создаем параметр и выбираем в нем 1. Это выражение поместит в группу все точки, у которых один сосед.

Нода Group — Edges — Unshared edges.

С помощью ноды Attribute Promote перенести атрибут на Деталь в режиме Minimum или Maximum. Также на Promote можно изменить название атрибута (Change new name) и убрать галку Delete Original, чтобы сохранить исходный атрибут.

Кстати, таким же образом можно найти сумму всех значений, среднее арифметическое или медиану.

Сначала объединить их нодой Fuse, а потом добавить ноду Poly Path.

Нода Facet — Unique points.

Первое, что нужно понимать: параметр Group строковой. То есть по умолчанию он считает, что в него заносится название группы. Поэтому если вы пишите сравнение атрибута, нельзя ставить пробелы между символами.

@P.y>0 - правильно
@P.y > 0 - неправильно

При использовании подобных сравнений нужно указывать Group type, на каком уровне геометрии лежит нужный нам атрибут (точки, примитивы и т.п.). В большинстве случаев Гудини определит этот уровень самостоятельно, но не всегда.

Если вы используете не просто сравнения, а выражения, то эти выражения лучше на всякий случай заключать в бэктики, обратные апострофы. В последних версиях Гудини чаще всего значение выражение вычисляется правильно и без них, но хуже не станет.

Нода Convert Lines превращает каждый отрезок кривой в полигон. Чтобы разъединить точки нужно поставить после нее ноду Facet — Unique points.

Если мы знаем номер точки-вертекса-примитива, то через выражения point(), prim(), vertex().

Если не знаем, то запускаем цикл foreach, например по примитивам, и читаем атрибут через выражения с ноды Foreach_begin с примитива номер ноль. Поскольку в цикл затягивается только один примитив за раз, то внутри цикла будет только один, нулевой по номеру, примитив.

Например вам нужно прочитать значение атрибута с поверхности объекта, наиболее близкой к какой-то точке. При этом можно читать атрибут не с точек, а между ними, интерполируя значения.

Для этого есть две Vex (VOP) функции.

xyzdist() находит эту координату на поверхности, возвращает расстояние до нее, номер примитива и параметрические координаты внутри этого примитива.

primuv() по номеру примитива и параметрическим координатам внутри него возвращает значение атрибута в этой точке, интерполируя его между точками полигона.

Пример кода на Vex:

vector uv;
int prim;
xyzdist(1, @P, prim, uv);
@Cd=primuv(1, "Cd", prim, uv);

Этот код для каждой точки находит ближайшую точку на поверхности геометрии из второго входа Wrangle и заберет с нее цвет.

Нода Group Expand. У нее есть галка Flood fill to connected geometry.

  1. Рампу необходимо менять на верхнем уровне, то есть на самом VOP, менять ее на ноде Ramp Parameter внутри ВОПа не получится, это всего лишь значения по умолчанию.
  2. Если у вас используется несколько рамп, ОБЯЗАТЕЛЬНО нужно изменить имена этих рамп на разные, иначе они будут ссылаться на один и тот же параметр. Иногда при смене имени результат появляется не сразу, рампы как бы залипают. В этом случае нужно или нажать кнопку Force compile или удалить и заново создать Ramp parameter.

Дело в атрибутах и их значениях по умолчанию. Если в одной из веток, приходящих на ноду Merge есть атрибут N, а на второй его нет, то он добавится на вторую геометрию со значением по умолчанию. Это касается всех атрибутов.

Решение: добавить нужный атрибут во вторую ветку.

Attribute Wrangle (VOP) — основная нода для работы с геометрией. В ней через значок собаки (или Bind в VOP) мы можем обращаться к атрибутам на геометрии: @attr, @P, @N

Point, Primitive, Vertex Wrangle (VOP) — просто предустановки Run Over на ноде Attribute VOP. По сути вместо них можно пользоваться нодой Attribute Wrangle (VOP) с нужным вам параметром Run Over.

Volume и HeightField Wrangle (VOP) — нода для работы с волюмами. Volume от Heightfield отличается только названием. В них через значок собаки (или Bind в VOP) мы можем напрямую читать и записывать значения вокселей по названию волюма: @density, @height, @mask

Rig Attrib Wrangle (VOP) — нода из Houdini 18.5 для работы с ригом KineFX. От Attribute Wrangle отличается наличием вкладки Rig, в которой можно задать использование Viewer State (то есть хэндлов во вьюпорте) и подсчета трансформаций на входах-выходе.

Практически разницы нет. Одинаковые вещи можно делать и там, и там. Считайте, что VOP — это визуальная настройка над языком Vex.

В Vex удобнее работать с циклами, с условиями, с массивами. Да и в принципе написать код часто бывает быстрее, чем тыкать ноды в VOP.

В VOP удобно экспериментировать, приятнее работать с нойзами, не нужно знать программирование. Нет ничего зазорного в том, чтобы работать в VOP.

Это Wrangle, в котором автоматически вычисляются трансформации не только позиции, но и атрибутов типа N, v и так далее. Изменения позиции должны записываться не в @P, а в переменную pos. Остальные вектора будут трансформироваться в соответствии с методом, указанным во вкладке Derivatives.

В этом варианте использования Deformation Wrangle дает такой же результат, как нода Atribute reorient.

Это красный флаг на ноде, который замораживает текущее состояние ноды и сохраняет его в проекте. После этого все, что находится выше этой ноды, не будет пересчитывается. При этом увеличивается размер проекта на диске, что приводит к большему времени загрузки и сохранения. В случае импорта Fbx-файлов с анимацией старым методом (через меню File), необходимо замораживать входящие ноды (так делается по умолчанию), чтобы избежать глюков в анимации.

Альтернативы:

Нода Stash — делает то же самое, сохраняет состояние в проекте по нажатию кнопки.

File cache — сохраняет состояние на диск в виде секвенции кадров. В отличие от предыдущих вариантов может работать с анимацией. Но файлы кэша на диске могут занимать значимое место.

VEX (18)

Чтобы удобно редактировать VEX-код в Visual Studio Code вам нужно будет поставить два расширения. Идите в пункт меню Extensions, сделайте поиск по фразе VEX и установите расширения VEX (Houdini Vex Support for VSCode), а также Houdini Vex Help.

После этого vfl-файлы будут показываться с правильным синтаксисом. Кроме того, когда курсор находится над ключевым словом, то при нажатии клавиши F2 будет открываться браузер хелпа Гудини со статьей по этому ключевому слову.

Чтобы открывать Векс-код из врангла в более удобном редакторе, щелкните правой кнопкой мыши по полю ввода кода и выберите Expression — Edit in external editor. Если вы до этого не устанавливали внешний редактор, нажмите Yes в появившемся окошке, после чего откроется окно выбора исполняемого файла вашего любимого редактора.

Код из врангла сохраняется во временный файл, который открывается в редакторе. Когда вы сохраняете его, код автоматически апдейтится во врангле. Чтобы убрать эту связь, можно выбрать пункт меню Expression — Remove file watcher.

Если вы хотите привязать другой внешний редактор, удалите или отредактируйте файл ExternalEditor.cfg, который лежит в папке /User/Documents/HoudiniXX.X/

Надо отметить, что внешний редактор можно использовать не только для Врангла, но и для ноды Python и вообще любых других полей ввода параметров. При этом, когда вы сохраняете код из ноды Python, он сохранится с расширением .py, и ваш редактор сможет автоматически переключить синтаксис языка программирования.

Можно добавить горячую клавишу на открытие внешнего редактора, но она будет действовать только в том случае, если курсор мыши находится над полем Vexpression, расположенны прямо над окном ввода кода.

Короткий ответ — нет, но на практике это может зависеть от конкретных нод.

Векс — язык быстрый, но все равно высокоуровневый. Большинство стандартных нод скомпилированы и будут выполняться быстрее. Другое дело, что ноды меняются, обрастают новым функционалом и не всегда работают оптимально. Проблема в том, что это можно проверить только опытным путём, сравнивая время исполнения ноды и аналогичного кода во Врангле через Performance Monitor.

На мой взгляд лучше искать возможности для оптимизации в другом месте.

В ноде Carve есть режим Extract — Extract Point(s). В нем от кривой останется одна или две точки (при включенном параметре Second U).

Если нужно решение в вексе, то здесь понадобится функция Primuv.

// На первый вход врангла подается одна точка, на второй - кривая. 
// Параметром anim можно перемещать точку по этой кривой.
// Ноль означает номер примитива. Если примитивов больше одного, нужно будет подставить вместо него правильные номера.
@P = primuv(1, "P", 0, ch("anim"));

Самое простое — включить выход нужной ноды в один из входов Врангла и подставить в функции номер этого входа. Если входов не хватает, вы всегда можете добавить сколько угодно Spare input через меню шестеренки и Add spare input, подключить в них нужные ноды и обращаться к ним по номеру со знаком минус (-1, -2 и т.д.).

Второй вариант: использовать синтаксис op:/путь/до/ноды

Например, если нужно прочитать число точек на ноде с названием sphere1, которая лежит в этом же нетворке, то синтаксис будет таким:

npoints("op:../sphere1");

То есть, относительный путь работает так же, как и в Hscript. Абсолютный путь будет таким:

npoints("op:/obj/geo1/sphere1");

В вексе для этого есть две функции:

atof("строка") - преобразует строку во флоат
atoi("строка") - преобразует строку в целое число

При этом в строке не должно быть других символов, кроме цифр, десятичной точки и знака «е» для записи типа 1.25e+5

Например atof(«12.5») вернет число 12.5

Для целых чисел есть функция opdigits(), которая возвращает последнюю последовательность целых чисел из строки. Обычно она используется, чтобы парсить пути до нод, но и для обычных строк работает.

opdigits("gfhfhg123jshfh") вернет 123

Если же в строке есть другие символы, кроме цифр, и нужно вытащить из нее флоат, то задача сводится к удалению лишних символов из строки. Это делается с помощью регулярных выражений (regular expression, regexp).

Функции для работы с регулярными выражениями в вексе начинаются с приставки «re_».

s@in = "gfhdg12.5jahd";
@out=atof(re_replace(r"[^.0-9]+", "", @in));
В @out окажется число 12.5

Во второй строке мы используем функцию re_replace, которая ищет в атрибуте @in подстроку по регулярному выражению [^.0-9]+, то есть все, кроме точки и цифр 0-9. Буква r перед кавычками важна. 

Дальше мы заменяем найденное на пустую строку «». На выходе у нас остаются только цифры и точка, к которым мы уже применяем atof.

А вот если нужно распарсить строку, где может быть несколько чисел с буквами и символами между ними, то используем такую конструкцию:

s@in="123hjh765.4hfhsd12jsh";
string array[] = re_split(r"[^.0-9]+", @in);

Эта функция создаст массив строк, а в качестве разделителя использует все то же выражение. Единственное, если исходная строка начинается не с цифры, то в начале массива создастся пустой элемент, надо это учитывать. В данном примере на выходе будет массив из строк “123″, “765.4″, “12″. Дальше уже можно по этому массиву идти циклом и использовать atof().

Поскольку функции point(), prim(), detail() и им подобные могут возвращать разные типы данных, то просто написать f@attr = point(1, «P», @ptnum).x; не получится, Врангл выдаст ошибку Ambiguous call to function

Чтобы подобная записать сработала, необходимо сказать Вексу, что мы читаем именно вектор. Это можно сделать двумя путями: создать векторную переменную и читать значение позиции в нее или скастовать функцию в векторный тип.

// В этом примере мы сначала записываем позицию в векторную переменную и читаем значение компоненты из нее
vector pos = point(1, "P", @ptnum);
f@height = pos.y;

// В этом примере мы используем приведение типа функции
f@height = vector(point(1, "P", @ptnum));

Приведение типа функции или по-английски Cast выполняется записью вида ТИП_ДАННЫХ(выражение). Этот тип приведения не использует никакого реального преобразования, он просто говорит Вексу, какой из перегруженных вариантов функции использовать.

В Вексе можно прочитать и записать атрибут на геометрии в синтаксисе тип@название. Если тип не указан, а атрибут не находится в списке «известных», то он получит тип Float.

ТипСинтаксис
floatf@имя
vector2u@имя
vectorv@имя
vector4p@имя
inti@имя
matrix22@имя
matrix33@имя
matrix4@имя
strings@имя
dictd@имя

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

ТипАтрибуты
vectorP, accel, Cd, N, scale, force, rest, torque, up, uv, v
center, dPdx, dPdy, dPdz в Volume wrangle
vector4backtrack, orient, rot
intid, nextid, pstate
переменные индексирования: elemnum, ptnum, primnum, vtxnum, numelem, numpt, numprim, numvtx
group_*
ix, iy, iz, resx, resy, resz в Volume wrangle
stringname, instance

Таким образом можно не указывать тип атрибута, если он типа float, а так же для известных атрибутов. Во всех остальных случаев при первом упоминании атрибута в коде этот тип указывать обязательно. После того, как в коде уже был указан тип атрибута, дальше к нему можно обращаться без типа.

Такое количество нюансов справедливо пугает новичков, поэтому вот вам главное правило: если сомневаешься — лучше указывать тип всегда, хуже от этого не станет, ошибку это не вызовет, зато сэкономит время на отладку.

Если речь про целое число, то существует функция itoa(number), которая из числа типа 125 возвращает строку «125». Эта функция часто используется для работы с атрибутом name, мультипармами или инстансами.

// в атрибут instance запишется строка box0, box1, box2 и так далее в зависимости от числа в атрибуте id.
s@instance = "/box"+ itoa(i@id);

// в атрибут text запишется строковое значение из строкового параметра мультипарма (text0, text1, text2 и так далее).
s@text = chs("text" + itoa(num));

Если же нам нужно перевести в строку флоат или как-то отформатировать результат, то необходимо использовать функцию sprintf(). В ней задается произвольная строка, в которой встречаются служебные последовательности символов типа %g, %d, а после строки через запятую перечисляются значения, которые подставятся вместо этих символов. Также эта функция поддерживает дополнительные опции форматирования, такие как выравнивание, padzero и т.д.

// В атрибут filename запишется значение типа image_0001.jpg, где 0001 - это номер кадра
// Запись вида %04d сделает длину числа равной 4 и забьет свободные места нулями
s@filename = sprintf("image_%04d.jpg",@Frame);

// В атрибут floatstring запишется значение атрибута pscale
s@floatstring = sprintf("%g", f@pscale);

Описание всех возможных вариантов форматирования можно почитать здесь.

Для проверки вхождения точки-примитива-вертекса в группу есть функции inpointgroup(), inprimgroup(), invertexgroup().

Но удобнее использовать виртуальный атрибут @group_название

В этом атрибуте будет 0, если элемент не принадлежит группе, и 1, если принадлежит.

Таким образом проверку на вхождение в группу start можно осуществлять так:

if @group_start==1 ...
или
if (@group_start) ...

Очевидный способ — использовать функции point(), prim(), vertex(), detail(), где первым аргументом указать номер входа.

Есть более простой синтаксис, который выглядит так:

@opinput1_P, i@opinput2_index, v@opinput3_dir

Указание типа происходит по стандартным правилам. После знака @ ставим opinput номер входа и через нижнее подчеркивание название атрибута. Нумерация начинается от нуля.

При этом берется атрибут с элемента с таким же номером, который отрабатывается Вранглом в данный момент. Если Врангл запущен по точкам и отрабатывается точка номер 10, то и с другого входа атрибут будет прочитан с точки номер 10.

Но также у ноды Wrangle есть параметр Attribute to match. В случае его наличия, будет проверяться не номер элемента, а значение в этом атрибуте, например id. Значит, что атрибут будет читаться не с текущего номера элемента, а с элемента, у которого id совпадает.

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

Вот вам шпаргалка.

Struct — это структура данных, которая позволяет использовать инкапсуляцию, пусть и в ограниченном виде.

Struct необходимо создавать во внешнем файле, а не в самом Врангле. Создайте внешний файл так, как это описано в этом вопросе: http://hipnc.club/ufaqs/custom-functions/

Struct может содержать как поля, так и методы (если пользоваться терминологией ООП).

// Упрощенный пример использования структуры для создания двумерного массива
struct IntArray
{
	int _xSize;
	int _array[];

	void Create(int xSize, ySize)
	{
		_xSize=xSize;
		resize(_array, xSize*ySize);
	}

	int Value(int x, y)
	{
		return _array[y*_xSize + x];
	}

	void Set(int x, y, value)
	{
		_array[y*_xSize + x] = value;
	}
}

После этого во Врангле делаем #include с именем вашего файла. Обращаться к структуре можно следующим образом:

#include "arrays.h"

IntArray arr;
arr->Create(10,10);
arr->Set(3,5,1000);
printf("Array value: %d", arr->Value(3,5));
printf("Array X size: %d", arr._xSize);

К «полям» мы обращаемся через знак «точка», а к «методам» через «->».

Также у структур есть конструктор, проще говоря их можно инициализировать следующим образом:

MyStruct var = MyStruct(10, 20, "String");

То есть мы используем название структуры в качестве функции и перечисляем в аргументах значения для всех полей.

Обратите внимание, что в Вексе нельзя создать массив массивов, даже если вы закрыли свой массив в структуре. То есть если планируется сделать массив структур, то внутри структуры не может быть массивов. Как вариант обхода этого ограничения: создать в структуре функцию, которая возвращает массив, а сам массив уже хранить в теле этой функции, тогда ошибки не будет.

Создайте файл с расширением .h, например myvex.h. Этот файл необходимо поместить в папку, которая указана в переменной окружения HOUDINI_VEX_PATH или же в папку ДОКУМЕНТЫ/HoudiniXX.XX/vex/include.

После этого вы сможете обращаться к указанным в этом файле функциям, добавив в начало кода во Врангле строку

#include "myvex.h"

Если же вам нужно передать проект кому-то другому и у вас нет уверенности, что на другой машине будут такие же файлы, можно в include использовать относительный путь:

#include "$HIP/myvex.h"

Также можно встроить функцию прямо во врангл:

  1. Разлочить врангл (Allow Editing of contents на ноде Врангл)
  2. Заходим внутрь два раза, до ноды Snippet
  3. В ноде Snippet можно в параметр Include files записать прямой путь до вашего файла. К сожалению, путь должен быть абсолютным.
  4. Также в ноде Snippet можно скопировать полностью код из вашего h-файла в параметр Outer Code (или можно запромоутить его на верхний уровень ассета).
  5. После этого команду #include можно убрать из кода

В Sublime выбрать пункт меню Preferences/Package Control. Набрать «Install package». В появившемся окне найти и установить VEX Syntax. Теперь синтаксис Векса появится в списке в меню View/Syntax.

Чтобы функция возвращала массив, нужно при ее объявлении использовать слово function, в противном случае выпадет ошибка.

function int[] foo()
{
int array[] = {1,2,3};
return array;
}

Допустим, вы не знаете точно названия атрибутов на геометрии. Как получить список их имен, чтобы выбрать нужный?

Для этого существуют следующие интринсики на уровне детали: pointattributes, primitiveattributes, vertexattributes и detailattributes. Их можно прочитать в строковые массивы и уже дальше работать с ними, как с обычными строками. Например, можно сделать поиск по какому-то условию через re_find, найти имя нужного атрибута и записать в него что-то через функции setpointattrib, setprimattrib и так далее.

Чтение из интринсиков выглядит так:

string pointattribs[] = detailintrinsic(0,"pointattributes");
string primattribs[] = detailintrinsic(0,"primitiveattributes");
string vertexattribs[] = detailintrinsic(0,"vertexattributes");
string detailattribs[] = detailintrinsic(0,"detailattributes");

Часть функций в Вексе читают информацию с входящей геометрии. Например атрибуты, группы, габариты и так далее. В хелпе у таких функций обычно присутствует аргумент Geometry.

В этот аргумент записывается или номер входа Врангла, с которого забирается значение (включая отрицательные числа для Spare inputs), или же путь до нужной ноды в формате «op:…».

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

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

Дословный перевод хелпа

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

По хорошему нужно писать в этот аргумент функцию geoself(), но это функция-пустышка, которая всегда возвращает ноль. Поэтому записывать в geohandle ноль или geoself() — исключительно вопрос философии разработки и читаемости кода. Главное — не путать этот аргумент с номером входа Врангла.

Анимация (4)

Откройте окно Animation editor, выберите нужные вам каналы анимации, после чего щелкните правой кнопкой по названиям каналов в списке Channel list. В открывшемся меню выберите Channels/Extrapolation. Там можно задать общее поведение, а также поведение канала анимации до первого и после последнего ключевого кадра.

Щелкнуть с Shift на нужный параметр. Левая кнопка мыши — будет показан только этот параметр. Средняя — параметр добавится к имеющимся в окне аниматора каналам.

Выбрать инструмент Box handle или Box handle with pivot и выделить нужные ключевые кадры.

Второй вариант: прямо на полосе таймлайна выделяем участок левой кнопкой мыши с Shift. Потом средней кнопкой мыши можно тянуть за края участка, сжимая или растягивая ключи по времени.

Выберите инструмент Pose (иконка в виде куклы слева от вьюпорта), после этого в меню над вьюпортом включите галку Motion Path. Появится траектория движения выбранного в Obj объекта. Если вы хотите, чтобы траектория оставалась на экране при переключении объектов, щелкните на ней правой кнопкой мыши и Выберите «Persistent». После этого траектория будет сохраняться во вьюпорте даже если выключить сам объект.

Ассеты (4)

В Embedded сохраняются только ассеты, которые реально есть в сцене. Если вы подготовили ассет, но в сцене нет ни одного его инстанса, то он сотрется из проекта. Поэтому с Embedded-ассетами нужно работать очень аккуратно, можно потерять всю работу.

Целых три урока на эту тему.

Сделать его Embedded. Для этого в меню создания ассета вместо имени файла нужно записать Embedded (с большой буквы).

Before first create — вызывается один раз за сессию, когда первый инстанс ассета создается в проекте. Когда создается второй — вызов не происходит.

On Created — вызывается, когда создается инстанс ассета в сцене.

On Loaded — вызывается, когда ассет загружается вместе с проектом или копируется с клипборда.

On Updated — вызывается, когда обновляется Definition ассета.

On Deleted — перед удаление ноды. Включая создание нового проекта, открытие нового файла проекта или выход из Гудини.

After Last Delete — после того, как последний инстанс ноды удален из сцены.

On Input Changed — когда меняются входы у ноды (присоединяются новые ноды, удаляются связи, меняется их порядок).

On Name Changed — когда меняется название ноды.

On Install — когда определение ассета добавляется в проект через меню Assets/Install Asset library. Так же сохранение изменений ассета запускает ивенты On Uninstall и On Install.

On Uninstall — Когда определение ассета удаляется из сессии.

Интерфейс (18)

Выделить нужные ноды и потянуть связь с выхода одной из них с зажатой клавишей ALT.

Ctrl+Щелчок на разделитель панели — поменять панели местами

Alt+Щелчок на разделитель панели — горизонтальная/вертикальная раскладка

Ctrl+цифра от 1 до 5 — сохранить закладку

Цифра от 1 до 5 — переключиться на сохраненную закладку

Войти в параметры вьюпорта, для этого нужно нажать над вьюпортом клавишу D. В появившемся окне выбрать вкладку Guides.

Draw Time (FPS) включает отображение FPS. На старых версиях этот параметр назывался Show Time.

Geometry information — Always On включает отображение числа точек и примитивов.

Навести курсор на ноду и зажать клавишу A (Align), после чего провести мышкой наверх или вниз. Ноды выше или ниже по дереву выровняются по выбранной ноде.

В меню Edit — Preferences — General User Interface — Global UI Scale.

Или добавить в houdini.env строку вида HOUDINI_UISCALE=125

По сути это размер интерфейса, а точнее DPI в процентах от значения по умолчанию. 100 — исходный размер. 200 — в два раза больше.

Автор вопроса:
 Алексей

Shift+S

Нажать на параметр правой кнопкой, выбрать в меню: More/View Dependencies. В списке под «плюсиком» будут все ноды с параметрами, в которых есть ссылка на текущий. Там же можно выбрать ноду и перейти к ней, нажав на стрелку справа снизу.

Меню Render/Update Textures.

Также, если залипла текстура из COP network, поможет меню Windows/Cache manager, в котором можно почистить разные кэши.

В Network view в меню View выбрать Dependency links — Show for all nodes. Теперь, если одна нода ссылается на другую, между ними будет нарисована линия.

Удерживаем клавишу Y и ведём курсор через связи.

Shift+R

Правой кнопкой мыши щелкнуть по иконке «булавка» и выбрать цифру. Табы с одинаковыми цифрами привязаны друг к другу.

Тянем мышкой за нижний пин на ноде, чтобы появилась линия. Отпускаем мышку и нажимаем Tab. Теперь, когда мы выбираем ноду, она сразу будет привязана к предыдущей. Это особенно актуально для Веллума, Хэйра и прочих нод, где нужно сразу привязывать три входа.

Переключитесь на английскую раскладку клавиатуры

Спокойно! Нажмите Alt+T.

Такое случается, если вы используете фокусировку на объекте (Space+G). В этом режиме Гудини автоматом подстраивает клиппинг под размер объекта, что приводит к непредсказуемым результатам.

Это поведение можно отключить в настройках вьюпорта. Входим в настройки (клавиша D над вьюпортом), выбираем меню View. Там нас интересует раздел Clipping. Можно включить Homing Auto Adjust в Neither clip plane и вручную вписать нужные параметры клиппинга в параметры Near/Far Clip Planes.

Если же у вас включена и залочена камера, то эти параметры нужно менять уже на ней, во вкладке View — Near Clipping/Far Clipping.

Общие вопросы (13)

В бэктики (на виндовых клавиатурах этот символ находится над клавишей Tab) заключаются выражения, если они стоят в строковом параметре.

Например если вы в параметр Text ноды Font запишите ch(«fontsize»), то нода подумает, что вы хотите вывести такой текст, и во вьюпорте появится надпись «ch(«fontsize»)». Если же вы заключите эту надпись в обратные апострофы, то нода фонт поймет, что вы хотите прочитать значение этого выражения, и выведет цифру 1.

Это относится ко всем строковым параметрам, например имени файла. Единственное исключение — переменные, которые начинаются со значка доллара. $F, $FSTART и так далее можно писать без бэктиков.

Если вы хотите при старте Гудини загружать не пустой проект или производить какие-то настройки по умолчанию, то вам нужно будет создать файл 123.py. Это скрипт на Python, который будет исполняться всякий раз, когда Гудини стартует без проекта. Этот файл должен лежать в папке Документы/HoudiniXX.X/scripts.

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

hou.node('/obj/').createNode('cam')

Вы можете перетащить связку нод на шелф, потом на получившемся инструменте щелкнуть правой кнопкой, Edit tool — Script и скопировать получившийся скрипт в 123.py. Теперь эти ноды будут загружаться в пустом проекте.

Обратите внимание: если в стартовых скриптах есть ошибки, то Гудини покажет в консоли проблемное место, но не запустится.

Если вам нужно менять какие-то установки при загрузки ваших проектов, то для этого есть файл 456.py. Он запускается при загрузке проекта, в том числе через меню File.

Например, если вас раздражает, что в проекте сохраняется номер текущего фрейма и при загрузке проекта идет просчет симуляции до этого кадра, то вы можете поместить в 456.py такую строку:

hou.setFrame(1)

После этого проект всегда будет устанавливаться на первый фрейм при загрузке.

Через переменную окружения HOUDINI_MAX_BACKUP_FILES.

Можно добавить ее в Houdini.env, например так:

HOUDINI_MAX_BACKUP_FILES=3

При значении ноль ограничения снимаются.

Самое простое — выделить нужные ноды, перетащить их на верхнюю полку (shelf) и создать инструмент. Теперь при нажатии на этот инструмент эта связка нод появится в любом другом проекте.

Также можно открыть две копии Гудини и перекидывать ноды через Ctrl+C — Ctrl+V.

Проверить проект можно через меню Render/Pre-flight Scene. Появится окно, в котором красным обозначены все внешние ресурсы: модели, текстуры, кэш, ассеты. Прямо в этом окне их можно переносить в папку проекта.

Но удобнее пользоваться скриптом: https://github.com/paulwinex/houdini_localizer

Если вы загрузили Fbx с тейком и хотите удалить все тейки, оставив анимацию в Main, то:

  1. Windows/Take List
  2. Мышкой перетягиваем нужный тейк на Main и выбираем в меню Merge take (with override).
  3. Теперь остальные тейки можно удалить клавишей Del.

Лучше оба. Vex нужен для работы с геометрией и атрибутами. Python — для автоматизации работы, создания новых нод и так далее.

Можно, сами принципы моделинга не меняются, все инструменты в Гудини есть. На мой взгляд, все-таки, удобнее моделить в Максе-Майе-Блендере-Модо, и приносить в Гудини готовые модели.

Про директ-моделинг в Гудини есть урок от Алекса Удилова:

Можно, но есть нюансы. Основы работы не меняются, но некоторые отдельные ноды могли как сильно измениться, так и вообще пропасть. Для опытного человека разобраться с этим не составляет большой проблемы. Новичкам же я порекомендую проходить уроки по последним версиям пакета.

Урок про замену старых нод. Но он сам уже тоже старый. 🙂

По сути ничем. И то, и то — три флоата. Но вектор можно трансформировать нодами типа Transform, которые определяют положение в пространстве.

Если говорить точнее, то у вектора установлен тип «vector» в Typeinfo-метадате. Подробнее почитать про разные типы данных можно по ссылке.

Если вы хотите в Вексе изменить тип атрибута, то можно воспользоваться функцией setattribtypeinfo().

Это простой язык выражений, которым, в основном пользуются для изменения значений параметров. У каждой ноды есть переключалка языка выражений, по умолчанию там буква «H», то есть Hscript. Можно выбрать Python. Также язык выражений можно назначить для каждого параметра индивидуально в меню правой кнопки мыши.

Выражения Hscript перечислены в этом списке: https://www.sidefx.com/docs/houdini/expressions/index.html

По большому счету, когда мы пишем выражения в окно ввода параметра, мы всегда это делаем на Hscript, кроме случаев, когда мы сами переключили язык на Python или когда над параметром помечено Vexpression — в этом случае используется Vex.

Также синтаксис Hscript может использоваться в больших скриптах, например в инструментах на Shelf или в ассетах.

Obj, Sop, Mat, Shop, Dop, Chop, Cop, Top, Vop, Lop… В каждом из этих нетворков свой уникальный набор нод, это и есть контексты. Контексты — это разные части программы, которые отличаются друг от друга, отвечают за разное и работают тоже по-разному. Контексты можно делать вложенными. Например в Sop создать контекст Mat. Это нужно, чтобы вы могли сохранить в цифровой ассет все аспекты своего сетапа.

Obj — контекст сборки сцены из объектов

Sop — контекст работы с геометрией: точками, вертексами, полигонами и т.д.

Mat, Shop — контексты сборки материалов

Dop — контекст работы с динамикой

Chop — контекст работы с процедурной анимацией

Cop (IMG2) — нодовый компоузер

Rop (Out) — контекст вывода, рендер и сохранение

Top — контекст PDG, пакетные операции, автоматизация повторяющихся действий

Vop — контекст Vex-билдера, визуальное программирование. Так же используется в шейдерах.

Lop — контекст работы с USD.

Тейки — это система оверрайдов, дословно можно перевести как «Дубль» в киношном смысле, то есть еще одна версия сцены. Для вашего сетапа можно сделать много разных тейков с вариациями параметров.

Тейки выбираются в списке в правом верхнем углу. По умолчанию там есть один тейк Main. Можно создать новый тейк, параметры поменяют цвет на коричневый. Если выключена галка Auto takes, то параметры нужно включать в тейк вручную, через меню правой кнопки мыши. Все изменения параметров сохранятся только в этом тейке.

Будьте осторожны с Auto takes, очень легко запутаться в каком тейке вы работаете.

Можно работать и без них, но при импорте Fbx через меню File Гудини переключается в тейк с анимацией, поэтому знать про них нужно.

Ошибки (6)

При добавлении нод с геометрией во вьюпорте ничего нет, виднен только пивот. Эта ошибка случается из-за проблемных драйверов Nvidia. Откатите драйвер или установите более новый.

Сначала убедитесь, что у вас не выставлен флаг Template на других нодах. Если все правильно, то можно просто закрыть вкладку вьюпорта, нажав на крестик на табе, и после этого плюсом добавить вьюпорт (Scene view) заново.

Поскольку это частая проблема, в SideFX Labs даже добавили пункт меню Help/Reset viewport.

Русские буквы в путях. Важно, чтобы в системе имя пользователя и названия системных папок типа «Мои документы» были латинскими буквами. Если винда установилась на русском, то поменять локаль можно, не переустанавливая систему, погуглите. Вообще в целом русских букв и специальных символов не должно быть в путях и названиях файлов, с которыми работает Гудини.

Иногда русские буквы появляются из-за работающего One drive.

Если при загрузке проекта возникает окно со множеством ошибок, не спешите паниковать.

Раздел Warning с записями типа «Skipping unrecognized parameter» чаще всего можно смело игнорировать. Гудини жалуется, что поменялись версии каких-то ассетов и на них изменились параметры.

Самая важная и критичная ошибка это The following node types are using incomplete asset definition. Она означает, что Гудини не нашел нужных для работы проекта ассетов и они будут заменены пустым сабнетом. Единственное исключение — если ассет был разлочен на момент записи, тогда его внутренности сохранятся в проекте. Если вы столкнулись с такой ошибкой, обязательно установите нужные ассеты в проект через меню Assets/Install asset library.

Такое встречается на встроенных видеокартах некоторых ноутбуков. Обновите драйвера.

Если перезагрузка системы, а также обновление драйверов видеокарты не помогают, можно попробовать удалить папку HoudiniXX.X в «Моих документах», предварительно забэкапив всё нужное оттуда — ассеты, шелфы, houdini.env и так далее. При следующем запуске Гудини создаст ее заново и пересчитает кэш.

Установка Гудини (9)

На фтп-сервере SideFx: ftp://ftp.sidefx.com/public/

Houdini.env — это файл, в котором задаются переменные окружения, необходимые для работы Гудини и плагинов (например движков рендера). Этот файл расположен в папке Documents/HoudiniXX.X

Правила:

  1. Если строка начинается со знака #, она считается комментарием и не учитывается.
  2. В левой части ставится название переменной (большими буквами), знак «равно» и значение. Например PATH=c:/ProgramData/Redshuft/bin
  3. Если в путях есть пробелы, путь необходимо полностью заключить в кавычки (по крайней мере, так написано в хелпе).
  4. Чтобы добавить новое значение к уже имеющемуся, необходимо добавить название этой переменной со знаком доллара — по сути это название раскроется до его предыдущего значения. Разные части отделяются друг от друга точкой с запятой. Пример: PATH = c:/ProgramData/Redshift/bin;$PATH — это значит, что мы берем новый путь и добавляем его к уже имеющимся путям в переменной PATH. Если где-то в конце вы добавите новый путь без упоминания $PATH, то предыдущие пути не будут найдены, так что будьте внимательны.
  5. Значок «&» означает «значение по умолчанию» для стандартных переменных Гудини. Этот символ необходимо добавлять ОДИН РАЗ на переменную. Обратите внимание, при автоматической установке плагины могут добавлять их без проверки, так что имеет смысл вручную удалить лишние, оставив только один знак «&» в самом конце. Важный момент! Перед знаком «&» не должно быть пробелов! HOUDINI_PATH = c:/ProgramData/Redshift/Plugins/Houdini/18.0.391;&

Пример:

PATH = c:/ProgramData/Redshift/bin;$PATH
HOUDINI_PATH = c:/ProgramData/Redshift/Plugins/Houdini/18.0.391;


HOUDINI_NVIDIA_OPTIX_DSO_PATH = C:/Users/Stas/Documents/houdini18.0\optix

## QUIXEL ##
HOUDINI_PATH = "$HOUDINI_PATH;C:\Users\Stas\Documents\Megascans Library\support\plugins\houdini\3.4.0\MSLiveLink;&"

В разных лицензиях проект и ассеты имеют разные расширения файла.

Non-commercial (Apprentice, Education)hipnc и hdanc
Indiehiplc и hdalc
FXhip и hda

В некоммерческой версии можно открывать только NC-проекты и ассеты. В Indie можно открывать проекты LC и NC (Гудини перекинется в NC-режим). В FX можно открывать все файлы, при открытии LC или NC Гудини перекинется в соответствующий режим.

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

Вы запустили лицензию Гудини Core, в ней нет шелфов и Dop-нод для симуляций. Запустите другую лицензию.

Это версия языка Python. Если вы не знаете точно, зачем вам это нужно, то качайте версию без этой приписки. С новой версией языка могут сломаться многие сторонние скрипты на Python.

Можно установить одновременно обе версии, если поменять путь установки. Главное не запутаться потом.

Это билд Гудини, который не прошел полноценное тестирование, но в котором уже исправлены многие баги. После тестирования он превращается в Production build. Если какой-то баг не дает работать, можно скачать Daily build, но пользоваться им на свой страх и риск. По опыту особых проблем с ними не было.

Посмотреть список исправлений к каждому билду можно здесь: https://www.sidefx.com/changelog/

Частицы (5)

Во-первых можно в Advect type записать не Velocity, а Force, но это изменит вид симуляции.

Во-вторых, на вашем Smoke object в DOP, где изначально создается симуляция, во вкладке Initial Data можно переключать Border Type на Repeat. В таком случае на границе будет сэмплиться предыдущая скорость.

Если у вас частиц очень много, то в настройках вьюпорта (D над вьюпортом), во вкладке Geometry можно переключить «Display particles as…» на «Pixels». Это немного облегчит перерисовку и работать станет чуть проще.

Эта проблема часто возникает, когда частицы создаются на импортированных моделях. Дело в том, что при создании частиц на геометрии, с нее импортируются атрибуты, в том числе shop_materialpath, отвечающий за материал. А при наличии на точках атрибута shop_materialpath, Гудини считает, что их нужно рендерить как спрайты. Но самих спрайтов нет, поэтому и появляются черные квадраты.

Помимо атрибута shop_materialpath за наличие спрайтов также отвечают атрибуты spriteuv, spritescale, spriteshop, которые создаются нодой POP sprite. При наличии хотя бы одного из них будут также отображаться спрайты.

Можно удалить атрибуты спрайтов нодой Attribute delete или же просто выключить их отображение во вьюпорте. Настройки (клавиша D над вьюпортом), вкладка Geometry, галка Display Sprites.

Force — это вектор, часть которого прибавляется к скорости частицы каждый шаг симуляции. Таким образом, если Force неизменен, то скорость будет увеличиваться бесконечно. Единица измерения времени — секунда, поэтому каждый шаг симуляции используется часть вектора Force, равная 1/(FPS*Substeps).

Wind — это вектор скорости, к значению которого стремится каждая частица, некий предел. Этот атрибут называется targetv. На то, как быстро частица достигнет этой скорости, влияет Air resistance (атрибут airresist). Например, когда вы добавляете ноду Pop Drag, она добавляет нулевой атрибут targetv, то есть каждая частица будет замедлять движение.

Максимально подробно про управление системой частиц я рассказываю в курсе «Частицы в Гудини».

Это скрытая переменная, которая появляется, когда на точках есть атрибуты @life и @age. В этом случае @nage становится равен @age/@life, то есть это нормализованное значение жизни частицы, от нуля (рождение) до единицы (смерть). Это очень удобно, потому что @nage можно напрямую втыкать в рампы, меняя разные значения (альфу, цвет, размер и т.п.) в зависимости от возраста частицы.

Кстати говоря, @nage может существовать и без Pop network, достаточно создать атрибуты @life и @age, и можно к нему обращаться.

Шейдинг (3)

Существуют разные скрипты, мне кажется, что мой наиболее удобный из всех.

Меню Edit — Preferences — Rendering. Поставить галку только на Redshift, снять галку с параметра Make all render nodes avvailable in tool palette and tab menu. Перезагрузить Гудини. Теперь в контексте Mat останутся только ноды Редшифта.

Shop — это старый контекст для создания шейдеров. В нем один шейдер отвечает за один объект. Смешивать материалы можно, но сложно.

Mat — новый контекст для работы с шейдерами. В нем можно назначать практически любую ноду в качестве материала. То есть одним нетворком можно зашейдить сразу много объектов, при этом разные шейдеры могут друг на друга влиять, их можно смешивать и так далее.

Проще говоря, работайте с Mat, не ошибетесь.

Единственное, если вы делаете шейдеры под Redshift, то в Shop будет работать немного удобнее, потому что в списке остаются только RS-совместимые ноды.