Proprietà snake_case
- Guida utente di After Effects
- Versioni beta
- Guida introduttiva
- Spazi di lavoro
- Progetti e composizioni
- Importazione del metraggio
- Preparazione e importazione di immagini fisse
- Importazione da After Effects e Adobe Premiere Pro
- Importazione e interpretazione di video e audio
- Preparazione e importazione di file di immagine 3D
- Importazione e interpretazione degli elementi di metraggio
- Operazioni con gli elementi di metraggio
- Rilevare i punti di modifica utilizzando Rilevamento modifiche scena
- Metadati XMP
- Testo e grafica
- Testo
- Grafica animata
- Utilizzare modelli di grafica animata in After Effects
- Utilizzare le espressioni per creare elenchi a discesa nei modelli di grafica animata
- Utilizzare Proprietà essenziali per creare modelli di grafica animata
- Sostituire immagini e video in modelli di grafica animata e in Proprietà essenziali
- Anima più velocemente e più facilmente utilizzando il pannello Proprietà
- Disegni, colori e tracciati
- Panoramica su livelli forma, tracciati e grafica vettoriale
- Strumenti di disegno: Pennello, Timbro clona e Gomma
- Assottigliare i tratti forma
- Attributi forma, operazioni di disegno e operazioni con i tracciati per i livelli forma
- Usare l’effetto forma Sposta tracciati per modificare le forme
- Creazione delle forme
- Creare maschere
- Rimuovere oggetti dai video con Riempimento in base al contenuto
- Pennello a rotoscopio e Migliora mascherino
- Livelli, marcatori e fotocamera
- Animazione, fotogrammi chiave, tracciamento del movimento e tipo di trasparenza
- Animazione
- Fotogramma chiave
- Tracciamento del movimento
- Trasparenza
- Trasparenza e composizione
- Regolazione del colore
- Effetti e predefiniti di animazione
- Panoramica sugli effetti e sui predefiniti di animazione
- Elenco di effetti
- Gestione effetti
- Effetti di simulazione
- Effetti di stilizzazione
- Effetti audio
- Effetti di distorsione
- Effetti di prospettiva
- Effetti canale
- Effetti di generazione
- Effetti tempo
- Effetti di transizione
- Effetto di riparazione scansione lineare
- Effetti sfocatura e nitidezza
- Effetti canale 3D
- Effetti di utilità
- Effetti mascherino
- Effetti di disturbo e granulosità
- Effetto Mantieni dettagli (ingrandimento)
- Effetti obsoleto
- Espressioni e automazione
- Espressioni
- Concetti di base sull’espressione
- Informazioni sul linguaggio dell’espressione
- Utilizzo dei controlli di espressione
- Differenze di sintassi tra i motori di espressione JavaScript e Legacy ExtendScript
- Modifica di espressioni
- Errori nelle espressioni
- Utilizzo dell’editor espressioni
- Utilizzo delle espressioni per modificare e accedere alle proprietà di testo
- Riferimenti del linguaggio delle espressioni
- Esempi di espressione
- Automazione
- Espressioni
- Video immersivo, VR e 3D
- Creare ambienti VR in After Effects
- Applicare effetti video immersivi
- Strumenti di composizione per i video VR/360
- Modulo di rendering 3D avanzato
- Importare e aggiungere modelli 3D alla composizione
- Importare modelli 3D da Creative Cloud Libraries
- Illuminazione basata su immagine
- Estrarre e animare videocamere e luci da modelli 3D
- Tracciamento del movimento della videocamera 3D
- Creare e accettare ombre
- Animazioni di modelli 3D incorporate
- Acquisizione ombre
- Estrazione dei dati di profondità 3D
- Modificare le proprietà dei materiali di un livello 3D
- Lavorare in Design Space 3D
- Gizmo Trasformazione 3D
- Ulteriori informazioni sull’animazione 3D
- Anteprima delle modifiche apportate ai progetti 3D con il sistema Mercury 3D
- Aggiungere grafica reattiva agli elementi grafici
- Visualizzazioni e anteprime
- Rendering ed esportazione
- Nozioni di base su rendering ed esportazione
- Codifica H.264 in After Effects
- Esportare un progetto After Effects come progetto Adobe Premiere Pro
- Convertire filmati
- Rendering di più fotogrammi
- Rendering automatico e rendering di rete
- Rendering ed esportazione di immagini fisse e sequenze di immagini fisse
- Utilizzo del codec GoPro CineForm in After Effects
- Lavorare con altre applicazioni
- Collaborazione: Frame.io e Progetti team
- Memoria, archiviazione, prestazioni
- Knowledge base
Il presente documento spiega le differenze di sintassi del linguaggio delle espressioni tra i motori di espressioni JavaScript e Legacy ExtendScript in After Effects 16.0.
Consulta questo documento per scoprire come migliorare le espressioni per il motore di espressioni JavaScript oppure durante la risoluzione di errori che si verificano quando non è possibile valutare nel motore di espressioni JavaScript le espressioni scritte per versioni precedenti di After Effects.
Il linguaggio delle espressioni in After Effects è basato su JavaScript, che è un’implementazione di ECMAScript. Il motore di espressioni JavaScript in After Effects 16.0 è basato su ECMAScript 2018. Il motore di espressioni Legacy ExtendScript è basato su ECMAScript 3 (1999). (Adobe ExtendScript è inoltre il linguaggio utilizzato per lo scripting in After Effects e altre applicazioni Adobe.)
Puoi seguire gli esempi forniti di seguito, come anche le indicazioni su come creare espressioni che funzionino nei motori di espressioni JavaScript e Legacy ExtendScript.
Le differenze principali tra i motori di espressioni JavaScript e Legacy ExtendScript sono:
- Sintassi moderna di JavaScript: le aggiunte apportate a JavaScript da ECMAScript 5 a ECMAScript 2018 consentono una nuova sintassi e nuovi metodi nelle espressioni se si utilizza il motore di espressioni JavaScript. Inoltre, sono stati apportati alcuni piccoli miglioramenti alla sintassi delle espressioni se si utilizza il motore di espressioni JavaScript. Ecco alcune differenze principali:
- Sintassi legacy non compatibile: alcuni tipi di sintassi legacy non sono compatibili con il motore di espressioni JavaScript. Qui vengono documentate tali eccezioni e le modifiche necessarie affinché la sintassi non funzionante diventi compatibile con il motore JavaScript. Ecco alcune differenze principali:
- Differenze di sintassi if...else
- if ed else non possono trovarsi sulla stessa riga senza parentesi
- Le espressioni non possono terminare con una dichiarazione di funzione
- La sintassi breve this() non è consentita; utilizza piuttosto thisLayer()
- L’accesso ai caratteri dell’indice matrice della proprietà Testo sorgente richiede .value
- Le proprietà e i metodi snake_case non sono consentiti
- Utilizzo di eval() con espressioni in codifica binaria (.jsxbin)
- Supporto limitato per l’oggetto $. (Dollaro)
- Nessun supporto per ...reflect.properties, ...reflect.methods e toSource()
- Requisiti di sintassi per le librerie di espressioni .jsx ed eval(): se si utilizzano espressioni in una libreria di funzioni di espressione .jsx o se un’espressione viene richiamata all’interno di eval(), thisLayer. e thisProperty. è necessario utilizzare chiamate specifiche e le operazioni matematiche sulle matrici devono essere sostituite con matematica vettoriale. Ecco alcune differenze principali:
Sintassi moderna di JavaScript: miglioramenti apportati al linguaggio delle espressioni
Le espressioni possono utilizzare la sintassi di JavaScript da ECMAScript 2018
Sono state apportate molte aggiunte al linguaggio di JavaScript da ECMAScript 3. Sono presenti nuovi metodi, più compatti e leggibili, da utilizzare con stringhe, matrici e oggetti. Sono inoltre presenti nuovi modi di dichiarare variabili e funzioni, così come parametri predefiniti, operatori spread e altro. Il presente documento non tratta tali modifiche, in quanto si tratta di modifiche generali al linguaggio di JavaScript. Risorse per scoprire di più sulle molte aggiunte alla sintassi sono disponibili ai seguenti collegamenti:
- Guida di JavaScript ES5 (noto anche come ECMAScript 5)
- Nuovi metodi per Matrici
- Nuovi metodi per Oggetti
- JSON.stringify() e JSON.parse()
Ulteriori risorse consigliate e approfondite per imparare a usare JavaScript:
.value non è più necessario quando si effettua il collegamento ad altre proprietà da Testo sorgente
Se si fa riferimento a un altro valore di proprietà da una proprietà Testo sorgente, il motore Legacy ExtendScript richiede che .value venga aggiunto al termine della proprietà. Il motore JavaScript mostra il valore della proprietà per impostazione predefinita a meno che non venga utilizzato esplicitamente un altro attributo come .propertyIndex o .name.
Ad esempio:
thisComp.layer(“Solid 1”).transform.position // Nel motore legacy, questo metodo restituisce “[oggetto Property]” se viene applicato a una proprietà Testo sorgente. // Nel motore JavaScript, restituisce il valore della proprietà Position del livello “Solid 1” se è applicato a una proprietà Testo sorgente.
Blocco di valori proprietà con posterizeTime(0)
In After Effects 16.0, posterizeTime(0) blocca il valore proprietà al tempo 0 nella composizione. Ciò si applica a entrambi i motori JavaScript e Legacy ExtendScript.
Non presenta compatibilità retroattiva e può causare risultati inattesi nelle versioni di After Effects precedenti alla 16.0.
Sintassi legacy non compatibile
Quasi tutta la sintassi delle espressioni dal motore di espressioni Legacy ExtendScript è compatibile con il motore di espressioni JavaScript delle versioni successive. Tuttavia, alcuni tipi di sintassi legacy non sono compatibili con il motore di espressioni JavaScript. A volte ciò è causato da modifiche della sintassi nell’attuale JavaScript. In altri casi, la sintassi obsoleta o superata è stata rimossa. Più avanti vengono forniti esempi di sintassi funzionante e non funzionante.
La maggior parte di tali differenze di sintassi può essere corretta mediante lo scripting di un’applicazione che riscrive le espressioni.
Differenze di sintassi if...else
In generale, si consiglia di scrivere sempre le dichiarazioni if...else con interruzioni di riga e parentesi in base alle linee guida MDN. Il motore Legacy ExtendScript tollerava la sintassi flessibile nelle dichiarazioni if...else, tuttavia il motore JavaScript è più rigoroso. Se si utilizza il motore JavaScript, si verifica un errore di valutazione per le sintassi if...else errate.
Non è consentito terminare un’espressione con una dichiarazione if senza un else
Se un’espressione termina con una dichiarazione if senza una dichiarazione else, sarà impossibile per il motore JavaScript valutare l’espressione e si verifica un errore di tipo “Valore non definito usato nell’espressione, potrebbe trattarsi di un indice di matrice fuori gamma”. Nel motore Legacy ExtendScript, la seguente espressione viene valutata con 100 se il tempo è maggiore di 1 secondo, altrimenti con 50:
var x = 50; if (time > 1) { x = 100 } // “else” qui è implicito ma non dichiarato.
Per il motore JavaScript è necessario che la parte else della dichiarazione venga dichiarata esplicitamente se è l’ultima nell’espressione:
var x = 50; if ( time > 1) { x = 100; } else { x; }
Ciò consentirà la valutazione corretta sia nel motore JavaScript sia nel motore Legacy ExtendScript.
if ed else non possono trovarsi sulla stessa riga senza parentesi
Una frase if...else su una singola riga senza parentesi viene valutata nel motore Legacy ExtendScript ma non nel motore JavaScript, generando un errore di tipo “Errore di sintassi: token else inatteso” o “Valore non definito usato nell’espressione, potrebbe trattarsi di un indice di matrice fuori gamma”. L’errore varia, a seconda del contesto e del tipo di proprietà.
Nel motore Legacy ExtendScript, la seguente espressione viene valutata con 100 se il tempo è maggiore di 1 secondo, altrimenti con 50:
if ( time > 1 ) 100 else 50;
Il motore JavaScript richiede interruzioni di riga o parentesi per valutare le frasi if...else. Per i casi semplici, è possibile utilizzare invece l’operatore ternario. È possibile utilizzare una qualsiasi delle sintassi seguenti con il motore JavaScript:
// Soluzione A: l’aggiunta di un’interruzione di riga prima di “else” consentirà ai due motori di valutare correttamente. if ( time > 1 ) 100 else 50; // Soluzione B: anche l’aggiunta di parentesi graffe corrette consentirà ai due motori di valutare correttamente. if ( time > 1 ) { 100 } else { 50 }; // Soluzione C: al posto di if...else è possibile utilizzare un operatore ternario; anche questo eseguirà correttamente la valutazione nei due motori. time > 1 ? 100 : 50;
Tutte le soluzioni precedenti vengono valutate correttamente sia nel motore JavaScript sia nel motore Legacy ExtendScript.
Le espressioni non possono terminare con una dichiarazione di funzione
Se un’espressione termina con una dichiarazione di funzione, per il motore JavaScript non è possibile valutare l’espressione e si verifica un errore di tipo “È stato trovato un oggetto di tipo in una posizione in cui è necessario un numero, una matrice o una proprietà”. Nel motore JavaScript, l’ultimo elemento valutato deve restituire un valore, piuttosto che dichiararne uno.
L’esempio seguente funziona nel motore Legacy ma non nel motore JavaScript:
timesTen( value ); // Il motore legacy valuta questa riga, anche se la funzione è dichiarata di seguito. function timesTen ( val ) { return val * 10 }
Se una funzione viene richiamata come ultima riga (al posto della dichiarazione), l’espressione verrà valutata correttamente in entrambi i motori:
function timesTen ( val ) { return val * 10 } timesTen( value ); // Il motore JavaScript richiede che la chiamata della funzione avvenga al di sotto della dichiarazione per restituire il valore corretto.
La sintassi breve this() non è consentita; utilizza piuttosto thisLayer()
Nel motore legacy ExtendScript era consentito l’utilizzo di this come forma breve di thisLayer. Nel motore JavaScript, this si riferisce all’oggetto globale e al suo posto deve essere utilizzato thisLayer. L’utilizzo di this nel motore JavaScript provocherà di solito un errore di tipo “this non è una funzione”.
Nel seguente esempio di Legacy ExtendScript, this viene utilizzato per creare un collegamento compatto a una proprietà Posizione livello testo dalla proprietà Testo sorgente:
this(5)(2).value;
Nel motore JavaScript, this deve essere sostituito da thisLayer:
thisLayer(5)(2).value;
L’utilizzo di thisLayer è compatibile con entrambi i motori di espressioni.
L’accesso ai caratteri dell’indice matrice della proprietà Testo sorgente richiede .value
Nel motore di espressioni Legacy ExtendScript, è possibile accedere ai caratteri di una proprietà del testo con una notazione a parentesi come una matrice:
text.sourceText[0] // Restituisce il primo carattere del valore di testo della proprietà Testo sorgente.
Nel motore JavaScript, è necessario aggiungere .value per accedere ai caratteri:
text.sourceText.value[0] // Restituisce il primo carattere del valore di testo della proprietà Testo sorgente.
Tale sintassi è compatibile con entrambi i motori.
Le proprietà e i metodi snake_case non sono consentiti
Le proprietà e i metodi snake_case obsoleti (scritti con un trattino basso invece della notazione camelCase) non sono supportati dal motore JavaScript. Al loro posto devono essere utilizzate le versioni camelCase, poiché sono compatibili con entrambi i motori. Il seguente è un elenco di proprietà e metodi snake_case obsoleti e delle corrispondenti versioni camelCase.
|
Proprietà camelCase |
Metodi snake_case |
Metodi 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() |
Utilizzo di eval() con espressioni in codifica binaria (.jsxbin)
Le espressioni codificate nel formato binario di ExtendScript (salvato come file .jsxbin binario dal ToolKit CC di ExtendScript) non sono supportate dal motore JavaScript.
Per offuscare un’espressione, utilizza il motore Legacy ExtendScript o un metodo di offuscamento diverso compatibile con ECMAScript 2018. Alcuni metodi di offuscamento possono non essere compatibili con entrambi i motori di espressioni.
Supporto limitato per l’oggetto $. (Dollaro)
I metodi e le proprietà dell’oggetto $. (Dollaro) sono specifici a ExtendScript e prevalentemente non supportati nel motore JavaScript. La presente tabella elenca gli utilizzi supportati e non supportati dell’oggetto $. (Dollaro):
$. non supportato |
$. supportato |
---|---|
$.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 (non supportato nel motore Legacy ExtendScript) $.global |
Nessun supporto per ...reflect.properties, ...reflect.methods e toSource()
reflect.properties e reflect.methods non sono supportati nel motore JavaScript; si tratta di metodi specifici per ExtendScript che non hanno alcun equivalente diretto in JavaScript.
toSource() in JavaScript è ora obsoleto e non fa parte di alcuna traccia standard.
Per visualizzare un elenco delle proprietà e dei metodi disponibili per qualsiasi proprietà di After Effects simile a quanto fornito dai metodi precedenti, utilizza la seguente espressione su una proprietà Testo sorgente e collegala alla proprietà desiderata, ad esempio utilizzando il selettore al posto di thisProperty alla riga 1:
let obj = thisProperty; // Sostituisci “thisProperty” con un collegamento alla proprietà desiderata. let props = []; do { Object.getOwnPropertyNames(obj).forEach(prop => { if (props.indexOf(prop) === -1) { props.push(prop); } }); } while (obj = Object.getPrototypeOf(obj)); props.join(“\n”); // Restituisce una matrice di stringhe che elenca le proprietà e i metodi disponibili.
L’espressione precedente non è compatibile con il motore Legacy ExtendScript. Utilizza sintassi e metodi non disponibili in ECMAScript 3.
Requisiti di sintassi per le librerie di espressioni .jsx ed eval() con il motore JavaScript
Se si utilizzano le espressioni in una libreria di funzioni di espressione .jsx o se un’espressione viene richiamata in eval(), è necessario modificare alcuni tipi di sintassi:
Deve essere aggiunto un prefisso esplicito per thisLayer. o thisProperty. a qualsiasi metodo o attributo nativo che non sia richiamato esplicitamente su un livello o una proprietà. Il prefisso indica al motore JavaScript su quale oggetto si sta richiamando il metodo o l’attributo.
Le operazioni matematiche sui valori di matrice come la Posizione devono essere calcolati utilizzando matematica vettoriale oppure funzioni cicliche per agire su ogni elemento nella matrice. Gli operatori matematici sovraccaricati come posizione + [100,100] non potranno essere valutati.
Se si utilizza il motore JavaScript, le espressioni vengono pre-elaborate prima della valutazione così da rendere leggibile parte della sintassi per le espressioni Legacy ExtendScript per il nuovo motore. Tuttavia, queste attività di pre-elaborazione non vengono eseguite se si valutano espressioni da una libreria di funzioni di espressione .jsx o se un’espressione viene richiamata all’interno di eval(). In questi casi è necessario apportare manualmente queste modifiche della sintassi. Tutte queste modifiche della sintassi presentano compatibilità retroattiva con il motore Legacy ExtendScript, cosicché una libreria di espressioni .jsx scritta per funzionare con il motore JavaScript funzionerà anche con il motore Legacy ExtendScript.
Consiglio sulle prestazioni: a causa della mancanza di pre-elaborazione, il richiamo di espressioni complesse da una libreria .jsx con questa sintassi e il motore JavaScript può comportare un miglioramento delle prestazioni rispetto al richiamo della stessa espressione direttamente su una proprietà.
Prefisso esplicito di metodi e attributi nativi con thisLayer. o thisProperty.
Nella tabella seguente sono elencati i metodi e gli attributi che richiedono un prefisso. Per esempio, time deve essere scritto thisLayer.time, mentre wiggle() deve essere scritto thisProperty.wiggle().
Questi prefissi sono richiesti solo nei casi in cui l’attributo o il metodo non siano già esplicitamente richiamati su un altro livello o proprietà. Ad esempio, se si richiama thisComp.layer(1).hasParent, l’aggiunta di thisLayer. non è richiesta poiché .hasParent è già richiamato esplicitamente su layer(1).
Metodi che richiedono thisLayer. |
Attributi che richiedono thisLayer. |
Metodi che richiedono thisProperty. |
Attributi che richiedono thisProperty. |
---|---|---|---|
comp() |
time |
valueAtTime() |
velocity |
Sostituzione degli operatori matematici con funzioni matematiche vettoriali
Entrambi i motori Legacy ExtendScript e JavaScript consentono il sovraccarico degli operatori matematici per le matrici tramite l’utilizzo di sintassi come position + [100.100] ma ciò non funziona per espressioni in una libreria di funzioni di espressione .jsx o all’interno di eval().
Per eseguire operazioni matematiche sulle proprietà di matrice come Posizione, Scala, ecc., è necessario utilizzare gli equivalenti della matematica vettoriale per addizione, sottrazione, moltiplicazione e divisione. Le funzioni di matematica vettoriale funzioneranno inoltre per i numeri regolari, cosicché una funzione che può essere richiamata su proprietà di qualsiasi tipo di dati deve utilizzare le funzioni matematiche vettoriali.
Il prefisso thisLayer. deve essere utilizzato con le funzioni matematiche vettoriali.
- Addizione: thisLayer.add(vec1, vec2)
- Sottrazione: thisLayer.sub(vec1, vec2)
- Moltiplicazione: thisLayer.mul(vec, amount)
- Divisione: thisLayer.div(vec, amount)
Di seguito sono elencati alcuni esempi di espressioni che utilizzano matematica standard e matematica vettoriale aggiornata. Le espressioni matematiche vettoriali utilizzano inoltre il prefisso thisLayer. o thisProperty. appropriato se necessario.
Per trovare la differenza tra un wiggle() e il valore di una proprietà Posizione:
// Calcolo standard: wiggle() - value; // Calcolo vettoriale: thisLayer.sub( thisProperty.wiggle(), value );
Per interpolare tra due valori, simili a linear() ma con un intervallo esteso oltre i limiti minimo e massimo definiti:
// Calcolo standard: value1 + ( ( t - tMin ) / ( tMax - tMin ) ) * ( value2 - value1); // Calcolo vettoriale: thisLayer.add(value1, thisLayer.mul( thisLayer.div( thisLayer.sub( t, tMin ), thisLayer.sub( tMax, tMin ) ), thisLayer.sub( value2, value1 ) ) );
Per attivare o interrompere la ciclicità della proprietà Posizione:
// Calcolo standard: loopIn( “cycle”) + loopOut( “cycle”) - value; // Calcolo vettoriale: thisLayer.sub( thisLayer.add( thisProperty.loopIn( “cycle” ), thisProperty.loopOut( “cycle” ) ), value );