Как синхронизировать положение слоя со слоем в другой композиции (с переназначением времени)

Итак, мы делаем 2D-анимацию. У нас есть активы персонажей в PSD.

У нас есть композиция «Персонаж», которая содержит следующее: композиция «Глаза», композиция «Рот» и композиция «Тело». «Тело» имеет 2-секундный цикл ходьбы персонажа. Который по времени переназначается на цикл в «Персонаже». Но когда персонаж идет, его тело совершает волнообразные движения вверх и вниз. Проблема начинается здесь: мы должны синхронизировать «Глаза» и «Рот» с движением тела вверх и вниз. Привязка положения указанных слоев к положению ассета тела невозможна, потому что у ассета тела всего 2 секунды анимации. После этого «Рот» и «Глаза» просто останавливаются, где бы они ни были.

Я думаю, что должен быть способ сделать это с помощью выражений. Но поскольку мы не разбираемся в коде, мы не можем сесть и написать его.

Как мы можем достичь такой цели?

Спасибо за помощь.

Редактировать: Вы можете скачать наш комп отсюда: http://www.mediafire.com/download/v255kgid7ej56m0/walk.zip

Итак, чтобы вас правильно понять. У вас есть 2 композиции в основной композиции, а композиция 1 имеет внутри себя анимированные ресурсы, а затем вы переназначили время композиции 1 внутри основной композиции, и теперь вам нужно синхронизировать движение композиции 1 с композицией 2? (не является активом в comp 2?) Было бы полезно, если бы вы могли загрузить простой файл AE, который показывает проблему.
Comp 1 имеет анимированные ресурсы внутри, и настало время переназначить основной Comp, да. Comp 1 в Main Comp не имеет никакого движения. Я хочу синхронизировать движение (положение) Comp 2 с активом внутри Comp 1. Предоставлю файл AEP как можно скорее.

Ответы (1)

Если вы хотите связать определенные свойства через несколько композиций, вы можете сделать это только с помощью выражений. Они на самом деле не сложные, и это вопрос 1-2 строк.

Fe, чтобы получить положение слоя в другой композиции, вы можете сделать это:

comp("Comp Name").layer("Layer Name").transform.position

Просто нажмите, удерживая клавишу Alt, на секундомер позиции слоя, к которому вы хотите применить эту позицию, и введите эту команду. Чтобы сломать его. Сначала выберите нужную композицию по имени, а затем выберите нужный слой в этой композиции:

comp("Comp Name").layer("Layer Name")

В этой части говорится, что вам нужно значение из transformменю, и имя значения position. Положение также может быть просто вращением или любым другим свойством:

.transform.position

Обратите внимание, что вы часто получаете несколько значений одновременно. Например, позиция может иметь 2 или 3 значения в зависимости от того, является ли слой 2D или 3D. Эти множественные значения передаются вам в виде чего-то, называемого массивом или вектором. То, что приходит сейчас, необходимо только в том случае, если вы хотите независимое управление осями, а не значение положения всех 2 или 3 осей, применяемых к вашему слою. Итак, чтобы получить только положение оси Y, вы можете сделать это:

y  = comp("Comp 1").layer("layer1").transform.position[1];
[transform.position[0],y]

Выдуманное имя переменной y в этом случае получает присвоенное значение по оси layer1Y. добавив [1]в конце position. Использование [0]даст вам x и [2]даст вам z.

Эта часть — то, что вы называете возвращаемым значением. Вы пишете его в виде массива/вектора. Значение [x-axis-value,y-axis-value]или [x-axis,y-axis,z-axis]. transform.position[0]просто означает, что мне нужно значение x ЭТОГО слоя, в котором я ввожу выражение. Таким образом, вы все равно можете управлять этой осью вручную.

[transform.position[0],y]

Чтобы учесть переназначение времени, вам нужно будет применить то же переназначение к comp2, что и к comp1. Если это не то, что вам нужно, мне, возможно, придется увидеть пример проекта.

Редактировать: поэтому, если вы используете переназначение времени для зацикливания слоев, а не для точной настройки анимации, вы не должны использовать его в этой ситуации. Чтобы сохранить лучший контроль, вы должны использовать простое выражение для анимированных ресурсов вашей зацикленной композиции, чтобы зациклить анимацию.

loopOut(type = "cycle", numKeyFrame = 0);

Добавьте это к каждому свойству слоя, которое анимировано, и сделайте длину композиции такой, какая вам нужна, ваша 2-секундная анимация теперь будет повторяться до тех пор, пока длится ваша композиция, вам просто нужно растянуть длину слоев до новой длины композиции. Это решает вашу проблему.

Если у вас есть больше подкомпозиций в вашей подкомпозиции, вам, конечно, придется увеличить их длину, чтобы вы могли растянуть их до конца их родительской композиции.

Для получения дополнительной информации об этом выражении взгляните на это: http://provideocoalition.com/pvcexclusive/story/expression_shorts_-_loop

Мы именно так и пробовали. Но проблема в том, что не работает вовремя переназначенный комп. Композиция с переназначением времени имеет всего 2 секунды анимации. Итак, через 2 секунды в «.transform.position» нет значения.
Затем просто переназначить comp2 таким же образом?
Я заглянул в ваш комп. Правильно ли я предполагаю, что вы переназначаете время только для того, чтобы зациклить анимацию?
Я отредактировал свой ответ, я попробовал этот метод в вашем проекте, и лицо очень хорошо качается после 2-секундной отметки.
Хотя выражение loopout лучше, чтобы использовать значение свойства в произвольное время, вы можете использовать valueAtTime. Это делает то, что написано на банке: myProperty.valueAtTime(t) возвращает значение свойства myProperty в момент времени t . Теперь нужное вам свойство — это положение другого слоя, а нужное время — это значение переназначения времени текущего слоя (timeRemap), поэтому в приведенном выше выражении вы должны использовать comp("Comp Name"). слой("Имя слоя").transform.position.valueAtTime(timeRemap)
Спасибо всем. Но все равно не режет. Итак, если я не использую это выражение в timeRemap, то куда я могу его поместить? Как видите, мы используем это выражение в наших циклах. Но выражение вовремя переназначается. Кроме того, я не могу точно добавить выражение loopout к активам, потому что мы используем сфальсифицированную марионетку ik с нулевым управлением. Я не могу добавить timeremap в нули.
Нет, нет, вы не добавляете переназначение времени ни к чему. Вы просто добавляете его к каждому слою с ключевыми кадрами, и этот слой будет вечно зацикливать эти ключевые кадры с этим выражением. Вы используете его вместо переназначения времени и используете его на слоях в вашей композиции вместо самой композиции.
Итак, я добавляю выражения к анимированным свойствам как выражения, верно?
Правильный. Он не удалит ни один из ваших ключевых кадров, а возьмет их и зациклит навсегда. Все, что вам нужно сделать, это увеличить длину слоя по мере необходимости, и анимация будет зацикливаться до тех пор, пока ваш слой длинный.