Надеюсь, картинка для публикации интригует не меньше, чем название? В любом случае, ещё со времён Аристотеля метафора не считается манипуляцией, а является способом наглядного представления новых понятий на примере их более известных аналогий. Так же как в реальном физическом мире созданы «обвесы» для съёмки видео на цифровые зеркалки, в компьютерном бинарном пространстве присутствуют их функциональные копии — риги для условных виртуальных камер. Что примечательно, на создание последних не придётся потратить ни копейки. Я пользуюсь Blender и у меня есть что добавить к его стандартной камере.
Немного лирики вместо вступления (жаждущим практических знаний есть смысл пропустить абзац). Комбайн Blender — вполне себе самодостаточный и полновесный пакет для создания визуального контента практически любой сложности с чистого листа. Сообщество разработчиков с периодическим постоянством жмёт на кнопку «улучшайзера» и все мы: художники, дизайнеры, да и просто энтузиасты, искренне радуемся новым релизам и обновлениям этого замечательного творческого инструмента. Если чего-то не хватает в «коробочной версии», можно найти addon’ы, либо вообще написать требуемое самому («день потерять» на изучение Python’а, а затем «за 5 минут долететь», настрочив нужный скрипт) ;)
Но и без дополнительных «наворотов» внутренних функций Blender хватает для большинства ситуаций. Вот пример сразу на тему публикации. В самом простом случае управление анимацией камеры в Blender сводится к вставке ключей в нужные кадры и настройке интерполяций кривых перемещений. При этом используется всего два набора координат: движения и вращения камеры.
Просто, консервативно, но не всегда удобно. Особенно, когда камера должна двигаться по сложной траектории. Иной раз бывает так — и ключи выставлены верно, и кривые в норме, а добиться нужного движения камеры не выходит.
Пробуешь тогда другой способ — перемещение камеры по траектории сплайна. На мой взгляд, он более удобен в сравнении с традиционным, так как позволяет тоньше и гибче контролировать «камкодер» Blender’а. Применим не во всех случаях — не панацея.
Третий, давно известный способ, который я нередко использую в работе. «Оптическую» ось камеры можно жёстко привязать к объекту-пустышке (или любому другому) с помощью функции Track To Constraint. Получается аналог камеры с функцией Target, которая доступна в обычном инструментарии пакета 3DSMax. Такой системой несложно управлять, будучи уверенным в том, что нужный ракурс и нужный объект всегда будут в кадре. Саму камеру и её «прицел» можно анимировать по сплайнам. Что уже гораздо удобнее.
Но в этой связке есть два существенных прокола, которые нивелируют её главное преимущество. Первый баг — Вы не сможете делать крен. Уровень горизонта всегда будет одним — перпендикулярным вертикальной оси. За исключением случаев, связанных со вторым дефектом тандема. При приближении к зениту и в противоположной ему точках камера будет вращаться так, как ей предписывает прицел, — самопроизвольно. Нужна вам такая камера? Мне тоже.
Я Вам должен сказать, что система с полным контролем «оптической» оси камеры стоит того, чтобы её доработать. Вот поэтому я сделал риг. Процесс настройки и тестирования занял времени минут 15-20. Теперь же, зная, как это делается, повторить работу можно минут за 5-7, а то и быстрее. Сразу оговорюсь, риг устраняет только первую проблему, решение второй — вопрос открытый. Если же ни у кого нет желания возиться с несовершенствами это мира, то специально для таких прагматиков есть уже готовый addon Camera Rig, который я обнаружил сразу после изобретения своего «велосипеда» (об этом ниже).
Итак, любители самоистязания средствами Blender, риг для камеры делается так (актуально для версии Blender 2.72a). Создаём новую сцену и обнуляем камеру. Клавишами Alt+R, Alt+G (либо через меню окна 3D View: Object > Clear > Location/Rotation) возвращаем её в исходное состояние с координатами «0» положения и вращения (масштаб нас не интересует). Так как мы будем привязывать камеру к «родительскому» объекту, она должна быть «безгрешна». Если 3D-курсор не в исходной позиции, сбросим и его координаты клавишами Shift+S через меню Snap > Cursor to Center. 3D-курсор окажется в том же месте, что и камера. Создаём «пустышку» через Shift+A: Add > Empty > Plain Axes (либо любой другой объект из списка — кому как удобнее). Переименовываем «Empty» в «Camera Root» и привязываем к нему нашу камеру: выделяем сначала камеру, затем через Shift пустышку и жмём Ctrl+P: Set Parent To > Object. Подвигав риг за «родительский» Camera Root, убеждаемся, что камера привязана.
Теперь сделаем кольцо для управления вращением камеры. Заранее скажу, что вращать камеру мы сможем только вокруг её «оптической» оси, вращение по другим координатам не имеет никакого смысла по причине логики работы системы. Не меняя положения 3D-курсора, жмём Shift+A: Add > Mesh > Circle и добавляем в сцену простой круг с 12 или 16 вершинами и радиусом в 0.75 условных единиц системы координат Blender (настраивается в панели Tool Shelf > Add Circle по вызову клавишей T в окне 3D View). Переименовываем круг в «Rotation Handle» и, как описано выше, привязываем его к корневому «обвесу» Camera Root. Для удобства можно добавить меток в самом круге в виде простых стрелок сверху и снизу относительно положения камеры (верх камеры всегда помечен чёрным треугольником — смотрите изображение выше). Тюнинг кольца вращения оставляю на Ваше усмотрение. Ещё раз проверяем, подчиняются ли ведомые элементы рига ведущему — пустышке «Camera Root».
Очередь дошла до создания «прицела». Убеждаемся в том, что 3D-курсор ждёт нас в начале координат и создаём ещё одну пустышку. Однозначно удобнее, если форма «прицела» будет отличаться от того объекта, к которому привязана камера. Его можно сделать любым другим, выбрав из меню Add > Empty, например, Arrows. В этом случае получатся стрелки с осями координат 3D-пространства. Определившись с визуальной эстетикой элемента, переходим к функционалу — делаем «прицел» прицелом. Сначала переименовываем созданный объект в «Camera Target». Затем перемещаем «прицел» камеры вниз по оси Z на какое-то произвольное расстояние. Выделяем сначала «Camera Root», затем «Camera Target» и жмём Ctrl+T: Make Track > Track To Constraint. На этом этапе «прицел» пока ещё не готов выполнять своё предназначение, т. к. камера после привязки смотрит в другую сторону.
Исправим это. Изменим проекцию в окне 3D View на ортогональную, вид сбоку (жмём клавишу «3» в цифровом блоке клавиатуры, курсор должен находиться в окне 3D View). Выделяем камеру и её вращательный механизм «Rotation Handle» и поворачиваем их вместе в сторону «прицела» на -90°. Затем делаем активным «Camera Root», открываем закладку Constraints в панели Properties и настраиваем слежение в соответствии с изображением внизу (группа 1).
Ухватившись за корневой «Camera Root», проверяем, как ведёт себя риг: камера должна следить за прицелом. Если всё так и есть, настраиваем вращение камеры, привязав её к «Rotation Handle». Выделяем камеру, открываем закладку Constraints в панели Properties, жмём Add Object Constraint, выбираем Copy Rotation и настраиваем логику работы ограничителя как показано на изображении выше в группе 2. Можем проверить, вращается ли камера вслед за вращением управляющего кольца.
Потратим ещё время на настройку рига. Для удобства мы заблокируем любую возможность движения «кольца» кроме вращения по оси Y, открыв закладку Object панели Properties и активировав кнопки с замками (изображение ниже, группа 1). Теперь мы можем просто жать клавишу R и вращать камеру вокруг её «оптической» оси как нам нужно. В дополнение к этому рекомендую заблокировать все координаты и самой камеры (изображение ниже, группа 2). Я сделал это на случай непреднамеренного нарушения работы системы — можно случайно ткнуть мышкой и сместить взаимное расположение элементов.
Протестируйте получившийся прототип. По логике работы этой системы Вы можете управлять только тремя элементами: корневым «обвесом» камеры («Camera Root»), «прицелом» и кольцом вращения. Сбросить поворот кольца вращения можно уже известным способом — нажав клавиши Alt+R. В анимации есть смысл контролировать следующие наборы координат (плюс — контроль, минус — не используется):
элемент управления | координаты положения | координаты вращения |
Camera Root | + | — |
Rotation Handle | — | + |
Camera Target | + | — |
Ещё одно обнаруженное мной ограничение в системе рига, которое нужно учитывать при анимации и с которым было бы неплохо разобраться — поворот камеры не должен превышать примерно 90° наклона. Бóльшие значения заставляют камеру совершать непредсказуемые скачкообразные повороты. Все баги системы сводятся к одной причине — к использованию привязки Track To Constraint, поэтому, адекватная замена этого ограничителя другим может решить вопрос. Это огорчает, но не ставит крест на возможности использования рига в сценах, которые не наворочены головокружительными выкрутасами камеры. Для тех, кто решит, что мой риг может быть полезен в работе, предоставляю готовый файл в формате Blender:
Напоследок — десерт. Закончив с ригом для камеры и с проектом, который вызвал необходимость её создания, недолго погуглив на волнующую тему, я нашёл addon для Blender’а, он так и называется — Camera Rig. Подробное описание на Blender Wiki со ссылкой на загрузку файла модуля. Возможности системы демонстрируются в видеоролике: