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)%6
floor($FF/N)%M
%
- это оператор fmodПодобный вариант подходит для случая, когда надо циклично переключать входы switch ноды раз в N кадров. в таком случае в более полезной форме это можно записать так:
floor($FF/11)%opninputs(".")
здесь
opninputs(".")
вернёт число воткнутых нод в текущий свич -
Активация на 1 кадр каждые N кадров
floor($FF)%11==1
floor($FF)%N==1
%
- это оператор fmod
floor(X)
- см выше.1
в==1
может быть заменено на любое число от0
доN-1
включительно. для примера взята именно 1 только потому, чтобы это выражение возвращало 1 в первом кадре.В итоге выражение будет равно 1 в кадрах 1 12 23 34 итд
-
Активация на M кадров каждые N кадров
floor($FF)%11<6
floor($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 теперь будет иметь приоритет,
и оверрайд не сработает.
примечание про кавычки:
кавычки ""
в значении будут интерпретированы, но интерпретируются они совсем не как может быть
привычно тем, кто работает с шеллом. Судя по ряду экспериментов - кавычки в начале и конце
значения просто удаляются будто их и не было, еще перед анализом значения на пробелы в начале
и конце. кавычки же внутри текста, даже окруженные пробелами - считаются обычными
символами, и никакой обработки над ними не происходит
Инстансы, Пакеды, Пакед диск, Делейед Лоад Процедурал
сюда следует добавить примеров