Недавние вопросы

У полигонов есть лицевая и изнаночная сторона, по-английски 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;
}

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

 
Категория:SOP

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

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

// На первый вход врангла подается одна точка, на второй - кривая. 
// Параметром anim можно перемещать точку по этой кривой.
// Ноль означает номер примитива. Если примитивов больше одного, нужно будет подставить вместо него правильные номера.
@P = primuv(1, "P", 0, ch("anim"));
 
Категории:SOP, VEX
  1. Рампу необходимо менять на верхнем уровне, то есть на самом VOP, менять ее на ноде Ramp Parameter внутри ВОПа не получится, это всего лишь значения по умолчанию.
  2. Если у вас используется несколько рамп, ОБЯЗАТЕЛЬНО нужно изменить имена этих рамп на разные, иначе они будут ссылаться на один и тот же параметр. Иногда при смене имени результат появляется не сразу, рампы как бы залипают. В этом случае нужно или нажать кнопку Force compile или удалить и заново создать Ramp parameter.
 
Категория:SOP

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

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

 
Категория:SOP

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 (то есть хэндлов во вьюпорте) и подсчета трансформаций на входах-выходе.

 
Категория:SOP

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

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

 
Категория:SOP

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

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

 
Категория:SOP

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

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

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

 
Категория:SOP

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

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

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

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

 
Категория:SOP

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

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

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

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

 
Категория:SOP

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

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

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

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

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

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

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

 
Категория:SOP

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

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

 
Категория:SOP

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

 
Категория:SOP

Нода Group — Edges — Unshared edges.

 
Категория:SOP

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

 
Категория:SOP

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

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

 
Категория:SOP

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

 
Категория:SOP

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

 
Категория:SOP

Нода Facet — Unique points.

 
Категория:SOP

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

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

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

 
Категория:SOP