March 1, 2019

Houdini — coral grow

Итак, Аман ниже выложил типс с Grow в c4d, а это значит настало время полностью раскрыть этот эффект в Houdini.

  1. Создаем тестовую геометрию которую будем кораллить

2. Нули и структуризация это важно! Сделаем Null (да польется вода в текст)

3. А теперь начало эффекта — нода vdbfrompolygons, отвечает за то, что мы превратим наш меш в воксели. Ужас, не правда ли ?

4. Сейчас нам надо найти значение размера вокселя, чтобы мы примерно приблизились к визуалу нашего оригинального меша. У меня оно равно - 0.005 (очень важно при поиске значений начинать с половинных значений, например 1 — > 0.5 → 0.25 и т.д.). Уверен, ваши машины мощные и красивые но Houdini периодически может включить 3D max и резко крашнуться из-за нехватки памяти.

Добавим ноду vdbsmooth чтобы сгладить наши воксели

5. Итак значение найдено. А сейчас начнется один из двух важных аспектов эффекта Grow. Нам нужно создать кастомное велосити поле (Velocity Fields). Это векторное значение которое будет давать рост нашего корала в заданом нами пространстве и это пространство будет Box, создадим его.

Очень важно, чтобы наш объект который мы будет коралить находился внутри этого баунд бокса и также имел такую широту и высоту на которые эффект будет распространяться (иначе он упрется в стенку и дальше нее не выйдет).

6. Создаем ноду VDB необходимую чтобы дать название нашему полю и задать ему его воксель сайз. В графе Name указываем название vel (универсальное обозначение velocity в Houdini). В графе Type указываем что это поле векторное (Vector float).

7. Смешаем наш баунд бокс (box который создали ранее) и наше поле vel . Обязательно нажимаем на вкладку Reference, чтобы указать этой ноде что наше поле будет создавать в приходящим во второй вход баунд боксе.

8. Volume vop — создадим его, внутри него мы и будем модифицировать наш кастомный велосити филд накладывая различные нойзы, меняя исходные значение направлений и т.д.

9. Внутри создаем Curl noise. Соединяем наши глобальные переменные с нойзом (P → pos)

Особого смысла модифицировать сейчас нойз нет, поэтому идем дальше (просто пока поставьте тип нойза на Perlin Noise).

Для нашего удобства нам необходимо вывести все параметры на уровень выше на ноду volume vop, чтобы не заходя сюда настраивать рисунок нойза. Нажимаем средней кнопкой на кругляш входа и выбираем promote parametr.

Выносим 4 параметра — freq / offset / amp / rough

10. Теперь наш нойз нужно назначить на наше кастомное поле велосити. Как видите наши вайры зеленые, это значит что выводимый тип данных сейчас векторный. Создаем ноду Bind export которая выводит наши данные из нойза в атрибут vel который мы создали выше. Вписываем куда идут данные из нойза (Name — vel ) и в Type выбираем что это векторное (vector) значение.

11. Го на уровень выше. Как же теперь нам мониторить наше кастомное поле ? Для этого нам нужны две ноды — volumeslice и volumetrail. Первая берет наш слайс из баунд бокса (что то наподобии среза в пространства) а вторая показывает наши информацию как направлящие согласно значения атрибута vel.

volumeslice

volumetrail

12. Итак мы сделали кастомное велосити филд, половина работы сделана. Дальше.

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

На первый вход подаем наш vdb обьект, на второй вход подаем наше кастомное поле.

13. Внутри создаем две ноды vdbanalysis. В первой создаем gradient и называем его grad

во втором создаем Curvature и называем его curv

14. Мерджим нодой merge и незабываем подключить второй vdbanalysis к ноде Prev_Frame

15. Создаем еще один volumevop внутри которого мы будем создавать параметры адвекции которые будут вычислять в нашем солвере.

Сразу подаем ноду Input _2 во второй вход.

16. Внутри вопа создаем две Bind ноды.

Из первой мы выводим grad созданный ранее (ставим векторное значение)

Из второй мы выводим также созданный ранее curv (ставим флотовое значение)

17. Создаем обычный aanoise

18. Создаем volumesamplefile чтобы брать информацию (в данном случае vel) из второго входа. Меняем на Primitive Name / input — File / Primitive Name — vel.

Нормализуем его (необходимо чтобы поджать все значения в диапазон от 0 до 1)

19. Возвращаемся к ноде bind где находиться grad — также нормализуем его

20. перескакиваем к ноде bind где находится curv подключаем его к ноде Fit где опытным путем я для себя определил следующие значения

21. Далее создаем ноду ramp которая позволит нам создавать рисунок воздействия ��а нужный нам параметр на уровне выше. Называем как нам удобно или как сделал я. В Ramp Type ставим Spline Ramp (float)

22. На всякий случай фитим наш нойз

23. перемножаем все наши значения в ноде multiply

24. И выводим все это в ноду Bind export в параметр grad и ставим тип float (по сути мы ввели его в наш воп, модифицировали и вернули обратно на уровень выше).

25. Возвращаемся ко второй ноде fit которая выходит из bind / curv и подключаем ее к рампе

26. Умножаем это все на входные данные со второго входа через ноду multiply

27. И плюсуем к данным которые идут в ноду bind export / grad

28. Возвращаемся на уровень выше и создаем ноду vdbadvect которая и будет выдавливать из нашего vdb коралы.

29. Ставим данные параметры внутри.

За скорость адвекции отвечает параметр timestep. Чем он выше тем быстрее будет происходить адвекция в пространстве

30. Теперь обернем наш vdb в полигоны и вуаля

31. Создаем ноду Rop_alembic_output и запекаем

32. Теперь помимо сферок можете постить различные кораллы.

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

Возвращаемся в наше кастомное велосити поле и заходим в volumevop

34. Из наших глобальных переменных нам нужно взять векторное значение (xyz) каждое вывести в флотовое значение в этом нам поможет нода vector to float, которая разобьет эти три значения на отдельные флотовые данные. X Y Z

35. Теперь создадим обратную ноду floattovector которые эти три значения снова соберет в вектор

36. И добавляем наше векторное значение к векторному значению нойза

37. Мы видим что наше поле поменялось. В данном случае мы получили прибавление от центра глобальных координат к велосити нойза.

38. Чтобы лучше это увидеть перед vectortofloat мы создадим ноду multiplyconstant которая просто прибавляет входящие значения. И тут мы четко видим рисунок будущей адвекции.

39. отключаем в связке у флотовых значений X и Z и видим что рисунок поменялся

40. Как видно наш меш поплыл вверх и вниз согласно кастомному велосити полю

41. Экспериментируйте и радуйте нас кораллами