Animare gli oggetti di ArchiCAD

In ArchiCAD è possibile creare, oltre alle immagini 3D fisse, anche delle animazioni formate da sequenze di immagini. Nel GDL è integrata la possibilità di realizzare Oggetti che interagiscono con il numero di fotogramma. In altre parole è possibile programmare il codice GDL in modo che l'oggetto risulti "in movimento" nel corso delle animazioni. Per generare una sequenza animata è necessario posizionare almeno due telecamere sul foglio di lavoro, ed utilizzare il comando Modello/Crea Vola Attraverso. Ovviamente è possibile animare solo il 3D dell'oggetto, non il simbolo planimetrico, in quanto non esiste nessuna possibilità di realizzare un'animazione (cioè un Vola Attraverso) relativa alla pianta del progetto. Quindi gli interventi del GDL sono limitati allo Script 3D. Per inserire nell'oggetto la capacità di modificarsi in funzione del fotogramma, è sufficiente inserire delle istruzioni condizionali (in genere IF...THEN) vincolandole al contenuto di una apposita variabile globale, chiamata GLOB_FRAME_NR, che corrisponde al numero di fotogramma corrente, nel corso dell'animazione. Un esempio di Script 3D, semplificato al massimo, può essere il seguente:

BLOCK 1, 1, GLOB_FRAME_NR

che crea un blocco largo un metro, profondo un metro e alto... quanto? Esattamente un metro al primo fotogramma, due metri al secondo fotogramma, tre al terzo, e così via. La variabile globale GLOB_FRAME_NR, infatti, durante la generazione dell'animazione assume il valore corrispondente al fotogramma rappresentato. Quindi, quando il programma esegue il codice, nella creazione del primo fotogramma, il comando viene interpretato come:

BLOCK 1, 1, 1

nel secondo fotogramma viene interpretato come:

BLOCK 1, 1, 2

nel terzo sarà:

BLOCK 1, 1, 3

e così via. E' chiaro che già con un'animazione di poche decine di fotogrammi, un simile oggetto diventa alto parecchi metri ma è solo un esempio. In effetti il valore di GLOB_FRAME_NR sarà spesso elaborato in vari modi. Il più semplice può essere il seguente:

BLOCK 1, 1, GLOB_FRAME_NR*0.1

