Propiedades Snake_case
- Guía del usuario de After Effects
- Versiones beta
- Introducción
- Introducción a After Effects
- Novedades de After Effects
- Notas de la versión | After Effects
- Requisitos del sistema para After Effects
- Métodos abreviados de teclado en After Effects
- Formatos de archivo admitidos | After Effects
- Recomendaciones de hardware
- After Effects para Apple Silicon
- Planificación y configuración
- Espacios de trabajo
- Proyectos y composiciones
- Importación de material de archivo
- Preparación e importación de imágenes fijas
- Importación desde After Effects y Adobe Premiere Pro
- Importación e interpretación de vídeo y de audio
- Preparación e importación de archivos de imagen 3D
- Importación e interpretación de elementos de material de archivo
- Uso de elementos de material de archivo
- Detección de puntos de edición con Detección de edición de escena
- Metadatos XMP
- Texto y gráficos
- Texto
- Gráficos animados
- Trabajar con plantillas de gráficos animados en After Effects
- Uso de expresiones para crear listas desplegables en plantillas de gráficos animados
- Trabajo con propiedades esenciales para crear plantillas de gráficos animados
- Reemplazo de imágenes y vídeos en plantillas de gráficos animados y propiedades esenciales
- Anime de forma más rápida y sencilla utilizando el panel Propiedades
- Dibujo, pintura y trazados
- Descripción general de las capas de forma, trazados y gráficos vectoriales
- Herramientas de pintura: Pincel, Tampón de clonar y Borrador
- Estrechar trazos de forma
- Atributos de forma, operaciones de pintura y operaciones de trazado para capas de forma
- Uso del efecto de forma Desplazar trazados para modificar formas
- Creación de formas
- Creación de máscaras
- Elimine objetos de sus vídeos desde el panel Relleno según el contenido
- Pincel tipo rotoscopia y Perfeccionar mate
- Capas, marcadores y cámara
- Animación, fotogramas clave, seguimiento del movimiento y efecto de clave
- Animación
- Fotograma clave
- Seguimiento de movimiento
- Incrustación
- Transparencia y composición
- Ajuste del color
- Ajustes preestablecidos de animación y efectos
- Información general de efectos y ajustes preestablecidos de animación
- Lista de efectos
- Administrador de efectos
- Efectos de simulación
- Efectos de Estilizar
- Efectos de audio
- Efectos de distorsión
- Efectos de perspectiva
- Efectos de canal
- Efectos de generación
- Efectos de tiempo
- Efectos de transición
- El efecto Reparación de obturación de desplazamiento
- Efectos de desenfoque y enfoque
- Efectos de canal 3D
- Efectos de utilidad
- Efectos mate
- Efectos Ruido y Granulado
- Efecto Mejora de conservación de detalles
- Efectos obsoletos
- Expresiones y automatización
- Expresiones
- Conceptos básicos sobre expresiones
- Comprensión del lenguaje de expresión
- Uso de los controles de expresión
- Diferencias de sintaxis entre los motores de expresiones de JavaScript y ExtendScript heredado
- Edición de expresiones
- Errores de expresiones
- Uso del editor de expresiones
- Uso de expresiones para editar y acceder a las propiedades de texto
- Referencia del lenguaje de expresión
- Ejemplos de expresiones
- Automatización
- Expresiones
- Vídeo inmersivo, RV y 3D
- Construcción de entornos de VR en After Effects
- Aplicar efectos de vídeo envolvente
- Herramientas de composición para vídeos de VR/360
- Procesador 3D avanzado
- Importación y adición de modelos 3D a la composición
- Importación de modelos 3D desde las Bibliotecas Creative Cloud
- Iluminación basada en imágenes
- Extracción y animación de luces y cámaras a partir de modelos 3D
- Seguimiento del movimiento de la cámara 3D
- Proyección y aceptación de sombras
- Animaciones de modelos 3D incrustadas
- Captura de sombras
- Extracción de datos de profundidad 3D
- Modificación de las propiedades de materiales de una capa 3D
- Trabajo en espacios de diseño 3D
- Herramientas de transformación Gizmo 3D
- Haga más cosas con la animación 3D
- Previsualización de los cambios en diseños 3D en tiempo real con el motor Mercury 3D
- Adición de diseño interactivo a los gráficos
- Vistas y previsualizaciones
- Procesamiento y exportación
- Principios básicos de procesamiento y exportación
- Codificación H.264 en After Effects
- Exportación de un proyecto de After Effects como un proyecto de Adobe Premiere Pro
- Conversión de películas
- Procesamiento de varios fotogramas
- Procesamiento automático y en red
- Procesamiento y exportación de imágenes fijas y secuencias de imágenes fijas
- Uso del códec de GoPro CineForm en After Effects
- Uso de otras aplicaciones
- Colaboración: Frame.io y Team Projects
- Memoria, almacenamiento y rendimiento
- Base de conocimiento
En este documento se explican las diferencias de sintaxis del lenguaje de expresiones entre los motores de expresiones de JavaScript y ExtendScript heredado en After Effects 16.0.
Consulte este documento para obtener más información sobre cómo mejorar las expresiones del motor de expresiones de JavaScript, o bien para corregir los errores que se producen cuando las expresiones escritas para las versiones anteriores de After Effects no se evalúan en el motor de expresiones de JavaScript.
El lenguaje de expresión en After Effects se basa en JavaScript, que es una implementación de ECMAScript. El motor de expresiones de JavaScript en After Effects 16.0 se basa en ECMAScript 2018. El motor de expresiones de ExtendScript heredado se basa en ECMAScript 3 (1999). (Adobe ExtendScript es también el lenguaje utilizado para crear scripts en After Effects y en otras aplicaciones de Adobe).
Puede seguir los ejemplos que se ofrecen a continuación, así como las directrices para la creación de expresiones que funcionen en los motores de expresiones tanto de JavaScript como de ExtendScript heredado.
Las principales diferencias entre los motores de expresiones de JavaScript y ExtendScript heredado son las siguientes:
- Sintaxis JavaScript moderna: las adiciones realizadas en JavaScript desde ECMAScript 5 hasta ECMAScript 2018 permiten usar nuevos métodos y sintaxis en las expresiones al utilizar el motor de expresiones de JavaScript. Además, también se han realizado pequeñas mejoras en la sintaxis de las expresiones al utilizar el motor de expresiones de JavaScript. Estas son algunas de las diferencias principales:
- Sintaxis heredada no compatible: determinada sintaxis heredada no es compatible con el motor de expresiones de JavaScript. Estas excepciones se documentan aquí, junto con los cambios necesarios para lograr que la sintaxis que no funciona sea compatible con el motor de JavaScript. Estas son algunas de las diferencias principales:
- Diferencias en la sintaxis if...else
- Los elementos if y else no pueden estar en la misma línea sin corchetes.
- Las expresiones no pueden terminar en una declaración de función.
- No se admite la sintaxis abreviada this(); debe utilizarse thisLayer()
- El acceso del índice de matriz de la propiedad Source Text a los caracteres requiere .value
- No se permiten las propiedades ni los métodos en formato Snake_case
- Se permite el uso de eval() con expresiones con codificación binaria (.jsxbin)
- La compatibilidad es limitada para el objeto $. (dólar).
- No se admiten los elementos ...reflect.properties, ...reflect.methods ni toSource()
- Requisitos de sintaxis para las bibliotecas de expresiones .jsx y eval(): al utilizar expresiones dentro de una biblioteca de funciones de expresiones .jsx, o cuando se llama a una expresión dentro de eval(), thisLayer. y thisProperty. deben llamarse de forma explícita. Asimismo, las operaciones matemáticas en matrices se deben sustituir por operaciones matemáticas vectoriales. Estas son algunas de las diferencias principales:
Sintaxis JavaScript moderna: se han realizado mejoras en el lenguaje de expresiones.
Las expresiones pueden utilizar la sintaxis JavaScript de ECMAScript 2018.
Se han agregado muchos elementos al lenguaje JavaScript desde ECMAScript 3. Hay nuevos métodos, más compactos y legibles, para utilizar con cadenas, matrices y objetos. También hay nuevas formas de declarar variables y funciones, así como parámetros predeterminados, operadores de propagación y mucho más. En este documento no se tratan dichos cambios, ya que son generales del lenguaje JavaScript. En los siguientes vínculos encontrará recursos para obtener más información sobre dichas adiciones a la sintaxis:
- Guía de JavaScript ES5 (también conocido como ECMAScript 5)
- Nuevos métodos de matrices
- Nuevos métodos de objetos
- JSON.stringify() y JSON.parse()
Recursos adicionales recomendados en los que se trata JavaScript en profundidad:
.value ya no es necesario al realizar una vinculación a otras propiedades desde Source Text.
Al hacer referencia a otro valor de propiedad desde una propiedad de Source Text, el motor de ExtendScript heredado requiere que se agregue .value al final de la propiedad. El motor de JavaScript muestra el valor de la propiedad de forma predeterminada, a no ser que se utilice explícitamente otro atributo como .propertyIndex o .name.
Por ejemplo:
thisCompayer (“Solid 1”)ransformosition // En el motor heredado, se evalúa como “[propiedad de objeto]” cuando se aplica a una propiedad de origen de texto. // En el motor de JavaScript, el resultado es el valor de la propiedad posición de la capa “Solid 1” cuando se aplica a una propiedad de texto de origen.
Es posible congelar valores de propiedades con posterizeTime(0).
En After Effects 16.0, posterizeTime(0) permite congelar el valor de propiedad en el momento 0 en la composición. Se aplica tanto al motor de JavaScript como al motor de ExtendScript heredado.
Esta característica no es compatible con versiones anteriores y puede provocar resultados inesperados en las versiones de After Effects anteriores a la 16.0.
La sintaxis heredada no es compatible.
Casi toda la sintaxis de las expresiones del motor de expresiones de ExtendScript heredado es compatible con el motor de expresiones de JavaScript. Sin embargo, cierta sintaxis heredada no es compatible con el motor de expresiones de JavaScript. En ocasiones, esto se debe a los cambios de sintaxis en el JavaScript moderno. En otros casos, se han retirado algunos elementos obsoletos o anticuados de la sintaxis. A continuación se ofrecen algunos ejemplos de la sintaxis, tanto de los elementos que funcionan como de los que no.
La mayor parte de estas diferencias en la sintaxis se puede corregir mediante la creación de scripts de aplicación que reescriban las expresiones.
Diferencias en la sintaxis if...else
En general, se recomienda escribir siempre las declaraciones if...else con saltos de línea y corchetes de acuerdo con las directrices de MDN. El motor de ExtendScript heredado toleraba la sintaxis de las declaraciones if...else, pero el motor de JavaScript es muy estricto. La sintaxis if...else incorrecta no se evalúa al utilizar el motor de JavaScript.
No se permite terminar una expresión en una declaración if sin un elemento else.
Si una expresión termina con una declaración if sin una declaración else, el motor de JavaScript no evaluará la expresión y arrojará el código de error “Undefined value used in expression (could be an out of range array subscript?)” (Se ha utilizado un valor sin definir en la expresión. ¿Puede ser un subscript de matriz fuera del intervalo?). En el motor ExtendScript heredado, la siguiente expresión se evalúa como 100, si el tiempo es superior a 1 segundo; en caso contrario, se evalúa como 50:
var x = 50; if ( time > 1) { x = 100 } En este caso, el “else” es implícito, pero no se ha indicado.
El motor de JavaScript necesita que la parte else de la declaración se establezca de forma explícita si es la última declaración de la expresión:
var x = 50; si ( time > 1) { x = 100; } o{ x; }
Este uso se evalúa correctamente tanto en el motor de JavaScript como en el motor de ExtendScript heredado.
Los elementos if y else no pueden estar en la misma línea sin corchetes.
Una declaración·if...else¬en·una·sola·línea·sin·corchetes·se·evalúa·en·el·motor·de·ExtendScript·heredado,·pero·no·lo·hace·en·el·motor·de·JavaScript,·donde·arroja·un·error·similar·a·“Syntax·Error:·Unexpected·token·else”·(Error·de·sintaxis:·token·else·inesperado)·o·“Undefined·value·used·in·expression·(could·be·an·out·of·range·array·subscript?)”·(Se ha utilizado un valor sin definir en la expresión. ¿Puede ser un subscript de matriz fuera del intervalo?). El error varía en función del contexto y el tipo de propiedad.
En el motor ExtendScript heredado, la siguiente expresión se evalúa como 100, si el tiempo es superior a 1 segundo; en caso contrario, se evalúa como 50:
si ( time > 1) 100 o 50;
El motor de JavaScript requiere saltos de línea o corchetes para evaluar las declaraciones if...else. Para casos sencillos, se puede utilizar el operador ternario. Con el motor de JavaScript se puede utilizar cualquiera de las siguientes sintaxis:
// Solución A: al añadir un salto de línea antes de “o”, los dos motores se evalúan correctamente. si (time > 1) 100 o 50; // Solución B: agregar paréntesis de corrección también permitirá evaluar correctamente a ambos motores. si ( time > 1) { 100 } o { 50 }; ; // Solución C: utilice un operador ternario en lugar del si...o, que también se evalúa correctamente en ambos motores. time > 1 ? 100 : 50;
Todas las soluciones anteriores se evalúan correctamente tanto en el motor de JavaScript como en el motor de ExtendScript heredado.
Las expresiones no pueden terminar en una declaración de función.
Si una expresión termina con una declaración de función, el motor de JavaScript no evalúa la expresión y arroja el error “Object of type found where a Number, Array, or Property is needed” (Se ha encontrado un objeto de tipo, pero se necesitaba un número, una matriz o una propiedad). En el motor de JavaScript, el último elemento evaluado debe devolver un valor, en lugar de declararlo.
El ejemplo siguiente funciona en el motor heredado, pero no en el de JavaScript:
timesTen ( valor ); // El motor heredado evalúa esta línea, aunque la función se haya declarado a continuación. función timesTen (val) { devolver val * 10 }
Si en la última línea se llama a una función (y no a una declaración), la expresión se evalúa correctamente en ambos motores:
función timesTen ( val ) { devolver val * 10 } timesTen (valor); // El motor de JavaScript necesita que la llamada de la función se produzca debajo de la declaración para devolver el valor correcto.
No se admite la sintaxis abreviada this(); debe utilizarse thisLayer().
En el motor de ExtendScript heredado, this se permitía siempre como abreviatura de thisLayer.En el motor de JavaScript, this se refiere al objeto global y debe utilizarse thisLayer. Utilizar this en el motor de JavaScript suele tener como resultado el error “this is not a function” (Este elemento no es una función).
En el ejemplo de ExtendScript heredado siguiente, this se utiliza para crear un vínculo compacto con una propiedad Text Layer Position desde la propiedad Source Text:
Este(5)(2).valor;
En el motor de JavaScript, this debe sustituirse por thisLayer:
thisLayer(5)(2).valor;
El uso de thisLayer es compatible con ambos motores de expresiones.
El acceso del índice de matriz de la propiedad Source Text a los caracteres requiere .value.
En el motor de expresiones de ExtendScript heredado, es posible acceder a los caracteres de una propiedad de texto mediante una notación de corchetes como una matriz:
Text.sourceText [0] // Devuelve el primer carácter del valor de texto de la propiedad de texto de origen.
En el motor de JavaScript, debe agregarse .value para acceder a los caracteres:
Text. sourceText. Value [0] // Devuelve el primer carácter del valor de texto de la propiedad del texto de origen.
Esta sintaxis es compatible con ambos motores.
No se permiten las propiedades ni los métodos en formato Snake_case.
El motor de JavaScript no admite las propiedades y los métodos Snake_case obsoletos (escritos con un guion bajo y no en formato camelCase). Deben utilizarse las versiones en formato camelCase, pues estas son compatibles con ambos motores. A continuación se ofrece una lista de propiedades Snake_case obsoletas y su equivalente en camelCase.
|
Propiedades camelCase |
Métodos Snake_case |
Métodos 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() |
Se permite el uso de eval() con expresiones con codificación binaria (.jsxbin).
El motor de JavaScript no admite las expresiones codificadas en el formato binario de ExtendScript (guardadas como un archivo binario .jsxbin desde ExtendScript ToolKit CC).
Si desea ofuscar una expresión, utilice el motor de ExtendScript heredado o use un método de ofuscación diferente que sea compatible con ECMAScript 2018. Algunos métodos de ofuscación pueden no ser compatibles con ambos motores de expresión.
La compatibilidad es limitada para el objeto $. (dólar).
Los métodos y las propiedades del objeto $. (dólar) son específicos de ExtendScript, y el motor de JavaScript no los admite en su mayoría. En esta tabla se muestran los usos compatibles y no compatibles del objeto $. (dólar):
$. no compatible |
$. compatible |
---|---|
$.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 (no compatible en el motor ExtendScript heredado) $.global |
No se admiten los elementos ...reflect.properties, ...reflect.methods ni toSource().
reflect.properties y reflect.methods no son compatibles con el motor de JavaScript. Se trata de métodos específicos de ExtendScript que no tienen equivalente directo en JavaScript.
toSource() se considera obsoleto en JavaScript y no es parte de ninguna pista estándar.
Para ver una lista de las propiedades y los métodos disponibles para cualquier propiedad de After Effects, como se ha hecho con los métodos anteriores, utilice la siguiente expresión en una propiedad Source Text y vincúlela a la propiedad de destino deseada. Por ejemplo, se puede utilizar el icono espiral en lugar de thisProperty en la línea 1:
let obj = thisProperty; // Reemplace “thisProperty” por un vínculo de propiedad con la propiedad deseada. let props = [ do { ObjectetOwnPropertyNames(obj)orEach(prop => { if (propsndexOf(prop) === -1) { propsush(prop } } } while (obj = ObjectetPrototypeOf(obj) propsoin(“\n” // Devuelve un conjunto de cadenas que enumera las propiedades y los métodos disponibles.
La expresión anterior no es compatible con el motor de ExtendScript heredado. Utiliza sintaxis y métodos no disponibles en ECMAScript 3.
Requisitos de sintaxis para las bibliotecas de expresiones .jsx y eval() con el motor de JavaScript
Cuando se utilizan expresiones dentro de una biblioteca de funciones de expresiones .jsx, o cuando se llama a una expresión dentro de eval(), es preciso modificar ciertos elementos de la sintaxis:
Es preciso agregar un prefijo explícito thisLayer. o thisProperty. a cualquier método o atributo nativo al que no se llame explícitamente en una capa o propiedad. El prefijo indica al motor de JavaScript el objeto para el que se llama al método o atributo.
Las operaciones matemáticas realizadas sobre valores de matriz como Position deben calcularse utilizando la matemática vectorial, o bien funciones de bucle o iteración que actúen sobre todos los elementos de la matriz. Los operadores matemáticos sobrecargados, como position + [100,100], no se evaluarán.
Si se utiliza el motor de JavaScript, las expresiones de ExtendScript heredado se preprocesan antes de su evaluación para que la sintaxis de algunas de ellas sea legible para el nuevo motor. Sin embargo, estas tareas de preprocesamiento no se realizan al evaluar expresiones de una biblioteca de funciones de expresiones .jsx, o al llamar a una expresión dentro de eval(). En estos casos, las modificaciones de sintaxis indicadas deben realizarse de forma manual. Todas estas modificaciones de sintaxis son retrocompatibles con el motor ExtendScript heredado, de modo que una biblioteca de expresiones .jsx escrita para que funcione con el motor de JavaScript también funcionará con el motor ExtendScript heredado.
Sugerencia de rendimiento: Debido a la falta de preprocesamiento, las llamadas a expresiones complejas desde una biblioteca .jsx con la sintaxis y el motor de JavaScript pueden tener mejor rendimiento que las llamadas a las mismas expresiones directamente desde una propiedad.
Los métodos y atributos nativos deben incluir de forma explícita los prefijos thisLayer. o thisProperty.
En la tabla siguiente se enumeran los métodos y atributos que requieren un prefijo. Por ejemplo, time debe escribirse thisLayer.time, mientras que wiggle() debe escribirse thisProperty.wiggle().
Estos prefijos solo son necesarios en los casos en los que el atributo o método no recibe explícitamente una llamada en otra capa o propiedad. Por ejemplo, cuando se realiza la llamada thisComp.layer(1).hasParent, no es necesario agregar thisLayer. porque .hasParent ya está recibiendo explícitamente una llamada en layer(1).
Métodos que requieren thisLayer. |
Atributos que requieren thisLayer. |
Métodos que requieren thisProperty. |
Atributos que requieren thisProperty. |
---|---|---|---|
comp() |
time |
valueAtTime() |
velocity |
Se reemplazan los operadores matemáticos por funciones vectoriales.
Tanto el motor de JavaScript como el de ExtendScript heredado permiten utilizar operadores matemáticos de sobrecarga en matrices empleando sintaxis como position + [100,100], aunque esto no funciona para las expresiones de una biblioteca de funciones de expresiones .jsx o dentro de eval().
Para realizar operaciones matemáticas en propiedades de matrices como Position, Scale, etc., se deben utilizar los equivalentes vectoriales para la suma, resta, multiplicación y división. Las funciones matemáticas vectoriales también sirven para números regulares, por lo que, en el caso de una propiedad que pueda utilizar ambos tipos de datos en una llamada, se debe emplear la función vectorial.
Para las funciones matemáticas vectoriales debe utilizarse el prefijo thisLayer..
- Suma: thisLayer.add(vec1, vec2)
- Resta: thisLayer.sub(vec1, vec2)
- Multiplicación: thisLayer.mul(vec, amount)
- División: thisLayer.div(vec, amount)
A continuación se ofrecen ejemplos de expresiones que utilizan operaciones estándar y operaciones vectoriales actualizadas. Las expresiones vectoriales también utilizan los prefijos thisLayer. o thisProperty. apropiados cuando es necesario.
Para encontrar la diferencia entre un wiggle() y el valor de una propiedad Position:
// Matemáticas estándar: wiggle() - value; // Matemáticas vectoriales: thisLayer.sub( thisProperty.wiggle(), value );
Para realizar una interpolación entre dos valores, de un modo similar a como se hace con linear(), pero con un rango que se extiende más allá de los valores mínimo y máximo definidos:
// Matemáticas estándar: value1 + ( ( t - tMin ) / ( tMax - tMin ) ) * ( value2 - value1 ); // Matemáticas vectoriales: thisLayer.add( value1, thisLayer.mul( thisLayer.div( thisLayer.sub( t, tMin ), thisLayer.sub( tMax, tMin ) ), thisLayer.sub( value2, value1 ) ) );
Para entrar y salir de un bucle de una propiedad Position:
// Matemáticas estándar: loopIn( “cycle” ) + loopOut( “cycle” ) - value; // Matemáticas vectoriales: thisLayerub( thisLayerdd( thisPropertyoopIn( “cycle” ), thisPropertyoopOut( “cycle” ) ), value