О том как я делал шейдер птички :>

Всем привет!
Я в сети гуляю под ником glebster51 впервые надумал написать статью...
Решил рассказать вам о небольшой поделке своей, не судите строго :3

Все началось с того, что я увидел гифку в твиттере у одного разработчика (@OskSta), на которого я подписан, и подумал почему бы не попробовать повторить?!:D

чувак сумасшедшие вещи делает, от которых просто крышу срывает!

К примеру вот этих птиц.

Итак, ПОЕХАЛИ!

сперва я сделал простую модельку, отдаленно напоминающую птицу, чтобы было с чем работать! :D

делал ее в Unity с помощью встроенного плагина ProBuilder

Далее я создал новый Amplify шейдер, и начал думать…

птица должна махать крыльями, значит шейдер как то должен понимать где у нее крылья и тело…

следующим шагом я решил высчитать маску для эффекта смещения, чтобы отделить крылья от тела.

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

О том как я делал шейдер птички :>

вынес два параметра MaskX и SizeMask чтобы настроить маску под мою модель…для наглядности я вывел маску вместо текстуры. Белое — то что будет сильнее подвержено деформации, черное то что останется неподвижным.

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

О том как я делал шейдер птички :>

это основная мысль которая немного видоизменилась в последствии… но даже с такой простой формулой птица уже может делать вид, что машет крыльями!)

Но суть в том, что в реальности птицы машут крыльями немного сложнее…Чем то отдаленно напоминая плавание «брасом» но более плавающим и ускоренным.

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

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

О том как я делал шейдер птички :>

Учитывая все это можно получить вполне правдоподобные взмахи крылом.

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

О том как я делал шейдер птички :>

Следующей фазой я решил взяться за подъем и парение птицы. При наклоне вверх, птица должна сильнее махать крылышками и вообще не махать, когда она снижается…

с помощью вычисления DotProduct (Скалярное произведение) между двумя векторами, взглядом птицы и мировой вертикальной оси, я могу узнать насколько сильно накренилась птица.

Это буквально угол в значениях от -1 до 1, где минус единица, это разворот на 180, смотрит вниз, а единица, это направление точно вверх.

О том как я делал шейдер птички :>

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

Используя все то же скалярное произведение я получаю область градусов, в которых птица «падает» и в этом состоянии я бы хотел придать ей особую обтекаемую форму, поджать крылья ближе к телу, к примеру…

О том как я делал шейдер птички :>

полученный вектор и предыдущее значение смещения при наклоне я линейно интерполирую между собой в зависимости от наклона.И вот, птица умеет поджимать крылышки :3

в самом конце всю полученную информацию я смешиваю и получаю финальный сдвиг вертекса…

О том как я делал шейдер птички :>

весь шейдер в итоге выглядит так:

О том как я делал шейдер птички :>

затем я немного доработал модельку птицы)

О том как я делал шейдер птички :>

В итоге у меня получились вот такие вот птички :D

16к птиц в кадре без просадок :3

Конечно же, у @OskSta реализация явно гораздо хитрее и лаконичнее, но суть всегда в том, что подобные вещи всегда состоят из кучи маленьких деталей, простых по отдельности, и их не сложно повторить.Надеюсь кому нибудь моя писанина окажется интересной, и в следующий раз я возможно заставлю этих птиц не только махать крыльями, но и летать! :D

Всем кто дочитал до конца, спасибо за внимание, отпишитесь о своих впечатлениях, мне будет интересно узнать, как вам моя первая статья? :D

Также можете посетить мой паблик, где я публикую подобные интересные штуки)

602602
76 комментариев

Круто! Жму твою руку чувак!

59
Ответить

*крыло

36
Ответить

Спасибо :3

15
Ответить

Покажи справку перед тем как жать руку. 

10
Ответить

1 птица не машет крыльями брасом, это повеселело, и нарисованный от руки голубь плохой пример, посмотри замедленную съёмку реальных птиц в частности как они загребают воздух. 

Нужно по оси крыльев в длину (она у тебя жёлтенькая кружок) скручивать крылья в одну сторону при подъёме и скручивать в другую при спуске. Тогда у тебя получится что плоскость крыльев "гонят волну".

2 "весь шейдер в итоге выглядит так" весь шейдер должен выглядеть как кусок кода если уж ты решил поделится.

С этими шейдерами ситуация на DTF как будто статьи пишутся не для того что бы чему то научить, а просто повыёбываться.

Спасибо.

23
Ответить

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

25
Ответить

Комментарий недоступен

12
Ответить