in questo caso abbiamo moltiplicato il valore per 0.1, cioè per un decimo. In questo modo il blocco crescerà di dieci centimetri ad ogni fotogramma. (Attenzione: se non ci si trova nel corso di un'animazione, la variabile globale GLOB_FRAME_NR assume il valore zero. Per evitare errori, invece di BLOCK 1,1,GLOB_FRAME_NR si potrebbe usare BLOCK 1,1,GLOB_FRAME_NR+0.0001) Facciamo un altro esempio, più completo ma sempre semplicissimo. Nel prossimo oggetto vedremo come imporre un movimento limitato solo ad una parte definita dell'animazione. Aprite un nuovo oggetto (Archivio/Oggetti GDL/Nuovo Oggetto) e create 4 nuovi parametri, come nell'immagine seguente:

Per i meno esperti: deve essere attivo il pulsante Parametri, a sinistra; cliccate su Nuovo, in alto, e scrivete l'identificativo del parametro nel campo "Variabile" e la descrizione per l'utente nel campo "Nome". Al centro configurate il "Tipo" che in questo caso è Numero Reale per il primo e l'ultimo, Numero Intero per gli altri due. Passate allo Script 2D, cliccando sul pulsante "Testo GDL 2D" a sinistra, e scrivete la seguente istruzione:

PROJECT2 3, 270, 2

Passate infine allo Script 3D, cliccando sul pulsante "Testo GDL 3D" a sinistra, e copiate le istruzioni seguenti:

H = minimo 
IF GLOB_FRAME_NR >= inizio THEN 
H = minimo + (GLOB_FRAME_NR - inizio + 1) * incremento 
ENDIF 
IF GLOB_FRAME_NR > fine THEN 
H = minimo + (fine - inizio + 1) * incremento 
ENDIF 
BLOCK 1, 1, 1 
ADDX 1.25
BLOCK 1, 1, H

Questo oggetto crea un blocco "fisso", di confronto, ed un altro la cui altezza verrà incrementata durante l'animazione. I parametri creati permettono di: - definire l'altezza iniziale del secondo blocco (variabile "minimo") - stabilire il fotogramma dal quale inizia l'incremento di altezza (variabile "inizio") - stabilire il fotogramma dal quale termina l'incremento di altezza (variabile "fine") - impostare l'incremento da applicare ad ogni fotogramma compreso fra "inizio" e "fine". Per comprendere meglio il funzionamento, vediamo di commentare le istruzioni GDL.

PROJECT2 3, 270, 2

Questa istruzione è il metodo più semplice per generare il simbolo planimetrico (2D) di qualsiasi elemento, generando in modo automatico la proiezione del 3D, come una vista dall'alto dell'oggetto. In questo caso il simbolo è molto semplice e statico, e sarebbe sufficiente disegnare due quadrati, ma l'istruzione PROJECT2 ci permette di andare avanti col 3D senza preoccuparci troppo del 2D!

H = minimo

All'inizio dello script 3D viene creata una variabile locale ("H") a cui si assegna alo stesso valore del parametro "minimo" cioè l'altezza iniziale del secondo blocco.

IF GLOB_FRAME_NR >= inizio THEN

Questa è una "istruzione condizionale", cioè inserisce un criterio in base al quale dovranno o non dovranno essere eseguite determinate istruzioni. Per comprenderla meglio, proviamo a tradurla in italiano. Potremmo leggerla così "SE la variabile globale GLOB_FRAME_NR è uguale o maggiore del valore della variabile inizio, ALLORA". Allora che? Allora esegui le istruzioni seguenti, fino alla successiva istruzione ENDIF. In pratica, la riga seguente viene eseguita solo quando il fotogramma corrente dell'animazione raggiunge il valore stabilito dalla variabile inizio.

H = minimo + (GLOB_FRAME_NR - inizio + 1) * incremento

Se la condizione è realizzata, cioè l'animazione è giunta al fotogramma "inizio", modifica il valore della variabile H, assegnandole il risultato della formula. La parte fra parentesi (GLOB_FRAME_NR - inizio +1) restituisce il numero 1 al fotogramma "inizio", 2 al fotogramma seguente, 3 al successivo ecc. Infatti, sapendo che "inizio", nel nostro esempio, è impostato a 10, avremo che al decimo fotogramma la formula vale (10 - 10 + 1) = 1; all'undicesimo sarà (11 - 10 + 1) = 2; al dodicesimo (12 - 10 + 1) = 3 ... Questo ci permette di calcolare la nuova altezza da assegnare, pari al valore iniziale (variabile "inizio") + il numero ottenuto, moltiplicato per il valore di "incremento". (Ricordiamo che nel GDL, come in quasi tutti i linguaggi di programmazione, la moltiplicazione è indicata con l'asterisco).

ENDIF

Se la condizione dell'istruzione IF precedente non si è verificata, cioè nei primi fotogrammi dell'animazione, durante i quali il valore di GLOB_FRAME_NR rimane inferiore al valore di "inizio", il programma salta l'istruzione precedente ed arriva direttamente qui, sotto l'istruzione ENDIF, ed il valore della variabile H rimane invariato, cioè uguale a "minimo".

IF GLOB_FRAME_NR > fine THEN

Un'altra condizione. In questo caso controlliamo se il fotogramma corrente è successivo a quanto definito con il parametro "fine", per evitare che il blocco continui a crescere per tutta l'animazione.

H = minimo + (fine - inizio + 1) * incremento

Se l'animazione ha superato il fotogramma "fine", ricalcoliamo il valore della variabile H. La formula è analoga alla precedente, ma al posto di GLOB_FRAME_NR abbiamo messo fine, in modo che la parte tra parentesi avrà sempre lo stesso valore. Nel nostro esempio sarà (20 - 10 + 1) = 11 per tutti fotogrammi successivi all'ultimo per il quale desideriamo attivare l'animazione dell'oggetto.

ENDIF

Anche in questo caso, ENDIF stabilisce il punto di uscita dell'istruzione condizionale. In tutti i casi in cui GLOB_FRAME_NR è inferiore a "fine", la variabile H mantiene il valore precedentemente impostato (che, secondo i casi, può essere quello iniziale o quello calcolato nella prima istruzione condizionale).

BLOCK 1, 1, 1

Questa istruzione costruisce un blocco cubico, di un metro di lato, da usare come paragone per il successivo.

ADDX 1.25

L'istruzione ADDX 1.25 sposta l'origine lungo l'asse X di un metro e 25cm, per prepararsi a costruire il secondo blocco in una posizione traslata rispetto al primo.

BLOCK 1, 1, H

Questa istruzione, infine, costruisce un blocco largo un metro, profondo un metro e alto quanto definito dalla variabile H. Qui di seguito trovate il diagramma di flusso dello script 3D, che potrebbe rendere più comprensibile lo svolgimento del programma.

Le operazioni da compiere nel corso dell'animazione possono essere le più disparate. Nel nostro esempio abbiamo modificato semplicemente un'altezza, ma la gamma di istruzioni utilizzabili è virtualmente infinita, e limitata solo dalla fantasia. C'è chi ha realizzato superfici con onde mobili, per simulare un mare agitato, chi ha fatto delle bandiere che garriscono al vento... un altro esempio potrebbero essere quello di un semaforo funzionante, con le luci che si alternano a tempo, o un'insegna con una scritta scorrevole, come quella che potete scaricare in fondo a questa pagina (vers. AC8). Per terminare vediamo rapidamente come aggiungere il movimento ad un oggetto di libreria esistente senza modificarlo! Basta creare un nuovo oggetto che chiama quello da animare, inserendo le istruzioni necessarie. Prendiamo per esempio il "Mobile colonna 2 ante" da 1. Libreria di base/1.1 Arredi/Mobili Cucina. Voglio animare l'apertura delle ante, quindi la prima cosa da fare è aprire l'oggetto, per vedere il nome della variabile da "pilotare". Scorrendo l'elenco dei parametri si vede che la variabile che controlla l'apertura delle ante si chiama "door_ang".

 

Ora apriamo un nuovo oggetto e creiamo le variabili necessarie. Oltre a quelle che utilizzo per stabilire l'inizio e la fine dell'animazione, ne creo altre due che mi permettono di impostare la posizione iniziale e quella finale delle ante, cioè i due valori estremi da assegnare alla variabile door_ang. Inoltre può essere una buona idea crearne anche una che mi permette di modificare il nome dell'oggetto da animare: Le stesse istruzioni possono infatti pilotare anche altri oggetti della stessa serie, a patto che abbiano anch'essi una variabile chiamata "door_ang".

Nello script Master si inserisce il testo seguente:

inc = (val_fin-val_ini) / (fine-inizio+1)
val = val_ini 
IF GLOB_FRAME_NR >= inizio THEN 
val = val_ini + (GLOB_FRAME_NR- inizio + 1) * inc 
ENDIF 
IF GLOB_FRAME_NR > fine THEN 
val = val_fin 
ENDIF 
CALL nomeogg PARAMETERS door_ang=val

All'inizio creo la variabile "inc" per calcolare l'incremento, cioè di quanto si deve modificare l'apertura delle ante ad ogni fotogramma. Poi uso la variabile "val" per impostare l'angolo da utilizzare. Le istruzioni condizionali (IF...THEN / ENDIF) funzionano come nell'esempio precedente. L'ultima istruzione (CALL) si incarica di "chiamare" l'oggetto definito dalla variabile "nomeogg", utilizzando per i suoi parametri i valori di default, tranne che per door_ang, a cui assegna il valore "val". Da quanto detto si comprende che, se non si vogliono utilizzare i valori default per altri parametri, è necessario crearne altri corrispondenti in questo oggetto "chiamante", ed aggiungerli in fondo all'istruzione CALL. Esempio:

CALL nomeogg PARAMETERS door_ang=val, gs_cabinet_mat=materiale, a=a, b=b, zzyzx=zzyzx

Le ultime tre assegnazioni mostrano come sia possibile passare all'oggetto chiamato le dimensioni generali (lunghezza, larghezza e altezza) impostate nell'oggetto chiamante. Ora siete quasi pronti a divertirvi con le animazioni... Ricordate solo che avete bisogno di due o più telecamere. Cliccate sul pulsante Percorso per impostare il numero di fotogrammi intercalati per ogni coppia di telecamere.

Può essere utile anche definire il percorso come "poligonale", nel caso che vogliate fare un'animazione con due o più telecamere perfettamente sovrapposte, per avere solo il movimento degli oggetti, mantenendo ferma l'inquadratura. L'ultima accortezza, ASSOLUTAMENTE NECESSARIA, è quella di attivare l'opzione "Ricostruisci il modello per ogni fotogramma". Questo ovviamente allunga i tempi di calcolo ma, diversamente, ArchiCAD crea il modello solo per il primo fotogramma, e lo utilizza poi per tutta l'animazione, senza modificare l'aspetto dei singoli elementi.

Clicca QUI per scaricare l'oggetto di esempio. (PLA per ArchiCAD 8.1)

 

Chi è online

Abbiamo 559 ospiti e 2 membri online

Utenti iscritti al sito

87173