вторник, 31 мая 2011 г.

Camera-mapping: как это сделано

В предыдущем посте я показал первые наброски из разрабатываемой сцены спецэффекта, создаваемого по технике Camera Mapping. Делаю я это в Blender 2.57. Если вам интересно узнать немного о этой технологии или просто узнать, как это делается в Блендере, читайте далее.
 КамераМэппинг позволяет "оживить" фотографию, даёт возможность создать из одного статичного кадра анимацию с небольшим панарамированием/трансфокацией. На фотографии определяется фон и объекты на разных планах. Все эти дела вырезаются в отдельные изображения с альфа-каналом. Я решил организовать один объект (турист в красной куртке) и фон (всё остальное). В этом деле ваш лучший друг - Stamp Tool в Фотошопе.




Затем необходимо установить камеру в сцене так, чтобы она более менее соответствовала позиции камеры при съёмке. Для этого стоит посчитать "правильную" фокусную длину камеры. Так как съёмка велась камерой с не фул-фрэйм матрицей, нужно откорректировать фокусное расстояние, записанное в EXIF-данные. У меня фотик с матрицей 5.9 мм шириной (Canon SX110), поэтому 16 мм в ЭКСИФе  надо домножить на 36/5,9 = 6,1. Затем, это число прописать в настройках камеры Блендера. Можно не считать в калькуляторе, а просто прописать выражение 16*6,1 в строке значения - Блендер сам посчитает его.
Затем надо включить отображение изображения во вьюпорте (только для камеры) и совместить выставить позицию камеры. Очень хорошо, если есть возможность ориентироваться по таким элементам, как горизонт (чтобы с ним проще совместить кадр, можно задрать количество линий сетки вьюпорта), параллельные и перпендикулярные линии на ровных горизональных поверхностях. Ещё можно специально измерять место съёмки, угол и положение камеры... но для начала можно обойтись и без таких обострений.
Скажу по секрету - в предыдущем посту я ошибся в фокусном растоянии камеры более чем в два раза и заметил это только сейчас, когда писал эти строки. Ниже будет исправленный вариант.

Затем создаётся примитивная геометрия - плоскость земли и грубая, примерная модель человека (только та сторона, которая видима на фотке). Модель должна слегка выступать за контуры изображения - это скомпенсируется прозрачностью текстуры. Стоит заметить, что когда земля выполнена плоскостью с полигонами большой площади - вылазят косяки мэппинга текстуры, поэтому стоит применить несколько операций Subdivide.
Чтобы определить позицию солнца, я установил лампу типа Sun на макушку человеку и направил его так, чтобы линия направления указывала на конец тени человека. Для облегчения ориентирования я создал пустышку, которую установил в конец тени. Из ортогональных проекций в этом случае очень просто корректно сориентировать положение солнца. Правда, солнце понадобится нам только тогда, когда в сцену добавятся 3Д-объекты, которых на фотке не было и которые требуется реалистично осветить, чтобы они совпали по свету с фотографией. А если условия освещения были другими (пасмурно, искусственный свет), то, возможно, солнце не подойдёт, и придётся искать другие варианты.
Теперь стоит создать материалы. Пока их два - человек и поверхность земли.
Оба создаются одинаково. Для того, чтобы правильно проецировалась текстура, из вида камеры, выделив человека жмём пробел и выполняем команду Add Sticky. Затем такое же действие повторяем и с поверхностью земли. Это создаст на объекте привязку к текстуре, соответствующую его положению в кадре. В отличие от проецирования типа View (Window), Sticky "цепляет" координаты в момент своего добавления и держит их постоянными, тягая вслед за объектом.
Так как изображение на фотке уже максимально фотореалистично и освещено в соответствии с законами природы, нам не нужно настраивать материалы - достаточно просто указать Shadeless и включить прозрачность, добавить текстуру, установить мэппинг в Sticky и влияние на прозрачность. Всё.


Теперь можно сделать тестовый рендер и посмотреть, что к чему:

На этом пока всё. Продолжение следует.

Camera-mapping

В разгар работы над дипломом провёл один вечер издеваясь над фоткой.
Вот первые результаты:


И тестовое видео: