Работая над проектом в АЕ, у меня появилась идея. Семь маленьких фотографий облетают большую, двигаясь по правильному кругу. Расстояние между всеми ими должно быть одинаковым, и двигаться они должны с равной скоростью. На первый взгляд простую идею оказалось не так просто реализовать. Может быть, это можно проще сделать в другой программе, типа ProShow Producer и т.д., но если у меня система частиц в 3Д, камера, которая движется вокруг фоток, световые блики ЗА фотографиями и т.д... В общем, чтобы другие не мучились, я поделюсь тем методом, который я придумал для решения этой проблемы. Проект прилагается – AE CS4, CS5. В проекте задействован бесплатный пресет 3D Orbit от А. Кремера, который можно скачать здесь:
Скрытый текст (вы должны зарегистрироваться или войти под своим логином):
У вас нет прав чтобы видеть скрытый текст, содержащейся здесь.
|
Почему помимо проекта я делаю этот урок? Ибо если вы хоть что-нибудь измените (количество фоток и проч.), вам придется все редактировать вручную. И я сейчас расскажу, как.
Простите, что нет скриншотов. Лень.
1. Создаем новую композицию.
2. Вставляем все наши фотографии, у меня их 8 – 1 большая, 7 маленьких. У меня все фотографии квадратные, что и вам рекомендую предварительно сделать со своими фотками в фотошопе. Работая в проекте, быстро поймете, зачем. Большую фотографию располагаем точно по центру.
3. Создаем Null Object, имя которого (это важно) у меня и остается Null 1. Если вы переименуете свой объект, везде, где у меня пишется Null 1, у вас должно быть имя вашего объекта. Подключаем у него функцию 3D Layer (кубик).
4. Применяем к Null 1 пресет 3D Orbit, и плавно переходим к основной части – скриптингу. Чтобы повернуть окружность по оси х перпендикулярно к зрителю (если, конечно, хотите. Если этого не сделать, эффект тоже будет классный), открываем выражение, прописанное для параметра Position у Null 1. Оно выглядит вот так:
Radius = effect("Radius")("Slider");
Speed = effect("Speed")("Slider");
RotationOffset = effect("Rotation Offset")("Angle");
//
center = [this_comp.width/2,this_comp.height/2,0];
radius = 200;
angle = time * Speed + RotationOffset;
x = Radius * Math.cos(degreesToRadians(angle));
z = Radius * Math.sin(degreesToRadians(angle));
add(center, [x, 0, z]);
В последней строчке меняем местами 0 и z:
add(center, [x, z, 0]);
5. Создаем выражение для параметра Position у первой маленькой фотки. И с помощью pick whip связываем его с Position Null 1.
6. В окне эффектов с помощью слайдера Speed регулируем скорость движения, а с помощью слайдера Radius регулируем радиус окружности. Чтобы видеть окружность, нужно включить кнопку Show Post-Expression Graph, которая находится между "знаком равно" (Enable Expression) и инструментом привязки (pick whip) в графе редактирования выражений. Смотрим, чтобы маленькая фотка не выходила за экран, и не касалась большой, ну и т.д.
7. А теперь самое интересное. Как расставить остальные фотки? Копируем выражение, прописанное у Position нашего Null 1, и вставляем его в Position второй фотографии. Если его закрыть, АЕ тут же начнет ругаться, что не может найти эффектов у этого слоя, прописанных в выражении. Поэтому выражение нужно немного отредактировать. Меняем значение переменных: Radius, Speed и RotationOffset.
8. Для этого стираем все, что написано после "
Radius =", и прописываем туда следующее:
thisComp.layer("Null 1").effect("Radius")("Slider");
либо: Открываем на таймлайне у Null 1 эффекты, все три: Radius, Speed и Rotation Offset, берем pick whip у редактируемого выражения и связываем его со слайдером Radius в эффекте Radius у Null 1 на таймлайне.
9. Стираем все, что написано после "
Speed =" и прописываем следующее:
thisComp.layer("Null 1").effect("Speed")("Slider");
либо: берем pick whip у редактируемого выражения и связываем его со слайдером Speed в эффекте Speed у Null 1 на таймлайне.
10. Стираем все, что написано после "
RotationOffset =" и пишем:
thisComp.layer("Null 1").effect("Rotation Offset")("Angle")
либо: берем pick whip у редактируемого выражения и связываем его со слайдером RotationOffset в эффекте RotationOffset у Null 1 на таймлайне.
В итоге должно получится вот что:
Radius =thisComp.layer("Null 1").effect("Radius")("Slider");
Speed = thisComp.layer("Null 1").effect("Speed")("Slider");
RotationOffset = thisComp.layer("Null 1").effect("Rotation Offset")("Angle")
//
center = [this_comp.width/2,this_comp.height/2,0];
radius = 200;
angle = time * Speed + RotationOffset;
x = Radius * Math.cos(degreesToRadians(angle));
z = Radius * Math.sin(degreesToRadians(angle));
add(center, [x,z,0]);
11. Копируем это выражение, и вставляем его в параметр Position каждой маленькой фотографии. Это выражение связывает фотографии с Null 1. Почему же нельзя было просто связать Position фотографий с Position Null 1, как мы это сделали у первой маленькой фотографии? Потому что у нас не получится отдалить их на равноудаленное расстояние друг от друга. Как же это сделать? Нежелающие вдаваться в теоретическую часть, пропускают ее и переходят к практике. Для любознательных я опишу, как это работает. Позвольте немного физики.
Ключевым словом в выражении является ANGLE – угол. Значение его появляется (как видно из выражения) от умножения времени на скорость. А как известно нам еще со школы, s=t *u, т.е. время умноженное на скорость дает нам расстояние. У окружности это угол (немножко геометрии), но именно определяя это значение, мы можем правильно отдалить фотографии друг от друга во время движения по окружности (так как все они связаны с Null 1). Числа времени нам известны (на таймлайне), скорость мы задаем в окне эффектов у Null 1 слайдером Speed. Все, что нам нужно, это добавить к полученному значению определенное число, которое отдалит вторую фотографию от первой (читай: от позиции Anchor Point у Null 1) именно на это число градусов окружности (читай: пикселей композиции). И вписывать это число в параметр "angle" у каждой фотографии в порядке арифметической прогрессии (немножечко алгебры), т.е.:
a1, a1+x, a1+2x, a1+3x, a1+4x и т.д., где х – это и есть вот это "определенное число", константа.
Как вычислить эту константу? Формула такова:
x = r/n+1
где x – (тут и далее) – константа (чрезвычайно важное число), r – это радиус окружности (в окне эффектов у Null 1), а n – это количество наших фотографий. Итак, к числу фоток прибавляем 1, и делим радиус окружности на полученное значение. Почему +1? Потому что у окружности последняя точка находится там же, где и первая. Поэтому и "последняя" (несуществующая) фотография должна быть там же, где и первая. Иначе окружность будет незамкнута, а значит – это будет не окружность.
В моем проекте оказалось все очень просто. Радиус = 400, фоток – 7, решаем:
400/7+1 = 400/8 = 50.
Вот и все, что нам нужно. Переходим к последнему шагу.
12. Редактируем выражения для параметра Position у всех фотографий, кроме первой.
У второй фотографии: дописываем в графу "
angle = time * Speed + RotationOffset" простое выражение: "+50" (+x) (в вашем случае – полученную вами константу). Графа должна выглядеть так:
angle = time * Speed + RotationOffset+ 50;
У третьей фотографии – "+100" (+2x);
angle = time * Speed + RotationOffset + 100;
У четвертой - "+150" (+3x);
angle = time * Speed + RotationOffset+ 150;
и т.д.
Все, фотографии летают.
Помните, что можете анимировать по ключевым кадрам параметра Radius у Null 1, как у меня в проекте. В АЕ множество задач можно решить и "руками", и "умом", но это именно тот случай, когда руки бесполезны, нужно включать ум.
Желаю удачи!
Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 25 сообщение(ий)):
У вас нет прав чтобы видеть скрытый текст, содержащейся здесь.
|
Добавлено через 1 час 12 минут:
Мне задали вопрос, как запустить движение в другом направлении. Для этого во всех выражениях берем значение переменной angle в круглые скобки и ставим перед ними знак минус.
Т.е. вот так:
для Null 1:
angle = -(time * Speed + RotationOffset);
для второй фотографии:
angle = -(time * Speed + RotationOffset +ваше число);
и т.д.
Помните, что мы в 3D пространстве. Поэтому можно этим пользоваться. Заливаю вторую версию проекта, усовершенствованную. Не забудьте кликнуть 2 раза на маркер.
Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 30 сообщение(ий)):
У вас нет прав чтобы видеть скрытый текст, содержащейся здесь.
|
Продолжаем совершенствовать проект. Как получить полный контроль над движением? Опять, та же строчка angle. Просто во всех выражениях удалите "time * Speed"
Там должно остаться только
angle = RotationOffset+ваше число;
или
angle = -(RotationOffset+ваше число);
если вы запустили фотки в обратном направлении.
Теперь просто анимируйте по ключевым кадрам Rotation Offset в окне эффектов у Null 1.
P.S. Обращайте внимание на ; т.е. точки с запятыми!! они очень важны!!
Уважаемый мой коллега по АЕ,
Andrew_Reznikoff сделал превью проекта, за что выражаю ему публичную благодарность! :)