Растровые фрагменты и персонажи в анимации

Дмитрий Маштаков
   Чтобы было понятно, о чём идёт речь, посмотрите этот клип - http://yadi.sk/i/4niYXOpKHHLUXA
   В нём имеется модель - растровая анимация персонажа в движении. Этот персонаж, велосипедист, запечатлён на сером фоне. Персонаж анимирован - он крутит педали, повторяя несколько циклов своего движения. И в то же время он остаётся на месте, находясь как бы в рамках своего окна.

   Объявив серый фон прозрачным, модель можно скопировать на другое место, и тогда велосипедист будет виден там, а не только на своём сером фоне.
   Для того, чтобы провести копирование, нужно сделать два клика, обозначив поле источника по диагональным углам, и нажать кнопку Copy. Затем кликами указать точку источника и точку, в которую точка источника должна переместиться. После этого нажать Paste.

   И, наконец, после копирования, можно перейти в режим морфинга и прочертить траекторию движения персонажа. А затем, записав в текстовое поле над кнопкой Paste условия добавления фрагмента в кадры анимации, провести реконструкцию кадров, воспользовавшись опцией 2.
   Реконструкцией называется изменение кадров анимации, и чтобы её провести, нужно отметить начальный и конечный кадры реконструкции, так, как это показано на иллюстрации. В реконструкции обычно участвует буфер «д» и и его нужно активизировать – указать прямоугольную зону кликами по по диагональным углам, и кликнуть кнопку д. Кнопка окрасится в розовый цвет, а зона буфера будет показана на рисунке красной рамочкой.
   И хотя, конкретно, при создании движения по траектории, буфер д пока не используется, его активизировать нужно, отведя для него небольшую зону где-нибудь в сторонке.

   Обратимся теперь к тому, что написано в текстовом поле.
   Там написано  т20п1  и это значит –
т – в опции 2 выбран режим «траектория»
20 – фрагмент в ходе своего движения развернётся на 20 градусов
п – копирование фрагмента осуществляется на прозрачном фоне
1 – в развороте делается один цикл, то есть, развернувшись на 20 градусов
    к середине траектории, фрагмент станет разворачиваться обратно.

А если бы запись была такой – т20п1/-20 то фрагменту в начале его движения был бы придан угол разворота -20 градусов. Такое задание разворотов подошло бы для траектории «велосипедист едет с горочки, затем едет по горизонтальному участку, а потом опять едет с горочки».

Всё готово для реконструкции, и мы её осуществляем, кликнув кнопку R.

  Проведём другую траекторию и вновь нажмём кнопку R – и второй велосипедист поедет, но уже по другому пути.
  То, что мы во второй раз велосипедиста не копировали, значения н имеет, поскольку нужная информация о копировании (поле и первая точка вектора переноса) сохраняются до тех пор, пока мы их не изменим. Что касается второй точки вектора переноса, то она, как вы уже догадались, перемещается по траектории во время процедуры реконструкции.

   РАСТРОВЫЕ ФРАГМЕНТЫ И ПРОБЛЕМА ИХ ХРАНЕНИЯ

  Перейдём теперь к более важной части этого сообщения.
  Вы поняли, каким образом могут быть использованы растровые фрагменты. Понятно также, чем они отличаются от хромакея, футажа и от фрагментов перекладки.
  Хромакей и футаж внедряются в уже готовое видео, а растровые фрагменты используются значительно раньше, ещё на стадии создания покадровой анимации. С другой стороны, от классической покадровой перекладки работа с растровыми фрагментами отличается техникой. Техника движения фрагментов по траектории заимствована у векторной анимации.
  Непохожа работа с фрагментами и на работу с прозрачными слоями, хотя в Фотошопе, возможно, что-нибудь подобное и есть. Не знаю. В общем, всё зависит от среды программирования и от техники, которую эта среда дозволяет. В Визуал Бейсике, с которым я экспериментирую, прозрачные слои не предусмотрены. Разумеется, это недостаток. Но его можно обойти, используя средства копирования.

   Короче говоря, растровые фрагменты, это объекты, обусловленные техникой анимации. А с прицелом на то, чтобы их можно было бы использовать многократно, нужно подумать – как их удобнее хранить?
   Нужно, чтобы папки с фрагментами не путались с папками, хранящими части анимации, имеющими названия от 0 до9-ти.
   Нужно также, чтобы рисунки с фрагментами были бы компактными и рационально использовали бы отведённый для них размер файла. Приведу пример – файл с велосипедистом, хранящийся как кадр фрагмента и являясь рисунком формата bmp, имеет размер 237 кБ, тогда как этот же велосипедист, хранящийся, как обычный рисунок, займёт файл размером 2.22 мБ – разница почти в десять раз. Большие размеры рисунков мультипликации вовсе не помеха, если их не нужно куда-либо пересылать. Но файлы с фрагментами, разумеется, хочется сохранить вне своего компьютера, и тогда проблема размера файлов при их пересылке стоит остро.
   С велосипедистом можно было бы смириться, но как быть с анимациями жучков, паучков, бабочек, порхающих птичек, летящих листьев и прочей мелочью? Жалко ведь тратить на хранение такого нужного в работе добра отдельные большие файлы.
   В Фотошопе подобные изображения создаются и хранятся особым образом, надо бы и мне в своей программе использовать рациональный метод хранения фрагментов. Сказано – сделано.

   О том, что у меня получилось, рассказываю.
   Получилось два метода или две техники для создания фрагментов и работы с ними. Этим двум техникам соответствуют две структуры – одноместные фрагменты и многоместные фрагменты.
   Одноместный фрагмент занимает своими рисунками отдельную папку. Клип о создании одноместного фрагмента и о работе с ним можно посмотреть тут - http://youtu.be/WeDMRdE9c7U     Одноместный фрагмент полупрозрачен, плотность его задаётся цифрой на кнопке «Градация».
   Многоместный фрагмент, напротив того, использует широкие листы рисунков для того, чтобы хранить на них анимации и рисунки фрагментов на разных местах, но в общей папке. Многоместный фрагмент непрозрачен, хотя может быть скопирован и наложен с прозрачным фоном.
   О получившихся структурах расскажу отдельно. Но сперва разберёмся с тем, что представляет собой

   СТРУКТУРА ХРАНЕНИЯ ЧАСТЕЙ АНИМАЦИИ в программе MA_Paint

   В текущем каталоге могут храниться 10 папок с номерами частей мультфильма. В каждой папке находятся рисунки кадров и текстовый файл TS.txt, в котором указаны числа, определяющие длительность кадра.
   Например, содержимое папки с названием 0 может быть таким –
0M 1.bmp   0M 2.bmp   0M 3.bmp   0M 4.bmp   TS.txt
   а содержание папки 1 таким -
1M 1.bmp   1M 2.bmp   1M 3.bmp   1M 4.bmp   TS.txt
 
   Как видим, имена файлов в папках перенимают номера папок, поэтому менять части мультфильма, просто меняя названия папок, нельзя. Чтобы изменить номер части, нужно зайти в программу, считать эту часть и запомнить её под другим номером.

   СТРУКТУРА И ХРАНЕНИЕ ОДНОМЕСТНЫХ ФРАГМЕНТОВ

   В текущем каталоге могут храниться 10 папок, содержащих кадры одноместного фрагмента. Это папки с названиями
00F  00F1  00F2  00F3  00F4  00F5  00F6  00F7  00F8 и 00F9
  при этом названия рисунков в этих папках однотипны и попросту соответствуют номерам кадров анимации, то есть, могут иметь названия от 1 до 42.
  Названия папок, содержащих фрагменты можно свободно менять. А вот менять их изнутри программы не нужно – считывание и повторное запоминание одноместного фрагмента приведёт к увеличению размера фрагмента до размера рисунка, и чтобы вновь создать фрагмент компактного размера придётся вновь воспользоваться опцией = для его запоминания, так, как это объясняется в видео по предыдущей ссылке.
  Кадры считываются из папок поочерёдно, до тех пор, пока они не кончатся, или не кончится место в буфере анимации для записи их. Если очередной кадр по своему номеру в папке не находится, то он пропускается, и вместо него считывается следующий кадр.
  Помимо кадров анимации в папке одноместного фрагмента находится ещё бинарный файл с названием n.txt, содержащий число кадров, координаты верхнего угла фрагмента, а также его ширину и высоту.

   СТРУКТУРА И ХРАНЕНИЕ МНОГОМЕСТНЫХ ФРАГМЕНТОВ

   В текущем каталоге, да и в иных местах, могут храниться папки фрагментов с произвольными названиями, но вот для работы с фрагментами нужно скопировать папку, поменяв её название на 0. То есть придать ей статус папки, содержащей часть мультфильма.
   По структуре своей содержимое папки с многоместным фрагментом ничем не отличается от папки с нулевой частью мультфильма. То есть, она содержит файлы
0M 1.bmp   0M 2.bmp   0M 3.bmp   0M 4.bmp и так далее, но файл TS.txt необязателен и при считывании фрагментов игнорируется.
   Разумеется, с папкой 0, содержащей фрагменты, можно работать как с папкой, содержащей часть мультфильма – можно проиграть анимацию, или пройти её пошагово, или в ходе этого пошагового просмотра внести в неё изменения, затем запомнить всё самым обычным образом.
   Или, выбрав один из кадров, перевести его на поле_2, нажав кнопку 1=>2
Для чего это нужно, я сейчас расскажу.

     ИСПОЛЬЗОВАНИЕ МНОГОМЕСТНЫХ ФРАГМЕНТОВ В АНИМАЦИИ

  Даже если вы не работаете с фрагментами, а просто поместили на поле_2, например, изображение стрекозы, то вы сможете заставить её летать.
  Давайте вспомним начало этой статьи. Там говорилось о буфере д. На этот раз он нам понадобится не формально, а по существу.
  Итак, поместим изображение нашей стрекозы в рамочку буфера, и установим цвет фона белым, поскольку стрекоза изображена у нас именно на белом фоне, и мы хотим, чтобы этот фон был прозрачным.
  В текстовом поле над кнопкой Paste делаем только одно изменение – ставим точку в первой позиции строки. То есть, запишем так – .т20п1
  Затем копируем стрекозу в любое место рисунка так, как это было описано выше. Затем чертим траекторию (не забудьте включить режим морфинг, без него траектория не будет воспринята), и проводим реконструкцию кадров анимации, нажав кнопку R.
  Проигрываем анимацию. Наша стрекоза полетела по полю нашего рисунка. Жаль только, что крыльями она не машет. Хотя, если это не стрекоза а бабочка, то можете придать ей сильное вращение, и тогда она будет как бы порхать. 
  Если крылья летящей стрекозы покажутся вам не слишком ажурными, то делайте реконструкцию, установив размер точки рисования равным 1. Тогда копирование станет более тонким, хотя некоторые пиксели могут при  поворотах изображения  пропускаться и останутся незакрашенными.
  Картинку при копировании и наложении на анимацию можно зеркально отразить справа налево относительно точки копирования, если вместо строчной п записать заглавную букву - .т20П1

  Для того, чтобы поместить в поле_2 картинку с изображением фрагментов, вовсе не обязательно загружать анимацию из папки 0 в программу, достаточно открыть нужный рисунок с помощью обычной программе Паинт и запомнить его в буфере Виндос.
  Затем, находясь в программе MA_Paint, кликаем оранжевую полоску справа, на верхнем бордюре окна. Картинка будет считана из буфера, и нам останется только перенести её на поле_2.

  Если фрагмент был уже помещён в буфер д, а мы, загрузив и проиграв анимацию, не помним, где этот фрагмент находится, то можно ПРАВОЙ кнопкой мыши кликнуть оранжевый лайк «вернуть», и мы увидим фрагмент. Можно его копировать и работать дальше.
  Кнопка «Градация» участвует в этом процессе – она задаёт масштаб копирования фрагмента с поля_2 на поле_1. Коэффициент увеличения определяется формулой К = 0.4 + Ц/10  где Ц это цифра на кнопке «Градация». При цифре 6 фрагмент копируется в масштабе 1:1.
_____________
СПРАВКА. Тот же лайк при клике ЛЕВОЙ кнопкой мыши вернёт нам содержание буфера д, но оно нам не нужно и мы его в данных опциях реконструкции не используем.

  Опция с точкой в начале текстового поля годится для статичного изображения. Чтобы запустить по траектории динамичный персонаж, занимающий собой несколько кадров анимации, вместо точки нужно поставить двоеточие. Вот так - :т20п1 и далее делаем всё то же самое.

  ОСОБЕННОСТИ СЧИТЫВАНИЯ МНОГОМЕСТНЫХ ФРАГМЕНТОВ

  После запуска реконструкции кнопкой R происходит следующее.
  В папке 0 ищется начальной кадр. Обычно начальный кадр это 1-й кадр, но поиск можно настроить на 15-й или на 29-й кадры, то есть на начало второго или третьего ряда кадров в буфере анимации (см.иллюстрацию).
  Для такой настройки выставляем цифры 2 или 3 на кнопке «Величина белильности» (см. иллюстрацию). 

   Что даёт такая настройка? В папке такой структуры мы можем хранить большее число анимационных фрагментов. Рисунки из папки с фрагментами читаются в порядке очереди – читается начальный рисунок, за ним – следующий по номеру. Если следующий по номеру отсутствует, то вновь читается начальный. И так далее, до последнего кадра реконструкции.
     Таким образом, рисунки в папке могут быть разделены на три группы, на начало каждой из которых можно настраиваться индивидуально.

   ЗАКЛЮЧЕНИЕ

  Использование фрагментов в сочетании с их движением по траектории – неплохой способ создания анимации. Также как и морфинг, этот метод вносит изменения не в один кадр, а в ряд выделенных кадров, ускоряя процесс анимации и дополняя собой другие методы.
_________
25.2.2020

Технические подробности.
Обрезается картинка следующими операторами

  Picture1.Picture = Picture1.Image: W = Lo3 - Lo1 + 1: H = Lo4 - Lo2 + 1
  Picture1.PaintPicture Picture1, 0, 0, W, H, Lo1, Lo2, W, H
  'здесь Lo1 и Lo2 -XY координаты лев.верхнего угла, Lo3 и Lo4 -противоположного
  Picture1.Picture = Picture1.Image
  Picture1.Width = (W + 4) * 15: Picture1.Height = (H + 4) * 15
  Picture1.Picture = Picture1.Image