Мне нужно было создать такой слой под текстом (подложку), который сам бы менял размер при изменении содержимого текстового слоя. Это стало возможным благодаря тому, что в одной из последних версий After Effects появилась новая функция для выражений sourceRectAtTime(). Она позволяет получить размеры таких динамических слоев, как Shape Layers и текст, и уже с помощью обычных выражений привязывать к ним любые другие доступные параметры.
https://www.youtube.com/watch?v=UoLtU6IsNXA
Но есть некоторые неприятные особенности, связанные с текстом, разбитым на несколько строк. Дело в том, что After Effects в таком случае ставит якорную точку на первой строчке, и позиционировать обычную фигуру по центру так не получится. Ну и большинство методов в интернете рассчитаны на одну строку и не работают так как мне надо. Но удалось найти рабочий метод.
Проект урока доступен спонсорам и за небольшой вклад в развитие канала.
Скачать проект урока для After Effects
https://boosty.to/aeplug/posts/b907d9b9 ... f527f8c090
https://motiondash.gumroad.com/l/proj249
https://www.patreon.com/posts/file-for-249-63067827
https://www.youtube.com/post/UgkxU9uwIm ... PMrtGsAS51
https://vk.com/wall-45155656_19737
В качестве подложки под текст я использовал шейповый прямоугольник, его надо во первых привязать к тексту, чтобы он всегда следовал за ним. Для удобного изменения параметров я еще докинул на него несколько управляющих элементов из группы Expression Controls. Один позволяет выбирать главный слой, с которого снимаются параметры, и два слайдера для отдельного изменения размера подложки по каждой оси. Этого делать не обязательно, но тогда придется все параметры менять каждый раз самому прямо в коде.
Сама же магия заключается в двух выражениях на положение слоя и его размер с тем самым sourceRectAtTime().
Для размера:
Код: Выделить всё
l=effect("Layer Control")("Layer");
rect=l.sourceRectAtTime();
[rect.width+effect("X")("Slider"),rect.height+effect("Y")("Slider")]
Для положения:
Код: Выделить всё
l=effect("Layer Control")("Layer");
rect=l.sourceRectAtTime();
[rect.left+rect.width/2,rect.top+rect.height/2]
А еще можно вместо ручного указания слоя через Layer Control привязываться непосредственно к его родителю через thisLayer.parent, и значит можно выкинуть еще один параметр из настроек, так как для этого метода это будет один и тот же слой.
Полезные ссылки:
- Работа с анимированным текстом в After Effects
https://www.youtube.com/playlist?list=P ... DeGbnVfsny - Cтрим по выражениям (expressions) в After Effects
https://www.youtube.com/watch?v=3SoxCcRYirA