FAQ
- Как оправить отчет об ошибке в Houdini
- Полезные экспрешны
- FLIP: потеря объёма
- Группы, Как написать группу, чтобы то и сё
- О конвертации hipnc в hip
- Как работает houdini.env
- Инстансы, Пакеды, Пакед диск, Делейед Лоад Процедурал
Как оправить отчет об ошибке в Houdini
Cбор подробной информации о проблеме
Предоставление подробной информации об ошибке помогает разработчикам Houdini быстрее и точнее ее диагностировать и исправить. Чем больше информации вы дадите, тем быстрее будет найдено решение.
Информация, необходимая для отчета об ошибке:
- Описание ошибки: Что именно произошло? Как воспроизвести ошибку?
- Шаги для воспроизведения: Опишите, как шаг за шагом воспроизвести ошибку. Не используйте Production сцену, если можете воспроизвести ошибку на одном Кубике - это наилучший вариант.
- Версия Houdini: Какую версию Houdini вы используете?
- Операционная система: На какой операционной системе вы работаете?
- Тип аппаратного обеспечения: Какое оборудование вы используете?
- Информация из окна about:

- Логи Houdini:
- stdout/err: Запустите Houdini из консоли, чтобы сохранить stdout/err в файл.
- HOUDINI_DSO_ERROR: Установите переменную среды HOUDINI_DSO_ERROR=1, чтобы сохранить подробную информацию об ошибках DSO в файл dso_error.log.
- HOUDINI_ERRORLOG_FILENAME: Установите переменную среды
HOUDINI_ERRORLOG_FILENAME, чтобы указать имя файла для сохранения журнала ошибок Houdini.
- Скриншоты и видео: Если возможно, предоставьте скриншоты или видео, демонстрирующие ошибку.
Как запустить Houdini из консоли:
- Linux: Откройте терминал и перейдите в каталог с установленным Houdini. Затем введите команду
./houdini - Windows: Откройте командную строку и перейдите в каталог с установленным Houdini. Затем введите команду
houdini.exe. Имейте ввиду что в Windows командная строка не выводит информацию о работе программы в консоль (stdout). Вместо этого информация выводится в отдельное окно консоли Hоudini. - Mac: Откройте Терминал и перейдите в каталог с установленным Houdini. Затем введите команду
/Applications/Houdini.app/Contents/bin/houdini
В этом случае Houdini будет выводить всю информацию о работе программы в консоль (stdout).
Использование HOUDINI_DSO_ERROR:
Установите переменную среды HOUDINI_DSO_ERROR=1 перед запуском Houdini. Это приведет к сохранению подробной информации об ошибках DSO в файл dso_error.log.
Использование HOUDINI_ERRORLOG_FILENAME:
Установите переменную среды HOUDINI_ERRORLOG_FILENAME=<имя_файла> перед запуском Houdini. Это приведет к сохранению журнала ошибок Houdini в файл с указанным именем.имя_файла>
Задать все переменные среды можно перед запуском Houdini в непсредственно в терминале выполнив последовательно команды:
Linux / MacOS:
- Откройте терминал.
- Перейдите в каталог с установленным Houdini.
- Установите переменную среды. Например, чтобы установить
HOUDINI_DSO_ERROR=1, введите:
export HOUDINI_DSO_ERROR=1
export HOUDINI_ERRORLOG_FILENAME="~/houdini_error.log"
- Запустите Houdini:
# Linux
./houdini
#MacOS
/Applications/Houdini/HoudiniXX.XX/Houdini FX XX.XX.app/Contents/MacOS/houdini
Windows:
- Откройте командную строку.
- Перейдите в каталог с установленным Houdini.
- Установите переменную среды. Например, чтобы установить
HOUDINI_DSO_ERROR=1, введите:
set HOUDINI_DSO_ERROR=1
set HOUDINI_ERRORLOG_FILENAME="C:/houdini_error.log"
- Запустите Houdini:
houdini.exe
Примечания:
- Переменные среды необходимо устанавливать перед запуском Houdini.
- Имена переменных среды чувствительны к регистру.
- Переменные среды существуют в пределах одной сеcсии, после закрытия терминала они будут очищены и вам нужно будет повторно их задать при следующем запуске терминала.
- Отчет об ошибке можно отправить с использованием Apprentice лицензии.
Предоставление информации:
После сбора информации об ошибке вы можете предоставить ее разработчикам Houdini на форуме поддержки или через систему отслеживания ошибок.
- Форма отправки отчета - вы должны зайти в свою учетную запись для ее отправки (Можно использовать Apprentice лицензию).
Помните: Чем больше информации вы дадите, тем быстрее будет найдено решение.
Полезные экспрешны
-
Переключение свича каждые N кадров
На практике часто встречается задача, в которой нужно заставить свич переключаться раз в несколько кадров. в дальнейшем в качестве значения N мы возьмём число 11, чтобы не смущать людей, слепо переписывающих экспрешн с N, и не понимающих, почему ничего не работает
floor($FF/11)floor($FF/N)floor(X)возвращает наибольшее целое число, меньшее чем Х. для положительных Х это эквивалентно отбрасыванию дробной части:2.345->2, но для отрицательных чисел это не просто отбрасывание дробной части:-2.345->-3, т.к.-3- это наибольшее целое число, меньшее-2.345выражение выше будет переключаться каждые 11 кадров: с 0 по 10 - 0, с 11 по 21 - 1, с 22 по 32 - 2 итп
если нам надо зациклить это, например, чтобы результат выражения поднимался от 0 до 5, и затем опять начинался с нуля:
floor($FF/11)%6floor($FF/N)%M%- это оператор fmodПодобный вариант подходит для случая, когда надо циклично переключать входы switch ноды раз в N кадров. в таком случае в более полезной форме это можно записать так:
floor($FF/11)%opninputs(".")здесь
opninputs(".")вернёт число воткнутых нод в текущий свич -
Активация на 1 кадр каждые N кадров
floor($FF)%11==1floor($FF)%N==1%- это оператор fmod
floor(X)- см выше.1в==1может быть заменено на любое число от0доN-1включительно. для примера взята именно 1 только потому, чтобы это выражение возвращало 1 в первом кадре.В итоге выражение будет равно 1 в кадрах 1 12 23 34 итд
-
Активация на M кадров каждые N кадров
floor($FF)%11<6floor($FF)%N<Mданное выражение будет равно 1 первые 6 кадров из каждого блока по 17 кадров. например в кадрах 0 1 2 3 4 5 11 12 13 14 15 16 22 23 24 25 26 27
FLIP: потеря объёма
Эта статья не завершена, помогите расширить её
В симуляциях жидкости FLIP-ом в резервуарах, определяемых коллайдерами, например жижа в стакане, порой возникают ситуации потери объема жидкости по мере симуляции. Существует ряд типичных причин, которые стоит проверить в первую очередь
bandwidthвдб колайдера должен быть не менее хотя бы 3х флип вокселей, т.е.> 3*<particle separation>*<grid scale>- Если вы изменяли
Grid Scale- верните его в дефолтное значение и проверьте наличие потери объема. Чересчур маленькие или большие значения грид скейла могут заставить жижу вести себя странно. - Неправильно настроенный
reseedingможет вызывать как генерацию лишнего объема, так и его уменьшение в местах сильных всплесков, где возникают тонкие поверхности воды Apply particle separationна флип солвере частично решает проблему потери объема, но сильно замедляет сим, её использования не рекоммендуется как фикс данной проблемы.- Если коллайдер контейнера двигается - очень важно иметь правильные скорости.
- Флип сам считает скорости коллайдеров по геометрии, поэтому рекоммендуется в качестве коллайдеров использовать геометрию с указанием прокси вдб сдф для рассчета давления солвером.
- Убедитесь, что входной коллайдер интерполируется правильно между фреймами, в случае использования сабстепов во флип солвере. Так же убедитесь, что прокси вдб или правильно закешен в нужные сабстепы, или пересчитывается из интерполированной геометрии.
- Не используйте в качестве коллайдера геометрию с изменяющейся топологией, так как она и не интерполируется, и по ней флип не сможет вычислять скорость коллайдера
- В случае двигающегося коллайдера необходимо поменять дефолтный
collision velocity scaleиз1.5в1.0
Пример случая потери объема, связанного с не корректной настройкой grid scale описан в cgwiki
Так же стоит заметить, что мануал по флипу имеет ряд рекоммендаций и указаний, как сделать сим более стабильным и хорошим.
Группы, Как написать группу, чтобы то и сё
Всё и подробно описано в мануале, ничего не упущено, и нечего добавить. Здесь лишь приведены несколько примеров.
Например, группа, выделающая по маске строкового атрибута path:
@path==/smth/foo/*/hand?/
Это выделит:
/smth/foo/bar/handL//smth/foo/alice/bob/handR/
но НЕ выделит:
/smth/hand1/smth/foo/handKZ/
Объединение условий:
@foo==1 @name==piece*
выделит примитивы, у который атрибут foo равен 1 ИЛИ у которых значение name имеет формат piece* (piece1 piece12 piecececece), т.е. это объединение двух групп
Если же нужно пересечение, т.е. выделить только примитивы, у которых оба условия верны одновременно:
* ^@foo!=1 ^!@name==piece*
логика: выделить все (*), кроме (^) тех, у которых foo НЕ равен 1, и кроме (^) тех,
для которых условие @name==piece* НЕ выполняется (!)
Обратите внимание, синтаксис вида
@foo=123напоминает VEX, но никакого отношения к VEX не имеет. Этот факт часто путает новичков.
Еще раз: всё это описано в мануале, здесь просто приведены примеры
О конвертации hipnc в hip
Введение
В общем и целом, hipnc и hiplc (а так же hdanc и hdalc) - особые “ограниченные” подформаты hip (и hda) файлов, в которые
сохраняются сцены гудини, работающего с некоммерческой и инди лицензией соответственно.
Данные форматы применяют ряд мер по усложнению прямой конвертации их в полноценные (hip и hda) форматы, однако
в самом гудини имеется достаточно инструментов, чтобы эти самые ограничения частично или даже полностью обходить, по этому изначальная задумка
авторов не совсем понятна.
Конвертация
Известно несколько методов
Полноценные методы:
Orbolt (hda)
Загрузка hdanc/hdalc на орболт автоматически конвертит ассеты в коммерческие
3rd party
Был найден тор-сайт, конвертящий любые некоммерческие хипфайлы или ассеты целиком и полноценно, без каких-либо ограничений: onion сайт
(доступ только через тор-броузер)
Частичные методы:
Гудини имеет функционал по генерации питон или хскрипт кода, воссоздающего заданный граф нод.
Сгенерированный код не имеет ограничений и может быть выполнен в гудини с коммерческой лицензией.
Самый простой способ использовать этот функционал - перетягивание нод на шелф:
- выделяете нужные ноды, перетягиваете их на пустое место на любом шелфе
- гудини сделает тулзу, создающую выбранные ноды
- в коммерческой версии тыкаете тулзу, она создает сохраненные ноды
этот способ ограниченный, например ассеты он никак не перегоняет, и в принципе гарантированно работать не будет.
Тот же самый трюк, но через hscript файл вместо шелфа:
- В не коммерческой сцене откройте Window/HScript Textport
opscript -G -r / > $TEMP/temp.cmd- Закройте гудини
- В новой коммерческой сессии откройте текстпорт
cmdread $TEMP/temp.cmd
В temp.cmd сохраняются хскрипт команды для создания нод сцены, затем эти команды выполняются в другой сессии гудини,
воссоздавая в итоге исходную сцену
Ограничения:
- Определения ассетов не передаются
- Содержимое залоченных нод не передаётся
Как работает houdini.env
Все строчки, начинающиеся с # являются комментариями и на работу файла не влияют. В остальном файл состоит из объявлений переменных в синтаксисе, схожем с set из csh, или объявлении переменных в bash.
Каждая строчка задает значение переменной, все строчки выполняются последовательно сверху вниз, так что заданные выше переменные уже могут быть использованы в последующих строках
синтаксис записи прост: Переменная=Значение
При этом между переменной и знаком =, знаком = и значением может быть сколько угодно пробелов
(в отличии от bash и csh), значение будет считаться начинающимся с первого непробельного символа
В самом же значении могут быть пробелы, и не обязательно их эскейпить или заключать в кавычки. т.е. потребность в кавычках в принципе отпадает, так как вся строка до конца воспринимается как значение.
Eсли в значении встречаются слова вида $SOMETHING - это команда интерпретатору подставить
на место $SOMETHING значение переменной SOMETHING или пустоту, если такая переменная
не задана. Это может быть или переменная заданная в одной из строк выше, или переменная
среды системы. Заметьте, что все замены происходят ДО присвоения, так что в значении
может встречаться и задаваемая переменная, которая будет замененая на текущее значение переменной.
т.е.
DOG =cat
DOG= $DOG is not a dog
в итоге значение DOG будет cat is not a dog
Чтобы отделить название заменяемой переменной от остальных слов - можно поместить
название переменной в фигурные скобки: ${VARNAME}
Таким образом значение ${DOG}GINS для примера выше превратится в cat is not a dogGINS
Совет - всегда использовать фигурные скобки на всякий случай, чтобы случайно не упустить
потенциальные проблемы типа $DOG_CAT - вы хотели подставить значение переменной DOG,
но _ считается текстовым символом, а значит интерпретатор видит это как замену
переменной DOG_CAT. если же всегда использовать скобки - ${DOG}_CAT - будет
интерпретировано именно так, как вы ожидали
символ & в специализированных переменных среды гудини будут заменены на дефолтное
значение этой конкретной переменной при запуске гудини.
обычно имеет смысл добавлять этот символ в конец переопределенных гудини переменных, задающих список каких-либо путей, чтобы не сломать дефолтный функционал гудини.
добавлять этот символ несколько раз не имеет смысла, классическая ошибка:
SOME_PATH1= c:\my\fancy\path1;&
SOME_PATH2= c:\my\fancy\path2;&
HOUDINI_PATH=$SOME_PATH1;$SOME_PATH2;&
тогда финальное значение HOUDINI_PATH будет c:\my\fancy\path1;&;c:\my\fancy\path2;&;&,
где каждый & будет заменен на набор стандартных путей.
Обычно проблем это может даже и не вызвать, но так как пути слева имеют приоритет
перед путями справа - если в c:\my\fancy\path2 есть что-то, что должно оверрайдить
какой-то стандартный файл, тот & перед c:\my\fancy\path2 теперь будет иметь приоритет,
и оверрайд не сработает.
примечание про кавычки:
кавычки "" в значении будут интерпретированы, но интерпретируются они совсем не как может быть
привычно тем, кто работает с шеллом. Судя по ряду экспериментов - кавычки в начале и конце
значения просто удаляются будто их и не было, еще перед анализом значения на пробелы в начале
и конце. кавычки же внутри текста, даже окруженные пробелами - считаются обычными
символами, и никакой обработки над ними не происходит
Инстансы, Пакеды, Пакед диск, Делейед Лоад Процедурал
сюда следует добавить примеров