В этой электронной книге на основе фундаментальных понятий математики, введенных в начале, математически строго описывается ряд проблем и дается их решение. Изложение, где это возможно, носит строгий математический характер. Доказательства утверждений проводятся на конструктивном уровне. Дается большое количество примеров и упражнений, результаты которых, как правило, используются в дальнейшем.
Анимированное кино существует и развивается уже сто лет. Оно стало считаться одним из видов искусства. Год от года неуклонно возрастет число анимационных проектов. Такие картины, как Final Fantasy, Shrek, Little Stuart, The Incredibles, Finding Nemo претендуют на престижную премию Оскара. Возможно наступит момент, когда актеров заменят их трехмерные двойники.
Трехмерные сцены становятся все реалистичными, а их себестоимость снижается. Без трехмерных декораций не обходится ни один современный экшн.
Как создается трехмерная анимация.
Анимированное кино существует и развивается уже сто лет. Оно стало считаться одним из видов искусства. Год от года неуклонно возрастет число анимационных проектов. Такие картины, как Final Fantasy, Shrek, Little Stuart, The Incredibles, Finding Nemo претендуют на престижную премию Оскара. Возможно наступит момент, когда актеров заменят их трехмерные двойники.
Трехмерные сцены становятся все реалистичными, а их себестоимость снижается. Без трехмерных декораций не обходится ни один современный экшн.
Трехмерная анимация постепенно вытесняет классическую двухмерную мультипликацию. Многие мультяшные герои или "уходят на пенсию" (с ними просто больше не делают новых мультфильмов), или обретают новую жизнь в 3D. Например, мультфильм с моряком Папаем, сделанный при помощи 3D-редактора Softimage|XSI.
В 2004-ом году известная анимационная студия Blur Studio представила первый анимационный трехмерный проект про Микки Мауса и других диснеевских героев.
Три мультфильма общей продолжительностью 40 минут стали самым крупным проектом за девятилетнюю историю Blur Studio.
Работа над проектом велась совместно 3D-аниматорами Blur и художниками Disney Studios, которые в свое время рисовали Дональда, Плуто и прочих персонажей. Для того чтобы максимально сохранить особенности движения и внешнего вида персонажей при переносе их в трехмерный мир, ведущий аниматор студии Disney Андреас Дежа (Andreas Deja) все время давал советы коллегам-3D-художникам. Результатом остались довольны все, и в Blur и в Studio надеются, что проект не будет последним.
Метод ключевых кадров.
Современная техника анимации кардинально отличается от анимационных фильмов выпускавшихся двадцать, пятьдесят лет назад.
А до появления трехмерной графики существовала так называемая кукольная анимация. Делалась она так: снимался один кадр с мультипликационным героем, затем, например, руку персонажа передвигали на очень небольшое расстояние и опять снимали один кадр. Вся работа состояла в том, чтобы снять на пленку все положения руки мультяшного героя. Что же касается рисованной анимации, каждый кадр рисовался вручную.
В компьютерной анимации все гораздо проще. Аниматор задает в программе только два положения руки - верхнее и нижнее, а все промежуточные положения просчитываются компьютером. Кадры, которые фиксируют начальное и конечное положение тела, называютсяключевыми.
Используя метод ключевых кадров, можно "оживить" практически любые параметры анимационной сцены. Продолжительность анимации зависит от количества промежуточных кадров между ключевыми.
Если математически отобразить зависимость анимированного параметра (или ключа анимации, как его еще называют) от времени, каждый ключевой кадр будет характеризоваться двумя кривыми, которые определяют функциональные зависимости анимированного параметра на промежутке между текущим ключевым кадром и предыдущим, а также настоящим ключевым кадром и следующим. Во многих редакторах для работы с трехмерной графиков подобной графической зависимостью можно управлять, определяя характер анимации.
Преимущество метода ключевых кадров перед классической техникой создания анимации очевидно: аниматор тратит на создание проекта гораздо меньше времени. Большая часть рутинной работы, которая ранее выполнялась вручную, сегодня переложена на компьютер.
Проблемы при создании анимации методом ключевых кадров.
Несмотря на универсальность и простоту техники ключевых кадров, существуют случаи, когда использование этого метода не позволяет добиться желаемого результата. Это касается тех сцен, в которых необходимо отобразить эффекты, подчиняющиеся законам физики.
В реальной жизни все, что нас окружает, постоянно изменяется - шторы слабо двигаются, по озеру бежит мелкая рябь и так далее. Аниматору очень трудно воссоздать такую картину методом ключевых кадров.
Если сцена содержит большое количество анимированных объектов, установить для каждого из них свой набор ключевых кадров очень сложно. Поскольку подбор параметров значений анимированных параметров в каждом из ключевых кадров производится методом проб и ошибок, на подгонку такой сцены уйдет очень много времени.
Кроме этого, при помощи ключевых кадров 3D-аниматору бывает очень сложно воссоздать реалистичную анимацию некоторых объектов: жидкости, материи, огня, волос, разбивающихся предметов. Алгоритм решения этих проблем настолько сложен, что его разработкой занимаются целые институты.
Каждая программа для создания динамики в трехмерных сценах по-своему уникальна, имеет свои преимущества и недостатки. Поэтому при выборе программного обеспечения руководитель анимационного проекта обычно учитывает задачи, которые планируется выполнить на данном этапе.
Помимо проблем, связанных с моделированием физических процессов, существует еще одна трудность, связанная с анимированием большого количества объектов в сцене. Создать простую, на первый взгляд, сцену с горящим бенгальским огнем при помощи ключевых кадров невозможно. Вручную задать траекторию движения для каждой из огромного количества разлетающихся искр - задача практически невыполнимая. В этом случае в трехмерной анимации используются так называемые источники частиц. Их особенность в том, что они позволяют одновременно управлять большим количеством объектов. Значимость частиц в трехмерной графике столь велика, что некоторые 3D-редакторы имеют сложные системы управления источниками частиц, которые позволяют тонко настроить анимационные эффекты с учетом изменения скорости движения частиц, размера, цвета, формы, изменения положения в пространстве и т.д.
Персонажная анимация.
Создание персонажной анимации - это один из важнейших этапов создания трехмерного проекта.
Любую анимацию можно условно разделить на два типа: реалистичная и нереалистичная. Персонажная анимация может быть как реалистичной, так и нереалистичной, однако, зрителем она лучше воспринимается, если напоминает движения, совершаемые реальными существами. Даже если персонаж анимации - это вымышленное существо, плод воображения художника, лучше, чтобы его движения были правдоподобны. В противном случае персонаж будет выглядеть безжизненным манекеном.
Характер движения любого существа определяется анатомическим строением его скелета. Поэтому при создании трехмерной анимации сначала создается модель скелета существа, на который позже "одевается" оболочка.
"Одевание" оболочки - это тоже достаточно трудоемкий процесс, ведь нужно "привязать" кости к соответствующим частям тела таким образом, чтобы при изменении положения скелета оболочка деформировалась реалистично.
Создавать анимацию скелета будущего персонажа можно двумя способами: вручную, с помощью ключевых кадров, и используя систему захвата движения Motion Capture. Последний способ получил широкое распространение и используется практически по всех коммерческих анимационных проектах, так как имеет ряд преимуществ перед методом ключевых кадров.
Технология Motion Capture использовалась, например, в анимационном фильме - <Полярный экспресс> (The Polar Express). В этом фильме известный актер Том Хенкс, играл сразу несколько ролей: маленького мальчика, проводника поезда, бродягу и Санта Клауса. При этом, во многих анимационных сценах актер играл сам с собой. Конечно же, все герои мультфильма были трехмерными, но Том Хенкс управлял их действиями, жестами и даже мимикой. Актер одевал специальное одеяние с датчиками, напоминающее гидрокостюм, совершал действия перед специальным устройством, а компьютер получал информацию об изменении положения отметок на костюме и моделировал, таким образом, движения трехмерного персонажа. Подобные датчики были установлены и на лице актера, что позволило переносить на анимационных героев его мимику.
Понятно, что анимация персонажей, созданная с использованием технологии Motion Capture, более реалистична, чем полученная методом ключевых кадров.
Мимика персонажа.
Для создания мимики трехмерного персонажа, кроме метода Motion Capture, используется также метод морфинга. Все современные 3D-редакторы обычно имеют средства для создания морфинга.
Добиться высокой реалистичности при имитации мимики методом Motion Capture не всегда удается. Чтобы она была правдоподобной, необходимо имитировать движения огромного количества мускулов, а ведь на каждый мускул датчик повесить невозможно.
Поэтому для имитации мимики используется метод морфинга. Он заключается в том, что на основе модели, которая будет анимирована, создается определенное количество клонированных объектов. Затем каждый из этих объектов редактируется вручную - форма лица изменяется таким образом, чтобы на нем присутствовала та или иная гримаса. При создании мимики очень важно, чтобы лицо персонажа при анимации не выглядело однообразным. Для этого необходимо использовать модели-заготовки с самыми разными гримасами. Пусть на одной заготовке персонаж будет моргать, на другой - щуриться, на третьей - надувать щеки и т.д.
На основе этих моделей при помощи метода морфинга создается анимация. При этом, просчитывается, как изменяется лицо персонажа при переходе от выражения лица одной модели до гримасы, созданной на второй модели и т.д. Таким образом, каждая из моделей служит ключом анимации, в результате использования морфинга форма объекта изменяется, и создается мимика персонажа.
3D-аниматор, который профессионально занимается "оживлением" персонажей, должен быть не только художником, но и знатоком анатомии. Знания о строении тела и работе мускулов помогают создать реалистичные движения и выражения лица.
Если же персонаж не только ходит и кривляется, но еще и говорит, 3D-аниматор обязан превратиться еще и в лингвиста. Каждый звук, который произносит человек, сопровождается определенными движениями его губ, языка, челюсти. Для того чтобы перенести эти движения на трехмерную анимацию, нужно уметь разбивать речь на фонемы и создавать соответствующие их произношению движения на лице персонажа.
Виртуальные камеры.
Многие трехмерные анимационные эффекты создаются с помощью виртуальных камер. Эти вспомогательные объекты предназначены для того, чтобы изменять положение точки съемки в виртуальном пространстве.
Виртуальные камеры обладают всеми основными параметрами, которые присущи настоящим камерам. Так, например, для виртуальной камеры можно указать фокусное расстояние, установить свой тип линз и т.д.
Виртуальная камера, в отличие от настоящей, - это лишь вспомогательный объект, которого вы никогда не увидите на трехмерной анимации.
Трехмерная анимация заметно упрощает реализацию многих спецэффектов. Так, например, хорошо всем известный "эффект Матрицы", когда, камера медленно объезжает вокруг человека, замершего в прыжке, гораздо проще создать при помощи виртуальной камеры. Для реализации этого эффекта в фильме "Матрица" использовалось большое количество камер, расположенных вокруг объекта съемки. Все они зафиксировали положение человека в один и тот же момент времени. Из этих кадров была создана анимация, имитирующая "облет" вокруг объекта.
В трехмерной анимации законы физики не действуют, поэтому для создания такого эффекта достаточно зафиксировать в прыжке трехмерную модель человека и задать плавное движение виртуальной камеры вокруг него.
В реальном мире при съемке фото или видеокамерой быстро движущиеся объекты остаются на полученном изображении смазанными. Причем, размытие изображения в конкретном кадре указывает на направление движения заснятого объекта. Присутствие этого эффекта в трехмерной анимации делает ее более реалистичной.
Эффект смазанного движения (Motion Blur) позволяет создать в трехмерных анимированных сценах смазанный шлейф от быстродвижущихся объектов, и отобразить их такими, какими они выглядят при реальных съемках. Возможность использования эффекта смазанного движения имеется практически во всех модулях просчета изображения, которые используются в 3D-графике.
Сегодня 3D-анимация находится на ранней стадии своего развития но за ней большое будущее. Потребуется еще немало времени, пока в 3D будут созданы анимационные шедевры, которые можно будет сравнить с лучшими образцами классической анимации.
А пока все с удовольствием смотрят мультфильмы, выпущенные много лет назад. Такой например как мультфильм "Бемби", созданный студией Диснея шестьдесят три года назад и отреставрированный при помощи современных средств видеообработки.
Хочется надеяться, что такую же популярность, нерушимую временем, смогут снискать и трехмерные анимационные проекты будущего.
Часто встречающаяся ошибка при работе с сессией - поздний старт. Когда данные в браузер уже начали отправляться и вызов session_start() приводит к ошибке "headers already sent". На этом спотыкаются многие начинающие (и не только) программисты PHP.
Для понимания проблемы надо немного разбираться в работе протокола HTTP. Текущая версия протокола (1.1) описана в документе RFC2616.
Протокол работает по принципу "запрос - ответ". Браузер пользователя посылает запрос на сервер. Тот, в свою очередь, посылает браузеру ответ. И запрос, и ответ состоят из заголовка и следующих за ним данных (тело). Т.е. если данные уже начали отсылаться, то что-либо добавить в заголовок уже возможности нет. Куки как раз передаются в заголовке HTTP запросов и ответов.
Да же если Вы поместите блок , содержащий session_start() в самое начало файла, но перед ним будет пробел или перевод строки, то это тоже приведет к ошибке. Никаких символов перед блоком быть не должно!
Что же делать, если решение, использовать сессию или нет, принимается не в самом начале программы и перед ним возможен какой-либо вывод?
Выход простой - использовать буферизацию. В PHP буферизацией управляют функции начинающиеся на "ob_" (output bufferering). В начале программы (до любого возможного вывода) следует поставить вызов ob_start(), а перед завершением программы (хотя бы после старта сессии) - ob_end_flush().
Кстати, при работе непосредственно с Куки и заголовками HTTP возникают те же самые проблемы и решаются они аналогично.
Вернемся к Куки и сессии.Сессия имеет имя, используемое как в Куки, так и при передаче идентификатора сессии в параметрах URL. По умолчанию, это имя - "PHPSESSID". Его можно поменять на другое имя, глобально для всего сервера, через php.ini (session.name). Так же можно изменить его только для данной программы, в процессе выполнения, функцией session_name().
Сразу предостерегу от возможных ошибок: параметры сессии можно менять только до ее старта.
Кроме имени, параметрами сессии являются: время жизни и параметры Куки.
Время жизни сессии - это время неактивности сессии, по истечении которого сессия может быть удалена сборщиком мусора и пользователь, зайдя на сайт еще раз, получит новый идентификатор сессии и, соответственно, новую сессию. Задается время жизни в php.ini (session.lifetime). При использовании собственных обработчиков этот параметр php.ini можно игнорировать и использовать свое значение времени жизни.
Куки может иметь следующие необязательные параметры: время жизни, путь URL, DNS-домен, признак секретности. Я их перечислил в порядке "уменьшения обязательности". Т.е., нельзя указать домен, не указав время жизни и путь.
Смысл параметров следующий:
* Время жизни.
Это рекомендованное время хранения Куки в браузере пользователя. Если время равно нолю, то Куки удаляется после закрытия браузера (или во время его следующего запуска) и называется это "хранение на время текущей сессии". По умолчанию, время жизни равно нулю.
* Путь URL.
Если запрашиваемый путь начинается с этого значения, то данное Куки посылается в запросе. Это позволяет иметь на одном сервере несколько независимых программ, работающих с собственными сессиями. Такие программы должны находиться в разных директориях и директория одной программы не может быть вложена в директорию другой программы. Например, "/a/" и "/b/" - могут иметь независимый друг от друга набор Куки, а "/a/" и "/a/b/" - нет (все Куки для пути "/a/" будут посылаться и при запросе пути "/a/b/"). По умолчанию, используется путь "/".
* DNS-домен.
Домены DNS - это имена, используемые в Интернете. Домены образуют древовидную иерархию. Например, в домене com есть домен shelek.com, а в нем есть домены club.shelek.com и forum.shelek.com.
Если указать в Куки домен shelek.com, то браузер будет посылать это Куки в запросах к shelek.com, club.shelek.com и forum.shelek.com. Если же указать, forum.shelek.com, то это Куки посылаться будет только при запросах в домены, начинающиеся с этого имени и мешать домену club.shelek.com не будет. По умолчанию, используется домен, на который браузером был послан запрос. Т.е., если нет особой необходимости, то этот параметр менять не нужно.
* Признак секретности.
Если установить этот признак, то данное Куки будет посылаться только в запросах по защищенному каналу (SSL, TLS, IPsec). Напомню, что для того, чтобы можно было устанавливать этот параметр, нужно задать все предыдущие. В том числе и домен. Его текущее значение можно взять из $_SERVER['SERVER_NAME'].
Среди читателей, я уверен, есть такие, кто в PHP совсем не разбирается, кто только начал изучать, и такие, кто полагает, что он давно со всем разобрался и ничего нового узнать о PHP не сможет. Последние явно заблуждаются: всегда можно найти интересную задачу, которая вытащит на свет множество интересных и ранее не изученных (или плохо изученных) моментов. И тогда рытье в документации и эксперименты обеспечены.
Когда мы посещаем сайты, часто ли задумывается мы, как серверная программа помнит такие вещи, как введенный логин, какие сообщения мы еще не читали, какие товары мы положили в "корзину покупателя" и т.п.? Посетителю сайта нет необходимости знать это, а web-программисту эти знания лишними не будут.
Работает этот механизм просто, но в то же время довольно сложно.
Серверная программа запоминает переданные пользователем данные в сессии (сеансе) и достает их оттуда при следующем обращении на сервер. Но пользователей, работающих с одним сайтом, может быть несколько и для того, чтобы понять, где чья сессия, нужен какой-либо механизм идентификации. Так как же точно идентифицировать данную сессию?
Первое, что приходит на ум - использовать для этого IP-адрес компьютера пользователя. Вполне возможно, что на заре web-программирования так и делали, но с одного IP-адреса могут посылать запросы несколько пользователей. Например, если они работают через один proxy-сервер, или находятся в одной локальной сети и выходят в Интернет через NAT-шлюз, назначающий им один и тот же внешний IP-адрес. Да и за время посещения сайта адрес пользователя может поменяться (например, при восстановлении прерванного модемного соединения). Т.е., механизм этот не надежен.
Выход только один - пользователь должен сам передавать свой идентификатор, сообщенный ему сервером.
Идентификатор сессии можно передавать в строке параметров URL. Многие сайты так и делают (обычно это используется как дублирующий механизм). Но у этого метода есть большой недостаток. Если вам захочется, к примеру, послать такую ссылку другу, и он зайдет по ней на сайт, то он может внедрится в вашу сессию. Выходит, этот механизм тоже не без изъяна.
Для решения этой задачи компанией Netscape была придумана и внедрена в созданный ею браузер возможность запоминать специальные данные, переданные сервером, на компьютере пользователя. При следующем обращении на сервер браузер отсылает эти данные назад, и серверная программа идентифицирует по ним пользователя. Назвали они этот механизм Куки (cookie - печение). Позже Miscosoft реализовала Куки в InternetExpoler. Сегодня Куки поддерживаются всеми современными браузерами.
Этот механизм тоже имеет недостатки: пользователь может запретить своему браузеру работать с Куки или неправильно настроенный proxy-сервер может их удалять из запроса. Но, если не заниматься такой, извиняюсь, ерундой, механизм Куки выглядит более надежным и безопасным, чем идентификация по IP и параметрам URL.
Работу сессии PHP можно продемонстрировать на таком примере: