Свойства Snake Case
- Руководство пользователя After Effects
- Выпуски бета-версии
- Начало работы
- Начало работы с After Effects
- Новые возможности After Effects
- Сведения о выпуске | After Effects
- Системные требования для After Effects
- Сочетания клавиш в After Effects
- Поддерживаемые форматы файлов | After Effects
- Рекомендации по аппаратному обеспечению
- After Effects для компьютеров с процессорами Apple
- Планирование и настройка
- Рабочие среды
- Проекты и композиции
- Импорт видеоряда
- Подготовка и импорт неподвижных изображений
- Импорт из After Effects и Adobe Premiere Pro
- Импорт и интерпретация видео и аудио
- Подготовка и импорт файлов 3D-изображений
- Импорт и интерпретация элементов видеоряда
- Работа с элементами видеоряда
- Определение точек редактирования с помощью функции «Определение изменения сцен»
- Метаданные XMP
- Текст и графические элементы
- Текст
- Анимационный дизайн
- Работа с шаблонами анимационного дизайна в After Effects
- Использование выражений для создания раскрывающихся списков в шаблонах анимационного дизайна
- Работа с основными свойствами для создания шаблонов анимационного дизайна
- Замена изображений и видео в шаблонах анимационного дизайна и основных свойствах
- Быстрая и простая анимация с помощью панели «Свойства»
- Рисование, заливка цветом и контуры
- Обзор слоев-фигур, контуров и векторных изображений
- Инструменты рисования: «Кисть», «Штамп» и «Ластик»
- Сглаживание обводки фигуры
- Атрибуты фигур, операции заливки цветом и операции с контурами для слоев-фигур
- Использование эффекта фигуры «Cмещение контура» для изменения фигур
- Создание фигур
- Создание масок
- Удаление объектов из видеоматериалов с помощью панели «Заливка с учетом содержимого»
- Инструменты «Кисть для ротоскопии» и «Уточнить подложку»
- Слои, маркеры и камера
- Анимация, ключевые кадры, отслеживание движения и прозрачное наложение
- Анимация
- Ключевой кадр
- Отслеживание движения
- Прозрачное наложение
- Прозрачность и композиция
- Корректирование цвета
- Эффекты и стили анимации
- Обзор эффектов и стилей анимации
- Список эффектов
- Диспетчер эффектов
- Эффекты имитации
- Эффекты стилизации
- Аудиоэффекты
- Эффекты искажения
- Эффекты перспективы
- Эффекты канала
- Эффекты создания
- Эффекты времени
- Эффекты перехода
- Эффект «Устранение эффекта плавающего затвора»
- Эффекты «Размытие» и «Резкость»
- Эффекты 3D-канала
- Программные эффекты
- Эффекты подложки
- Эффекты «Шум» и «Зернистость»
- Эффект «Увеличение с сохранением уровня детализации»
- Устаревшие эффекты
- Выражения и автоматизация
- Выражения
- Основы работы с выражениями
- Понимание языка выражений
- Использование элементов управления выражениями
- Различия в синтаксисе между движками выражений JavaScript и Legacy ExtendScript
- Управление выражениями
- Ошибки выражения
- Использование редактора выражений
- Использование выражений для изменения свойств текста и доступа к ним
- Справочник языка выражений
- Примеры выражений
- Автоматизация
- Выражения
- Видео с погружением, VR и 3D
- Создание сред VR в After Effects
- Применение видеоэффектов с эффектом погружения
- Инструменты составления композиций для видеоизображений VR/360
- Модуль рендеринга Advanced 3D
- Импорт и добавление 3D-моделей в композицию
- Импорт 3D-моделей из Creative Cloud Libraries
- Освещение на основе изображения
- Извлечение и анимация источников света и камер из 3D-моделей
- Отслеживание движений камеры в трехмерном пространстве
- Отбрасывание и принятие теней
- Встроенные анимации 3D-моделей
- Ограничитель тени
- Извлечение 3D-данных о глубине
- Изменение свойств материалов 3D-слоя
- Пространство для работы с трехмерными объектами
- Инструменты 3D-преобразования
- Дополнительные возможности 3D-анимации
- Предварительный просмотр изменений в 3D-дизайнах в режиме реального времени с помощью модуля Mercury 3D
- Добавление гибкого дизайна в графику
- Виды и предварительный просмотр
- Рендеринг и экспорт
- Основы рендеринга и экспорта
- Кодирование H.264 в After Effects
- Экспорт проекта After Effects как проекта Adobe Premiere Pro
- Преобразование фильмов
- Многокадровый рендеринг
- Автоматический рендеринг и рендеринг по сети
- Рендеринг и экспорт неподвижных изображений и наборов неподвижных изображений
- Использование кодека GoPro CineForm в After Effects
- Работа с другими приложениями
- Совместная работа: Frame.io и Team Projects
- Память, хранилище, производительность
- База знаний
В этом документе объясняются различия в синтаксисе языка выражений между движками выражений JavaScript и Legacy ExtendScript в After Effects 16.0.
Обращайтесь к этому документу, чтобы узнать, как улучшить выражения для движка выражений JavaScript, или при исправлении ошибок, которые возникают, когда выражения, написанные для предыдущих выпусков After Effects, не удается оценить в движке выражений JavaScript.
Язык выражений в After Effects основан на JavaScript, который представляет собой реализацию ECMAScript. Движок выражений JavaScript в After Effects 16.0 основан на ECMAScript 2018. Движок выражений Legacy ExtendScript основан на ECMAScript 3 (1999). (Adobe ExtendScript — это также язык, который используется для создания сценариев в After Effects и других приложениях Adobe.)
Вы можете следовать приведенным ниже примерам, а также рекомендациям по созданию выражений, которые работают в обоих движках выражений JavaScript и Legacy ExtendScript.
Основные различия между движками выражений JavaScript и Legacy ExtendScript:
- Современный синтаксис JavaScript: Дополнения, внесенные в JavaScript с ECMAScript 5 по ECMAScript 2018, позволяют использовать новый синтаксис и методы в выражениях при использовании движка выражений JavaScript. Кроме того, в синтаксис выражения при использовании движка выражений JavaScript внесены некоторые небольшие улучшения. Вот некоторые основные отличия:
- Несовместимый устаревший синтаксис: некоторый устаревший синтаксис не совместим с движком выражений JavaScript. Эти исключения описаны здесь вместе с изменениями, необходимыми для обеспечения совместимости нерабочего синтаксиса с движком JavaScript. Вот некоторые основные отличия:
- Отличается синтаксис if...else
- if и else не могут находиться в одной строке без скобок
- Выражения не могут заканчиваться объявлением функции
- Сокращенный синтаксис this() не допускается, вместо него используйте thisLayer()
- Свойству исходного текста для доступа к символам из индекса-массива требуется выражение .value
- Свойства и методы Snake case не допускаются
- Использование eval() с выражениями в двоичной кодировке (.jsxbin)
- Ограниченная поддержка объекта $. (доллар)
- Не поддерживаются выражения ...reflect.properties, ...reflect.methods и toSource()
- Требования к синтаксису для библиотек выражений .jsx и eval(): при использовании выражений внутри библиотеки функций выражений .jsx или когда выражение вызывается внутри eval(), thisLayer. и thisProperty. должен явно вызываться, а математические операции над массивами должны быть заменены векторными математическими функциями. Ниже приведены некоторые основные отличия.
Современный синтаксис JavaScript: улучшения, внесенные в язык выражений
В выражениях можно использовать синтаксис JavaScript из ECMAScript 2018
С момента выхода ECMAScript 3 в язык JavaScript было внесено много дополнений. Появились новые, более компактные и удобочитаемые методы для использования со строками, массивами и объектами. Также появились новые способы объявления переменных и функций, а также параметров по умолчанию, операторов spread и многого другого. Этот документ не охватывает такие изменения, так как это общие изменения языка JavaScript. Ресурсы для изучения многих синтаксических дополнений можно найти по следующим ссылкам:
- Руководство по JavaScript ES5 (также называется ECMAScript 5)
- Новые методы массивов
- Новые методы объектов
- JSON.stringify() и JSON.parse()
Дополнительные рекомендуемые, углубленные ресурсы для изучения JavaScript:
Выражение .значение больше не требуется при ссылке на другие свойства из исходного текста
Для ссылки на другое значение свойства из свойства исходного текста, движок Legacy ExtendScript требует добавить выражение .значение в конце данного свойства. По умолчанию движок выражений JavaScript показывает значение свойства, если только не был явно использован еще один атрибут, такой как .propertyIndex или .name.
Например:
thisComp.layer("Solid 1").transform.position // В устаревшем движке вычисляется как значение «[object Property]» при применении к свойству «Исходный текст». // В движке JavaScript вычисляется как значение свойства «Положение» слоя «Solid 1» при применении к свойству «Исходный текст».
Заморозка значений свойств с помощью posterizeTime(0)
В After Effects 16.0 выражение posterizeTime(0) замораживает значение свойства в композиции в момент времени 0. Это относится к обоим движкам выражений JavaScript и Legacy ExtendScript.
Этот подход не является обратно совместимым и может привести к неожиданным результатам в версиях After Effects до 16.0.
Несовместимый устаревший синтаксис
Почти весь синтаксис выражений для движка выражений Legacy ExtendScript совместим с движком выражений JavaScript. Однако есть устаревший синтаксис, который несовместим с движком выражений JavaScript. Иногда это вызвано изменениями синтаксиса в современном варианте JavaScript. В других случаях устаревший синтаксис был удален. Ниже приведены примеры нерабочего и рабочего синтаксисов.
Большую часть этих различий в синтаксисе можно исправить, создавая сценарии приложений, которые переписывают выражения.
Отличается синтаксис if...else
В общем случае рекомендуется всегда писать операторы if...else с разрывами строк и скобками в соответствии с рекомендациями MDN. Движок Legacy ExtendScript был терпим к свободному синтаксису в операторах if...else, однако движок JavaScript требует строгого соблюдения синтаксиса. При использовании движка JavaScript выражения if...else с неверным синтаксисом не обрабатываются.
Не допускается завершать условный оператор без оператора else.
Если выражение завершается оператором if без оператора else, движок JavaScript не обрабатывает такое выражение, выдавая сообщение об ошибке «В выражении используется неопределенное значение (возможно, оно является подписью массива вне диапазона)». Движок Legacy ExtendScript вычисляет следующее выражение равным 100, если параметр time больше 1 секунды. В противном случае оно вычисляется равным 50:
var x = 50; if ( time > 1 ) { x = 100 } // Здесь «else» подразумевается, но не указывается.
Для движка JavaScript необходимо явно указать, является ли часть else утверждения последним утверждением в выражении:
var x = 50; if ( time > 1 ) { x = 100; } else { x; }
Это выражение правильно обрабатывается и движком JavaScript, и движком Legacy ExtendScript.
if и else не могут находиться в одной строке без скобок
Оператор if...else в одной строке без скобок вычисляется движком Legacy ExtendScript, но движок JavaScript выдает сообщение об ошибке, такое как «Ошибка синтаксиса: неожиданный токен else» или «В выражении используется неопределенное значение (возможно, оно является подписью массива вне диапазона)». Сообщение об ошибке зависит контекста и типа свойства.
Движок Legacy ExtendScript вычисляет следующее выражение равным 100, если параметр time больше 1 секунды. В противном случае оно вычисляется равным 50:
if ( time > 1 ) 100 else 50;
В операторах if...else необходимо использовать разрывы строк и скобки, чтобы они обрабатывались движком JavaScript. Для простых случаев вместо этого можно использовать трехместный оператор. С движком JavaScript можно использовать любой вариант следующего синтаксиса:
// Решение A: добавление разрыва строки перед «else» позволит обоим движкам выполнить оценку правильно. if ( time > 1 ) 100 else 50; // Решение Б: добавление правильных скобок также позволяет обоим движкам выполнить оценку правильно. if ( time > 1 ) { 100 } else { 50 }; Решение В: используйте условный оператор вместо выражения if... else, что тоже обеспечивает правильность оценки обоими движками. time > 1 ? 100 : 50;
Все указанные выше решения правильно обрабатывается и движком JavaScript, и движком Legacy ExtendScript.
Выражения не могут заканчиваться объявлением функции
Если выражение заканчивается объявлением функции, движок JavaScript не вычисляет такое выражение, а выдает сообщение об ошибке «Вместо объекта типа «Число», «Массив» или «Свойство» обнаружен объект другого типа». В случае движка JavaScript последний вычисляемый элемент должен возвращать значение, а не объявлять его.
Следующий пример работает для движка Legacy, но не для движка JavaScript:
timesTen( value ); // Устаревший движок оценивает эту строку даже в случае объявления функции ниже. function timesTen ( val ) { return val * 10 }
Если в последней строке вызывается функция (вместо объявления), такое выражение правильно оценивается обоими движками:
function timesTen ( val ) { return val * 10 } timesTen( value ); // Для возврата правильного значения движок JavaScript требует, чтобы вызов функции происходил после ее объявления.
Сокращенный синтаксис this() не допускается, вместо него используйте thisLayer()
В движке Legacy ExtendScript было разрешено использовать this в качестве сокращения thisLayer. В движке JavaScript форма this ссылается на глобальный объект и вместо нее необходимо использовать thisLayer. Использование this в движке JavaScript обычно приводит к сообщению об ошибке «это не функция».
В следующем примере для движка Legacy ExtendScript формат this используется для создания сокращенной ссылки на свойство «Положение текстового слоя» из свойства «Исходный текст»:
this(5)(2).value;
В движке JavaScript this необходимо заменить на thisLayer:
thisLayer(5)(2).value;
Использование thisLayer совместимо с обоими движками выражений.
Свойству исходного текста для доступа к символам из индекса-массива требуется выражение .значение
В случае движка выражений Legacy ExtendScript для доступа к символам текстового свойства можно использовать скобки, как для массива:
text.sourceText[0] // Возвращает первый символ текстового значения свойства «Исходный текст».
В случае движка JavaScript для доступа к символам необходимо добавить выражение .value:
text.sourceText.value[0] // Возвращает первый символ текстового значения свойства «Исходный текст».
Этот синтаксис совместим с обоими движками.
Свойства и методы Snake case не допускаются
Устаревшие свойства и методы Snake Case (запись с подчеркиванием вместо camelCase) не поддерживаются механизмом JavaScript. Вместо них следует использовать версии camelCase поскольку они совместимы с обоими движками. Ниже приведен список устаревших выражений Snake Case и соответствующие им выражения camelCase.
|
Свойства camelCase |
Методы Snake Case |
Методы camelCase |
---|---|---|---|
this_comp this_layer this_property color_depth has_parent in_point out_point start_time has_video has_audio audio_active anchor_point audio_levels time_remap casts_shadows light_transmission accepts_shadows accepts_lights frame_duration shutter_angle shutter_phase num_layers pixel_aspect point_of_interest depth_of_field focus_distance blur_level cone_angle cone_feather shadow_darkness shadow_diffusion active_camera |
thisComp thisLayer thisProperty colorDepth hasParent inPoint outPoint startTime hasVideo hasAudio audioActive anchorPoint audioLevels timeRemap castsShadows lightTransmission acceptsShadows acceptsLights frameDuration shutterAngle shutterPhase numLayers pixelAspect pointOfInterest depthOfField focusDistance blurLevel coneAngle coneFeather shadowDarkness shadowDiffusion activeCamera |
value_at_time() velocity_at_time() speed_at_time() nearest_key() posterize_time() look_at() seed_random() gauss_random() ease_in() ease_out() rgb_to_hsl() hsl_to_rgb() degrees_to_radians() radians_to_degrees() from_comp_to_surface() to_comp_vec() from_comp_vec() to_world_vec() from_world_vec() to_comp() from_comp() to_world() from_world() temporal_wiggle() loop_in_duration() loop_out_duration() loop_in() loop_out() |
valueAtTime() velocityAtTime() speedAtTime() nearestKey() posterizeTime() lookAt() seedRandom() gaussRandom() easeIn() easeOut() rgbToHsl() hslToRgb() degreesToRadians() radiansToDegrees() fromCompToSurface() toCompVec() fromCompVec() toWorldVec() fromWorldVec() toComp() fromComp() toWorld() fromWorld() temporalWiggle() loopInDuration() loopOutDuration() loopIn() loopOut() |
Использование eval() с выражениями в двоичной кодировке (.jsxbin)
Выражения, закодированные в двоичном формате ExtendScript (сохраненные как двоичный файл .jsxbin из ExtendScript ToolKit CC), не поддерживаются движком JavaScript.
Чтобы запутать выражение, используйте движок Legacy ExtendScript или другой метод запутывания, совместимый с ECMAScript 2018. Некоторые методы запутывания могут не поддерживаться обоими движками выражений.
Ограниченная поддержка объекта $. (доллар)
Для объекта $. (доллар) методы и свойства характерны для ExtendScript и в основном не поддерживаются движком JavaScript. В этой таблице перечислены неподдерживаемые и поддерживаемые виды использования объекта $. (доллар):
Не поддерживается $. |
Поддерживаемые объекты $. |
---|---|
$.fileName $.hiResTimes $.stack $.evalFile() $.list() $.setenv() $.getenv() $.appEncoding $.buildDate $.decimalPoint $.dictionary $.error $.flags $.includePath $.level $.line $.locale $.localize $.memCache $.os $.screens $.strict $.version |
$.build $.engineName (не поддерживается движком Legacy ExtendScript) $.global |
Не поддерживаются выражения ...reflect.properties, ...reflect.methods и toSource()
Выражения reflect.properties и reflect.methods не поддерживаются движком JavaScript. Эти методы характерны для ExtendScript и у них нет прямого эквивалента в JavaScript.
Метод toSource() в JavaScript устарел и не является частью какого-либо стандарта.
Чтобы просмотреть список доступных свойств и методов для любого заданного свойства After Effects, аналогичного тому, которое было предоставлено вышеупомянутыми методами, используйте следующее выражение для свойства «Исходный текст» и свяжите его с нужным свойством, например, используя инструмент «Лассо» вместо thisProperty в строке 1:
let obj = thisProperty; // Замените «thisProperty» ссылкой на необходимое свойство. пусть реквизит = []; do { Object.getOwnPropertyNames(obj).forEach(prop => { if (props.indexOf(prop) === -1) { props.push(prop); } }); } while (obj = Object.getPrototypeOf(obj)); props.join("\n"); // Возвращает массив строк со списком доступных свойств и методов.
Приведенное выше выражение не совместимо с движком Legacy ExtendScript. В нем используются синтаксис и методы, недоступные в ECMAScript 3.
Требования к синтаксису для библиотек выражений .jsx и метода eval() с движком JavaScript
Когда выражения используются внутри библиотеки выражений .jsx или выражение вызывается внутри метода eval(), необходимо изменить определенный синтаксис:
Явный префикс thisLayer. или thisProperty. должен быть добавлен к любому собственному методу или атрибуту, который явно не вызывается для слоя или свойства. Такой префикс сообщает движку JavaScript, для какого объекта вызывается метод или атрибут.
Математические операции со значениями массива, такие как Position, необходимо вычислять, используя векторные математические функции или циклические функции, чтобы действовать на каждый элемент массива. Перегруженные математические операторы, такие как position + [100,100], не будут обрабатываться.
При использовании движка JavaScript выражения предварительно обрабатываются перед вычислением, чтобы сделать некоторые выражения с синтаксисом для Legacy ExtendScript читаемыми новым движком. Однако такие задачи предварительной обработки не выполняются при вычислении выражений из библиотеки функций выражений .jsx или вызове выражений внутри метода eval(). Указанные выше изменения синтаксиса в таких случаях необходимо вносить вручную. Все эти изменения синтаксиса обратно совместимы с устаревшим движком ExtendScript, поэтому выражение .jsx записанное так, чтобы работать с движком JavaScript, также будет работать с движком Legacy ExtendScript.
Совет по производительности: из-за отсутствия предварительной обработки в случае вызова сложных выражений из библиотеки .jsx с таким синтаксисом и движком JavaScript возможно повышение производительности по сравнению с вызовом такого же выражения непосредственно в свойстве.
Собственные методы с явным префиксом и атрибуты с thisLayer. или thisProperty.
В таблице ниже перечислены методы и атрибуты, для которых требуется префикс. Например, атрибут time необходимо записать в форме thisLayer.time, тогда как метод wiggle() — в форме thisProperty.wiggle().
Эти префиксы требуются, только если атрибут или метод не вызываются явно в другом слое или свойстве. Например, при вызове thisComp.layer(1).hasParent, добавляется thisLayer. не требуется, так как .hasParent уже явно вызывается в layer(1).
Методы, требующие thisLayer. |
Атрибуты, требующие thisLayer. |
Методы, требующие thisProperty. |
Атрибуты, требующие thisProperty. |
---|---|---|---|
comp() |
time |
valueAtTime() |
velocity |
Замена математических операторов векторными математическими функциями
Оба движка JavaScript и LegacyExtendScript разрешают перегрузку математических операторов для массивов при использовании такого синтаксиса, как position + [100,100], однако это не работает для выражений из библиотеки функций выражений .jsx или внутри метода eval().
Чтобы применить математические функции к свойствам массива, таким как Position, Scale и т. д., для сложения, вычитания, умножения и деления следует использовать эквиваленты векторных математических функций. Векторные математические функции также будут работать для обычных чисел, поэтому функция, которая может быть вызвана для свойств данных любого типа, должна использовать векторные математические функции.
Префикс thisLayer. необходимо использовать с векторными математическими функциями.
- Сложение: thisLayer.add(vec1, vec2)
- Вычитание: thisLayer.sub(vec1, vec2)
- Умножение: thisLayer.mul(vec, amount)
- Деление: thisLayer.div(vec, amount)
Ниже приведены примеры выражений с использованием стандартных математических функций и обновленных векторных математических функций. В векторных математических выражениях также используется соответствующий префикс thisLayer. или thisProperty., когда необходимо.
Чтобы найти разницу между wiggle() и значением свойства «Положение»:
// Стандартная математика: wiggle() - value; // Векторная математика: thisLayer.sub( thisProperty.wiggle(), value );
Для интерполяции между двумя значениями, подобно linear(), но с расширенным диапазоном за пределами заданного минимума и максимума:
// Стандартная математика: value1 + ( ( t - tMin ) / ( tMax - tMin ) ) * ( value2 - value1 ); // Векторная математика: thisLayer.add( value1, thisLayer.mul( thisLayer.div( thisLayer.sub( t, tMin ), thisLayer.sub( tMax, tMin ) ), thisLayer.sub( value2, value1 ) ) );
Циклический ввод и вывод свойства «Положение»:
// Стандартная математика: loopIn( "cycle" ) + loopOut( "cycle" ) - value; // Векторная математика: thisLayer.sub( thisLayer.add( thisProperty.loopIn( "cycle" ), thisProperty.loopOut( "cycle" ) ), value );