[00:00:00.000 --> 00:00:09.680] Итак, в предыдущем разделе мы познакомились с тем, что такое персонаж, что такое камера, [00:00:09.680 --> 00:00:15.440] что такое компонент, как это сделано в Unreal Engine, как обработать вот этот игрока и как [00:00:15.440 --> 00:00:20.160] заставлять персонаж двигаться. Настало время разобраться с такой вещью, как анимация, [00:00:20.160 --> 00:00:28.700] как скелет персонажа, как скелетная мешка и прочие моменты. Что такое анимация? В общем, [00:00:28.700 --> 00:00:35.120] Википедия нам говорит, что анимация или мультипликация - это процесс создания иллюзии движения [00:00:35.120 --> 00:00:39.680] за счет проигрывательной последовательности изображений с некоторой большой частотой кадров. [00:00:39.680 --> 00:00:44.800] В классической анимации это 12, в компьютерной анимации это 30, ну а в компьютерных играх то, [00:00:44.800 --> 00:00:50.960] чем в общем-то ограничены ресурсы вашей игры. Это может быть 30, 60, даже 120 в современных [00:00:50.960 --> 00:00:56.720] проектах. Давайте разберем, какие виды анимации существуют. Начнем с самой простой, [00:00:56.720 --> 00:01:02.480] которая в общем-то пришла к нам из мультипликации и которая до сих пор используется как [00:01:02.480 --> 00:01:09.240] минимум в 2D играх, а иногда и для 3D - это спрайтовая анимация. Это не что, а набор некоторых [00:01:09.240 --> 00:01:14.320] картинок спрайтов, иногда называется "целая анимация" от основания вот те прозрачные пленки, [00:01:14.320 --> 00:01:19.720] на которых распечатали изображение в классической анимации. Это последовательность этих изображений, [00:01:19.720 --> 00:01:24.720] спрайтов, которые в общем-то меняются с течением времени и как раз создают в эту иллюзию движения. [00:01:24.720 --> 00:01:30.160] В общем, несмотря на то, что это было достаточно хорошо для двухмерных игр и псевдо-трехмерных [00:01:30.160 --> 00:01:35.440] игр, например тот же Doom или Duke Nukem, с появлением трехмерных технологий возникла необходимость [00:01:35.440 --> 00:01:39.960] анимировать именно трехмерные объекты движения. Одной из самых простых вариантов - это была [00:01:39.960 --> 00:01:44.920] иерархическая анимация. В этом случае анимируемая модель представляет собой некоторую иерархию [00:01:44.920 --> 00:01:51.360] твердых объектов, которые двигаются в течение времени. Причем, если двигаются некоторые элементы [00:01:51.360 --> 00:01:57.160] иерархии вверху, то в общем элементы внизу также испытывают движение. В общем и целом мы это [00:01:57.160 --> 00:02:03.040] уже реализовывали. Если мы вспомним наш ветрогенератор из первых уроков, то это оно и есть. У нас [00:02:03.040 --> 00:02:09.520] есть иерархия основания, столб, сам генератор, пропеллер, лопасти, которые движутся с течением [00:02:09.520 --> 00:02:14.080] времени. Единственное отличие, что мы это делали процедурно, а не брали какой-нибудь определенный [00:02:14.080 --> 00:02:21.200] файл, где сохранены какие-то настройки, как они должны перемещаться. Данный метод очень [00:02:21.200 --> 00:02:27.240] хорош для роботов. Машин до сих пор подходит для анимации каких-нибудь объектов на карте в [00:02:27.240 --> 00:02:34.840] общем и целом. Но для таких сущностей, как персонажи, как человек, где поверхность объекта такая, [00:02:34.840 --> 00:02:39.520] как кожа или ткань, может деформироваться, это не подойдет. Просто потому, что если вы жестко [00:02:39.520 --> 00:02:45.400] измените позицию той же руки без каких-либо дополнительных действий, у вас геометрия будет [00:02:45.400 --> 00:02:52.680] разорвана и просто появятся некоторые трещины или складки ненужные. Это нехорошо. Нужно как-то [00:02:52.680 --> 00:02:58.360] научиться анимировать деформируемую геометрию. В общем, следующий вариант, который напрашивается, [00:02:58.360 --> 00:03:06.520] это прямая вершина анимации. Такой достаточный подход в лоб, когда у вас задается позиция вершин, [00:03:06.520 --> 00:03:11.800] просто меняется координат для каждой вершины. В принципе, это можно делать даже для статической [00:03:11.800 --> 00:03:18.440] геометрии Unreal, которая есть. В чистом виде это вещь достаточно накладная. То есть, если [00:03:18.440 --> 00:03:23.080] мы просто будем, аниматор будет записывать некоторые данные для каждой вершины, потом передаст [00:03:23.080 --> 00:03:28.880] определенный трек, то весит это будет очень-очень-очень много. Тем не менее, это активно применяется. [00:03:28.880 --> 00:03:36.520] Это активно применяется для симуляции таких вещей, как трава, эффекты ветра, вода, волны и [00:03:36.520 --> 00:03:42.040] прочих моментов. Правда, опять же, здесь идет больше смещение в сторону GPU. Ну и для оффлайновой [00:03:42.040 --> 00:03:46.360] симуляции. То есть, если вы захотите записать какой-нибудь крутой синематик с наводнением или [00:03:46.360 --> 00:03:52.160] делайте какой-нибудь кинематографический эффект, где движется большое количество, например, масс воды, [00:03:52.160 --> 00:03:57.720] где вам нужна достоверная физическая симуляция или еще что-то. Самый простой вариант, чтобы записать [00:03:57.720 --> 00:04:03.760] все это дело, записать именно координаты вершин в каждый момент времени и уже после этого проиграть [00:04:03.760 --> 00:04:12.000] готовый ролик. Ну, как из разновидностей этой анимации можно упомянуть Morph-анимацию, которая, в общем, [00:04:12.000 --> 00:04:19.720] активно используется в геймдеве. В первую очередь, для анимации лиц и также может быть использована для листвой [00:04:19.720 --> 00:04:26.640] и растительности. В чем суть? Дело в том, что вместо того, чтобы сохранять весь массив перемещения [00:04:26.640 --> 00:04:33.520] вершин, все их данные, у вас сохраняются некоторые крайние позы. И потом итоговая картинка, в общем, [00:04:33.520 --> 00:04:38.160] итоговая анимация происходит путем интерполяции между этими позициями. Вот, например, мы видим на [00:04:38.160 --> 00:04:44.240] рисунке лицо девушки, то есть где-то она вот ровная для выражения лица, где-то у нее губки бантиком, [00:04:44.240 --> 00:04:50.040] где-то она улыбается, где-то она грустит. И, в общем, все промежуточные позы на ее лице, они высчитываются [00:04:50.040 --> 00:04:57.080] в зависимости от некоторых весов, которые есть между данными картинками. Ну и, наконец, нужно [00:04:57.080 --> 00:05:03.480] поговорить о скелете анимации. То, что активно применяется персонажи, то, что позволяет вам использовать [00:05:03.480 --> 00:05:12.280] преимущественно иерархическую анимацию, риджет анимации и преимущество вершины анимации без [00:05:12.280 --> 00:05:18.800] их недостатков. Впервые она была применена на Super Mario 64 и на данный момент это стандарт для [00:05:18.800 --> 00:05:24.040] анимации персонажей в компьютерных играх. В принципе, если вы увидите кого-то персонажа, то есть [00:05:24.040 --> 00:05:30.080] вероятность 99-90%, что он сделан именно с помощью скелета анимации. Вот, иногда люди даже [00:05:30.080 --> 00:05:35.840] предпочитают некоторые механические объекты машины, некоторые hard surface объекты машины, [00:05:35.840 --> 00:05:41.280] также используют для них скелет анимацию. Почему? Ну, просто есть большой инструментарий для работы [00:05:41.280 --> 00:05:46.680] с ней. Художникам проще создать некоторую выразительность аниматором, чтобы, например, [00:05:46.680 --> 00:05:53.280] перемещение робота чувствовалось. Ну и программистам с ней достаточно просто работать. В основе [00:05:53.280 --> 00:05:58.020] скелетной анимации лежит такая вещь, как собственно сам скелет, который также иногда именуют [00:05:58.020 --> 00:06:03.840] Ригом. Что это такое? Скелет - это иерархическая структура точек в пространстве, которые называются [00:06:03.840 --> 00:06:10.960] членами или иногда джойнтами. Что значит иерархическое? Это значит, что есть некоторая точка-родитель, [00:06:10.960 --> 00:06:16.120] у которых есть дочерние точки, позиция которых зависит от позиции точки родителя. То есть, [00:06:16.120 --> 00:06:23.760] если мы поворачиваем данный джойнт, данное сочленение, то и позиция сочленения дочерним будет [00:06:23.760 --> 00:06:28.960] также изменена. В общем, что-то подобное мы опять же видели на нашем примере с пропеллером. И да, [00:06:28.960 --> 00:06:34.360] это действительно то, что было подзаимствовано из rigid hierarchical animation, из иерархической [00:06:34.360 --> 00:06:40.760] анимации твердых тел, и поэтому иногда также скелет называют Ригом. Иногда эти джойнты называют [00:06:40.760 --> 00:06:45.560] костями. В принципе, мы в дальнейшем будем придерживаться этой терминологии, потому что достаточно [00:06:45.560 --> 00:06:50.400] удобно. С другой стороны, стоит понимать, что это некоторое допущение, даже некоторая оговорка, [00:06:50.400 --> 00:06:56.200] потому что по сути своей кости есть не что иное, как пустое пространство между соседними точками, [00:06:56.200 --> 00:07:02.000] и некоторого представления как данные они в общем не имеют. Поэтому в общем мы будем придерживаться [00:07:02.000 --> 00:07:08.560] того, что позволим себе такую вольность, что джойнты будем называть костями. Следующий важный [00:07:08.560 --> 00:07:14.320] элемент, собственно, это сама геометрия, сам скин, она же skinned mesh, она же skeletal mesh. Что [00:07:14.320 --> 00:07:19.400] такое? Так же как и статическая геометрия, это набор вершин, треугольников, связанных с ним [00:07:19.400 --> 00:07:24.760] материалом. Только в отличие от статической геометрии, каждая точка привязана к одному или [00:07:24.760 --> 00:07:30.440] нескольким джойнтам, костям. Что это значит? Это значит, что если меняется позиция какой-то кости, [00:07:30.440 --> 00:07:36.240] к которой привязана определенная точка, то и позиция самой этой точки тоже будет меняться. Позиция и, [00:07:36.240 --> 00:07:41.200] в общем-то, ориентация, вращение и прочие параметры. Иногда даже, в общем-то, происходит [00:07:41.200 --> 00:07:48.280] деформация, происходит масштабирование и точки меняют в зависимости от масштаба. Как я уже говорил, [00:07:48.280 --> 00:07:54.200] что вершины могут привязаны к одному джойнту, равно как и к нескольким. Причем, если у вас идет [00:07:54.200 --> 00:08:03.320] привязка к нескольким вершинам, в частности, например, данная вершина привязана к плечевой кости и к [00:08:03.320 --> 00:08:09.440] локтевой, то это значит, что они привязаны с некоторым весом. То есть позиция данной вершины x [00:08:09.440 --> 00:08:15.800] некоторой будет рассчитываться как сумма позиций, домноженной на весовые коэффициенты, где сумма [00:08:15.800 --> 00:08:21.560] всех весовых коэффициентов будет равна единице. Во всех редакторах можно посмотреть, как [00:08:21.560 --> 00:08:27.560] распределяется вес. Вот, например, мы видим диаграмму распределения вершин относительно костей [00:08:27.560 --> 00:08:33.600] спайн 2. Красный - это значит, что здесь вес данной кости единица, и синий - это что вес данной кости [00:08:33.600 --> 00:08:43.800] стремится к нулю. Процесс. Во-первых, процесс привязки этих вершин во время создания контента [00:08:43.800 --> 00:08:52.600] называют скинингом. И также процесс, в общем, просчета этих позиций во время исполнения игры [00:08:52.600 --> 00:08:58.240] тоже называют скинингом. И происходит такая путаница. Когда по этому говорят, что как происходит [00:08:58.240 --> 00:09:02.680] скининг, говорят, что может происходить на GPU. Как правило, в принципе, так оно и делается. [00:09:02.680 --> 00:09:10.480] Следующим важным элементом является поза. Поза - это не что иное, как конфигурация расположения и [00:09:10.480 --> 00:09:14.840] ориентации костей. В общем, поза могут быть рассчитаны равно как в глобальном пространстве [00:09:14.840 --> 00:09:22.360] относительно самого скелета, равно как и в локальном пространстве относительно родительской кости. [00:09:22.360 --> 00:09:29.200] Ну и последним важным элементом скелетной анимации, да в общем и не только скелетной анимации, [00:09:29.200 --> 00:09:35.320] в любой анимации является клип. Что такое клип? Это набор поз, которые проигрываются с определенной [00:09:35.320 --> 00:09:40.760] частотой кадров. При этом, как правило, задаются некоторые ключевые позы, так называемые keyframes, [00:09:40.760 --> 00:09:45.440] а остальные вычисляются путем линейной интерполяции между ними. В общем, это справедливо [00:09:45.440 --> 00:09:49.240] равно как для спрайтов анимации, равно как для морф анимации, о которой мы говорили, [00:09:49.240 --> 00:09:52.360] равно как и для rigidbody и прочих разновидностей. [00:09:52.360 --> 00:09:54.360] *Субтитры делал DimaTorzok*