Разметка пролета на квадрокоптере с помощью beam и venetian blinds

​Всем привет!

С вами снова рубрика «бесполезные выражения». В этой статье рассматривается привязка beam к нул-объектам а так же интересное применение функции atan2.
Я расскажу вам об оптимизации одного проекта. Вообще, экспрешены в рамках него убыстрили работу в разы, однако этот пример в нашей рубрике потому, что я убеждён: АЕ очень плохо подходит для подобной задачи.

Итак, дано:

  • Несколько пролётов на коптере по территории моей родной Самарушке, сшитый в один файл разрешения 4к.
  • План прокладки труб, полос отвода и расположения люков на этой территории.
  • Желание поиграться с цветами и шрифтами в глазах заказчика.

Задача:

  • перенести план прокладки труб на видео. Приблизительно так:

Всё очень легко и ГЕМОРОЙНО! Важное условие-некоторые линии должны быть прерывистыми.
Путем недолгого анализа я придумал такую схему: тречим камеру пролета, выбираем точки трекера, которые наиболее близки к точкам на плане, превращаем их в нулы, соединяем линиями — профит.

Начнем с проблем:

  • большой кусок 4к изображения не хочет тречится, потому что в склейках пролётов алгоритм даёт сбой. Значит нужно делить файл на пролёты, что увеличивает количество необходимых нулей трекинга.
  • Точек, которые нужно нарисовать на карте оказалось больше около двух тысяч. Таймлайн АЕ не перестает показывать слои, начиная примерно с 900-го (а ведь будут еще множество вспомогательных слоёв). Решается прекомпозами.
  • В местах, где точки расположены далеко друг от друга при движении камеры точка может выйти за пределы системы координат Афтера (или не знаю как это назвать, но точка улетает куда то очень высоко, а на экране в этот момент кровь-кишки…). Решается так: перед тем, как нул начинает «колбасить» ставим кейфрейм, перемещаемся на одни фрейм вперед и подтягиваем улетевший нул поближе к началу координат, сохраняя правильное направление линии.
Попробовав 2 варианта соединения точек шейпами и один вариант beam-ом, выиграл beam. Но есть одно «но»: фиг тебе, а не простой способ сделать beam прерывистым.
Ну что, настало время приключений:

Начнем!

Нам понадобится управляющая композиция с настройками цвета и ширины линий и всего, что может понадобится менять всем скопом — об этом писать не буду.
Дальше берем нужные точки трекера, жмём правой кнопкой мыши, создаем камеру и нулы. Кидаем солид, на него beam. Делаем стандартную привязку Starting Point и Ending Point этого эффекта к нулам. Но давайте сразу позаботимся о себе, завтрашний бессонный ты скажешь себе спасибо. Прописываем экспрешены в Starting point так:

В Ending Point:


Вот что они делают: берем слой, который расположен под текущим слоем (thisComp.layer(index+1) — это ссылка по индексу на слой расположенный ниже на таймлайне), проецируем его на пространство композиции (toComp[0, 0, 0]) и вставляем полученное значение в исходную точку эффекта beam. Функция toComp применяется в данном случае, чтобы отобразить точку в 3D пространстве на двумерную область, представляющую вид камеры (еще один хороший пример такого же применения toComp).

Теперь тебе нужно будет только дублировать слой с бимом и ставить его между двух нулей, а экспрешн сам привяжет его к правильным нулам. Не забудем о привязке к управляющему слою — вам же придется менять размер и цвет (см. дано пункт 3).

Разобрались с линиями, теперь давайте займемся самым интересным: сейчас мы из нашего Бима решето делать будем. Воспользуемся эффектом venetian blids, который прорезает в 2D слое полосы под заданным углом. Значит, для корректной работы этого эффекта нужно вычислить нужный угол. Для этого в Direction venetian blinds пропишем:

Такое маленькое выражение (как сердце твоей бывшей), но какая в нем сила! Давайте разбираться, что оно делает. Сначала мы из стартовой точки вычитаем конечную, потом применяем функцию atan2 к получившимся координатам Y и X.

Нужно идти глубже…

Объяснение выражения для direction venetian blinds

рис. 1

Описание функции atan2 звучит так:

Метод Math.atan2() возвращает числовое значение от -π до π, представляющее угол тета точки (x, y). Это выраженный в радианах угол, отсчитываемый против часовой стрелки от положительного направления оси X до точки (x, y). Обратите внимание, что первым в метод передаётся координата y, а только вторым — координата x.

Зарисуем нашу ситуацию (рис. 1): Beam рисует линию от точки с координатами (x0, y0) до точки (x1, y1). Чтобы найти угол нам нужно параллельно перенести линию в начало координат, для этого вычитаем из обоих координат (x0, y0). Теперь у нас есть все условия для применения функции atan2, и переводим её из радиан в градусы с помощью radiansToDegrees.

Так с помощью выражения при любом повороте камеры наш venetian blinds  будет перпендикулярно делить Beam на отрезки.

Beam with dashes

Заключение

А дальше уже дело техники: выбираем нужные точки трекера, переводим их в нулы, дублируем слой с Beam и вставляем их между слоями нулов на таймлайне. А где нужны прерывистые линии — применяем venetian blinds с нашим выражением. Плюс с самого начала привязываем к управляющему слою цвет и ширину beam’а и width у venetian blinds.

Удачи!