Неподвижные изображения пригодны для некоторых программ-приложений компьютерной графики, но иногда возникает необходимость в движущихся изображениях. Так, например, имитаторы полета и видео игры постоянно меняют экран, создавая объекты и даже целые сцены, показываемые в движении. Иллюзия движения, достигаемая стремительной сменой изображения на экране, называется анимацией.
К примеру, многие хотят знать, как нарисовать человека поэтапно в полный рост?
Любая компьютерная анимация выполняется обычно следующим образом: вносятся изменения в изображение на экране с быстротой, достаточной для того, чтобы последовательность изображений казалась движущейся картинкой. По научным данным, для того, чтобы успеть увидеть и осознать содержание изображения, человеческому мозгу необходимо не менее четверти секунды. Когда вы смотрите фильм в кинотеатре, вы видите 24 разных изображений, или кадров каждую секунду. Каждый кадр показывается в течении 1/24 секунды. Ваш ум не успевает осознать отдельно взятый кадр, он воспринимает движущуюся картинку. Компьютерная анимация работает по тем же принципам. Большинство современных компьютеров неспособно показывать 24 полноэкранных изображения в секунду, но приемлемое качество может быть получено и при существенно меньшей скорости. Уловка состоит в показе максимально возможного числа кадров и сокращения до минимума времени на перерисовку кадра. Общее впечатление сильно ухудшается, если пользователь может видеть, как перерисовываются кадры.
Лучший эффект анимации на компьютере достигается при использовании ДВОЙНОГО БУФЕРА - способа, который известен также под названием ПЕРЕКЛЮЧЕНИЯ ВИДЕОСТРАНИЦ. Использование двойного буфера сводит время перерисовки экрана к абсолютному минимуму - к 1/60 секунды или к тому времени, которое требуется электронному лучу монитора для прохождения всего экрана. Программы, использующие двойной буфер, работают одновременно с двумя видеобуферами, только один из которых виден пользователю в произвольно взятый момент времени. Все перерисовки осуществляются в том буфере, который в данный момент не виден. Когда новое изображение создано на скрытом буфере, программа переключает состояние буферов, делая скрытый до этого момента буфер видимым, а видимый - скрытым (как бы меняя их местами). Когда такое переключение произошло, новое изображение появляется мгновенно. Не имеет значения сколько по времени занимает генерация каждого кадра в компьютере, пользователь программы видит только конечный результат, и изменения протекают гладко от одного кадра к последующему.
Одна из первых программ, использующая двойной буфер на IBM PC, была Microsoft Flight Simulator. Если вы обладаете ее копией, то запустите ее и понаблюдайте, как быстро происходит перерисовка экрана (не число кадров в секунду, которое невелико, а время перерисовки между кадрами). Новые изображения не вырисовываются прямо на экране, они только появляются. Небольшая пауза между кадрами требуются программе на построение нового изображения в скрытом буфере.
Не все видеоадаптеры поддерживают режим двойного буфера. И даже если видеоадаптер поддерживает его, то операционная система может не делать этого. Если от кадра к кадру меняется только маленькая часть сцены - например, если фон изображения остается неизменным, когда объект движется по нему - тогда альтернативный подход состоит в перерисовке лишь той части экрана, которая изменяется, и делать это нужно быстрее, чем глаз успеет это заметить. Такой процесс попеременной перерисовки и очистки цифрового изображения в разных его местах иногда называют блочной анимацией. Обычно, программа копирует прямоугольный кусок фона на невидимый на экране буфер памяти. Объект врисовывается в прямоугольник, и когда приходит время этому объекту сдвинутся на новое место, очистка выполняется копированием прямоугольного куска фона обратно в видеобуфер. Стирание как часть процесса проста, но если форма объекта не прямоугольная, его прорисовка требует некоторой изобретательности. Растровые образы всегда прямоугольные, и копирование прямоугольного изображения на экран как результат имеет образ объекта в прямоугольнике. Если сам объект не прямоугольный, незаполненные области прямоугольника должны быть каким-либо образом быть объявлены прозрачными, и при наложении на фон оставлять его неизменным.
Для вывода на экран компьютера объектов сложной формы без "задевания" фона обычно используются "маски". Объект описывается двумя прямоугольными массивами чисел: маска AND (двоичное И) и маска XOR (двоичное исключающее ИЛИ). Маска AND обнуляет те пикселы фона, которые относятся к объекту, оставляя остальной фон нетронутым. Наложение маски AND последовательно за маской XOR рисует объект на очищенных маской XOR пикселах, также не изменяет остальной фон. Итак, наложение маски AND вслед за маской XOR выводит объект на экран без изменения пикселов окружающих его. Маски XOR и AND позволяют выделять (вставлять и вынимать) объект на прямоугольном участке экрана.
Хотя официального названия нет, комбинацию блочной анимации и использования масок часто называют МАСКОВОЙ АНИМАЦИЕЙ. Циклически копируя фон из под объекта на невидимый на экране буфер, рисуя объект на экране с использованием масок XOR и AND и стирая его при восстановлении фона, программа может воспроизводить анимацию. Анимация с применением масок используется во многих видеоиграх. Качество анимации зависит в большой степени от того, как быстро объект может быть стерт и перерисован. Чем меньше перерисовываемая область экрана и чем быстрее работает компьютер, тем качественнее общий эффект.
Существуют и другие способы компьютерной анимации. Например, на видеоадаптерах, обладающих палитрой, течение лавы может быть сымитировано весьма эффективно перепрограммированием палитры между кадрами. Этот метод очень быстр, так как перепрограммируя один регистр палитры, видеоадаптер меняет цвет каждого соответствующего ему пиксела на экране в мгновение ока. Анимация, использующая палитру, интересна, но ее применение ограничено, и становится все более редким с приходом все большего числа видеоадаптеров, использующих 24-x битный режим цвета. Ввиду сказанного, мы остановимся на рассмотрении двух наиболее используемых форм анимации: двойной буферизации и масковой анимации.
Как работает двойной буфер.
1. Программы, использующие двойной буфер, оперируют с двумя раздельными видеобуферами, которые мы будем называть буферами А и Б. "Переключатель" на видеоадаптере определяет, какой видеобуфер виден в данный момент на экране. Тот буфер, на который указывает переключатель, мы назовем передним буфером, а другой - задним. Переключатель может быть перекинут вперед или назад при помощи программных команд, эффективно меняя местами передний и задний буфер, и мгновенно изменяя изображение на экране. Для начала оба видеобуфера пусты и переключатель указывает на буфер А.
2. Начиная показ анимационной последовательности, компьютер выводит изображение в буфер Б. Процесс этого вывода скрыт от пользователя, так как буфер Б в данный момент не виден.
3. Изменяем положение переключателя переставляющего буферы, делаем буфер Б передним и показываем изображение, которое только что было нарисовано. Когда переключение произошло, новое изображение появляется почти мгновенно - в 1/60 секунды или за количество времени необходимое монитору, чтобы перерисовать экран.
4. Вторая сцена в анимационной последовательности нарисована в буфере А, который стал теперь задним буфером. Снова процесс построения изображения скрыт от пользователя, так как экран показывает только то, что находится в переднем буфере.
5. Переключение буферов в следующий момент времени показывает второй экран в анимационной последовательности. Этот процесс рисования изображения на заднем буфере и переключения буферов повторяется снова и снова для создания движущегося изображения. Не важно, какое количество времени нужно компьютеру чтобы создавать каждый новый экран, пользователь видит только целые изображения. Однако, чем больше скорость смены кадров и чем меньше различие между двумя соседними кадрами, тем более плавной становится анимация.
Как работает масковая анимация.
1. Масковая анимация часто используется в случаях, когда маленький непрямоугольный объект движется по сцене на фоне полноэкранного изображения. Пара масок, хранящихся в основной памяти компьютера, используются для прорисовки объекта. Маска AND, которая создает дыру по форме объекта на фоновои изображении, описывает объект нулями на поле, заполненном единицами. Маска XOR, которая рисует объект на месте, расчищенном маской AND, содержит значения пикселов, описывающих объект. В данном примере 4 обозначает красный цвет, 6 обозначает желтый. Пикселы фона представлены нулями.
2. В начале фон сцены выведен в видеобуфер.
3. Прямоугольный блок пикселов в том месте, где объект впервые появился, скопирован из видеобуфера в маленький буфер, расположенный в основной памяти компьютера.
4. Маска AND прикладывается к соответствующей прямоугольной области в видеобуфере. Пикселы которые относились к единицам в маске AND остались нетронутыми, в то время как пикселы соответствующие нулям стали равными нулю. Место для объекта теперь расчищено.
5. Маска XOR прикладывается к тому же месту. Пикселы, относящиеся к нулям в XOR маске, остались нетронутыми, другие пикселы приняли описанный в маске цвет. Объект теперь полностью изображен на экране.
6. Чтобы анимировать движения объекта, компьютер сначала стирает объект копированием прямоугольного участка фона назад в видеобуфер. Затем он сохраняет копию фона, находящегося под новым месторасположением объекта.
7. Объект нарисован в новой позиции с помощью масок AND и XOR. Если он постоянно стирается и перерисовывается таким образом, и все шаги выполняются достаточно быстро, объект будет казаться нам пролетающим по экрану.