Creare finestre personali (parte 2)

Il precedente tutorial era terminato, all'uscita dalla sala operatoria, con una finestra romboidale, bella, sana, e di robusta costituzione. E con una "voglia" insoddisfatta quella intrigante finestra a stella, che non metteremo mai nei nostri progetti, ma vorremmo tanto avere in libreria, per poter dire "questa l'ho fatta io". 
Come vi avevo anticipato, la cosa è abbastanza semplice, una volta imparata la procedura per trasformare un cPRISM_ in un WALLHOLE. Ricorderete che il problema consiste nel fatto che questo comando permette di definire solo poligoni convessi. Se il perimetro del foro ha delle concavità otterremo dei messaggi di errore e il malfunzionamento della finestra. 
Ricordiamo (ma lo sanno tutti) come si riconosce un poligono convesso: Appoggiando una retta infinita su ciascun lato (o una serie di tangenti, per i lati curvi) il poligono si deve trovare tutto da una parte. Se è possibile posizionare questa retta su un qualsiasi lato in modo da intersecare una parte del poligono, questo è concavo. 
Ma nulla vieta di usare più WALLHOLE in un singolo oggetto. Ricorderete che il nostro punto di partenza, per generare il foro nel muro, era il famoso solaio "Erba" da un metro di spessore. Tutto il processo si risolve dunque nella preventiva scomposizione del solaio (e quindi della sagoma del foro-finestra) in elementi convessi. Ci sono sempre molti modi per arrivare a questo risultato. Un sistema comodo (fin troppo) può essere quello di usare l'opzione "triangola" del comando esterno "geometria poligoni". Se è installato l'apposito Add-on troverete questo comando nel menu Strumenti. Sul solaio saranno tracciate delle linee che lo dividono in triangoli (che non possono essere mai concavi, quindi per noi sono l'ideale). Con il comando "dividi" si può successivamente tagliare il solaio.

Nell'immagine soprastante vediamo il risultato della divisione in automatico. Liberissimi di usarla, naturalmente, ma credo che la maggior parte voi, ragionando da "umani" avrebbe pensato a una divisione più semplice, probabilmente come quella di figura 2. 
Io, per rendere l'oggetto ancora più semplice e "leggero", opterei per la soluzione di figura 3. Con due soli tagli si ottengono tre poligoni convessi, da trasformare in altrettanti WALLHOLE. 
A questo punto non c'è molto da aggiungere. Realizzati i vari componenti con i solai, come abbiamo visto la volta scorsa, basta registrare come Finestra e riaprire lo script GDL 3D. 
Questa volta ci saranno tre solai "Erba" e quindi tre istruzioni cPRISM_ da modificare, ma niente di più. Come abbiamo imparato a fare, identifichiamo le linee di programma su cui intervenire, effettuiamo l'operazione eliminando, per ciascuno, la linea 
cPRISM_ "Erba", "Erba", "Erba", 
(compresa la virgola) e inserendo semplicemente il termine WALLHOLE all'inizio della linea seguente.

Troppo poco, per farci un articolo. E allora andiamo avanti. Facciamo un altro esempio: useremo due WALLHOLE per una finestra, ma questa volta non ci serve un foro unico, ma due fori distinti. Riusciremo a crearci un nuovo problema e avremo così l'occasione per trovare nuove soluzioni.

Immaginiamo di aver bisogno di una bifora. È il principio, quello che ci interessa, non l'estetica, quindi, per fare una cosa semplice, accontentatevi di due fori trapezoidali. Seguendo tutta la trafila che ormai abbiamo imparato a padroneggiare, in pochi minuti ecco pronta la nostra finestra di libreria, perfettamente funzionante nel 3D. Ma questa volta il problema si presenta da un'altra parte il simbolo 2D è incompleto! Mentre nel 3D il muro viene interrotto solo dai fori definiti con WALLHOLE, in pianta viene sempre interrotta la continuità del muro per l'intera larghezza dell'apertura. L'oggetto è composto da due ante separate, che vengono correttamente rappresentate nel simbolo, ma il pilastrino centrale dovremo aggiungerlo noi. Ci sono due modi: uno facile e uno difficile. 
Ovviamente quello da usare è il modo difficile ;) 
Comunque vediamo rapidamente il modo facile, e spieghiamo perché non va bene. Certamente la soluzione più ovvia è quella di aprire la finestra Simbolo 2D e aggiungere un retino uguale a quello del muro, nella giusta posizione e con le giuste dimensioni. Si noterà però una serie di problemi: primo fra tutti che non sappiamo in partenza su che muro andrà la finestra e se deve essere usata su muri diversi (per colore, tipo di campitura, spessore, ecc.) dovremmo realizzare più copie dell'oggetto. In poche parole: non è parametrico. Non si adatta alle circostanze manca di quell'"intelligenza" che è il vero punto di forza degli oggetti GDL. 
E allora andiamo nell'altra direzione, quella difficile. Si tratta come avrete immaginato di rientrare in sala operatoria, e intervenire sullo script GDL 2D. 
Seguitemi con fiducia, anche se non spiegherò i dettagli. Per ogni passaggio vi dirò semplicemente cos'è e perché è necessario, senza addentrarmi troppo nelle specifiche del linguaggio. La prima cosa da fare scrivere l'istruzione MUL2 seguita dal rapporto fra le variabili A e B e le corrispondenti misure della finestra (larghezza e altezza). La mia bifora era larga un metro e venti e alta uno, quindi: 
MUL2 a/1.2, b/1 
Questa istruzione fa sì che, anche usando delle misure reali, non delle variabili, queste possano essere adattate, "stirando" lo spazio nel quale si trovano. 
La seconda istruzione predispone l'uso di un tipo di linea. Non uno qualunque, ovviamente, ma il tipo di linea impostato per il muro corrente, quello su cui si trova la finestra: 
LINE_TYPE WALL_LINETYPE 
Quest'altra fa la stessa cosa con il tipo di retino: FILL WALL_FILL 
Ed infine questa imposta la penna da utilissare per le linee: PEN WALL_SECT_PEN 
Abbiamo finito la fase "preparatoria", ed ora scriveremo l'istruzione che disegna effettivamente il retino. Ma prima descriviamola. 
La sintassi, dal manuale del GDL, è la seguente: 
POLY2_B n, framefill, fillpen, fillbkgdpen, x1, y1, mask1, ..., xn, yn, maskn 
descriviamone brevemente le varie parti: 
POLY2_B 
questo è il nome del comando n è il numero di vertici del poligono (retino). 
Per il nostro rettangolo al posto della "n" metteremo il numero 4. framefill è un codice, prendiamolo così com'è. Nel nostro caso useremo il valore 7, per questo parametro. fillpen la penna da usare per la campitura del retino. Per utilizzare il colore impostato per il muro corrente, useremo una variabile globale: WALL_FILL_PEN.
fillbkgdpen 
la penna dello sfondo del retino. Anche questa può essere letta da una variabile globale: 
WALL_FBGD_PEN. x1, y1 
coordinate del primo vertice. 
mask1 un codice di controllo. Usando il valore 1, la linea verrà tracciata, usando 0 il lato sarà omesso. 
Il mio pilastrino era largo 20 cm, le coordinate dei 4 angoli del retino, per un muro spesso 30 cm, dovrebbero esser le seguenti: 
-0.10, 0.00 
-0.10, -0.30 
0.10, -0.30 
0.10, 0.00
 
per prima cosa, però dobbiamo renderci indipendenti dallo spessore del muro. Il pilastrino dovrà adattarsi a qualsiasi spessore, e quindi cambiamo il valore 0.30 con la variabile globale WALL_THICKNESS, senza dimenticare di farla precedere dal segno meno. 
-0.10, 0.00 
-0.10, - WALL_THICKNESS 
0.10, - WALL_THICKNESS 
0.10, 0.00
 
potrebbe già andare bene, ma c'è ancora una trappola. Se si definisce un rientro dell'infisso, tutto l'oggetto finestra viene traslato della misura definita nel relativo campo. Tutto, compreso il pilastrino, che andrà a sporgere dalla parte opposta. Dobbiamo quindi sommare alle coordinate Y un valore pari a questo spostamento (che è considerato negativo). Sapendo che tale valore è memorizzato nella variabile globale WIDO_SILL, le coordinate diventano: 
-0.10, WIDO_SILL -0.10 
WIDO_SILL -WALL_THICKNESS 
0.10, WIDO_SILL -WALL_THICKNESS 
0.10, WIDO_SILL
 
ecco quindi che, finalmente, siamo in grado di scrivere la fatidica istruzione: 
POLY2_b 5, 7, WALL_FILL_PEN, WALL_FBGD_PEN, 
-0.10, WIDO_SILL, 1, 
-0.10, WIDO_SILL-WALL_THICKNESS, 1, 
0.10, WIDO_SILL-WALL_THICKNESS, 1, 
0.10, WIDO_SILL, 1 
Manca ora solo un particolare. Se la finestra Testo GDL 2D è vuota, allora ArchiCAD mostra il disegno contenuto nella finestra Simbolo 2D. Se invece contiene del testo, verrà usato solo questo, per generare il disegno di pianta. A meno che non venga richiamato esplicitamente anche il simbolo disegnato. Ed è quello che faremo noi: 
FRAGMENT2 all,0 
Il parametro "all" comunica di visualizzare tutti i "fragment", ossia i lucidi del disegno 2D. Il successivo valore zero indica che devolo essere usati i colori e tipi linea originale, non quelli correnti. 
Ecco quindi tutto lo script: 
LINE_TYPE WALL_LINETYPE 
FILL WALL_FILL 
PEN WALL_SECT_PEN 
POLY2_B 4, 7, WALL_FILL_PEN, WALL_FBGD_PEN, 
-0.10, WIDO_SILL, 1, 
-0.10, WIDO_SILL - WALL_THICKNESS, 1, 
0.10, WIDO_SILL - WALL_THICKNESS, 1, 
0.10, WIDO_SILL, 1 
FRAGMENT2 all,0

 

Creare finestre personali (parte 1)

È capitato un po' a tutti, anche se non molto spesso, di aver bisogno di inserire in un progetto una finestra di forma non standard. Nelle librerie attuali, occorre riconoscerlo, se ne trovano in abbondanza, ma inevitabilmente il tipo che serve a noi ... non sarà tra quelle disponibili. Molti utenti ArchiCAD hanno imparato, spinti dalla necessità, a creare oggetti di libreria utilizzando la cosiddetta "modalità grafica", registrando cioè come oggetto una serie di elementi posizionati sul foglio di lavoro, evitando ogni contatto col temuto linguaggio GDL, ma la creazione di una nuova apertura (porta o finestra) introduce alcuni problemi specifici che spesso rendono il risultato della modalità grafica poco soddisfacente. Per migliorare l'oggetto è quasi inevitabile mettere le mani nelle sue "viscere". Il mio obiettivo - forse ambinzioso - è quello di dimostrare che l'operazione può essere portata a buon fine da chiunque, seguendo meccanicamente alcune indicazioni e comportandosi un po' come quei robot da sala operatoria, che operano a distanza guidati dal chirurgo.

Ovviamente partiamo dal principio: abbiamo necessità di posizionare su un muro una finestra romboidale di un metro di larghezza e altrettanto di altezza. Il primo passo da compiere è consultare le librerie (magari utilizzando l'abaco fornito in versione PDF con ArchiCAD) per vedere se ce ne sia già una. Ovviamente non c'è (altrimenti questo articolo sarebbe già finito), vi si trova solo un foro, ma è privo di infisso. Benissimo. Adesso ci pensiamo noi. Come forse saprete, il GDL tratta porte e finestre in modo particolare, ed è necessario disegnarle "in piano" cioè orizzontali. Siamo pronti, ma prima di cominciare devo fare due raccomandazioni preliminari:

1. Posizione

Quando si intende realizzare degli elementi da registrare come oggetti, è opportuno posizionarsi sull'origine. in questo caso l'origine deve trovarsi al centro del davanzale (o della soglia, per le porte).

2. Quota

La quota zero rappresenta il filo esterno del muro su cui verrà posizionata la finestra. Un eventuale davanzale sporgente, per esempio, dovrà "sporgere" verso il basso. Per finestre semplici io consiglio di realizzare l'infisso con la parte inferiore a quota zero. Se necessario, poi, si useranno i controlli specifici per impostare l'eventuale arretramento.

E ora cominciamo!

Facciamo subito l'infisso: prendiamo un solaio, e tracciamo il perimetro esterno della finestra. Realizziamo anche le necessarie forature per i vetri. Diamo a questo solaio lo spessore e la quota appropriati, ed assegniamo anche la penna e i materiali idonei. Sempre con l'uso di solai realizziamo le vetrature e, se necessario, aggiungiamo tutti gli altri particolari (maniglie, cerniere, ecc...). Per questo primo esempio usiamo il materiale "Pino" per la struttura e "Vetro" per i vetri. A questo punto l'infisso è terminato, ma il nostro lavoro, ovviamente, è solo all'inizio.

Infatti, come avrà senz'altro scoperto chi abbia già provato ad avventurarsi in un'impresa simile, il foro architettonico realizzato da ArchiCAD è sempre rettangolare, anche se la finestra non lo è. Quindi se registriamo come "finestra" il nostro rombo, otterremo un risultato non accettabile.

Allora facciamo le nostre contromosse: aggiungiamo un solaio il cui perimetro sia uguale all'apertura che vogliamo realizzare, dandogli le seguenti caratteristiche:

Spessore: 1.00 m 
Quota estradosso: 0.50 m 
Penna: 88 
Materiale: Erba

In realtà questo elemento non farà parte, alla fine, del nostro oggetto, quindi i settaggi servono in parte per rendere il solaio facilmente individuabile nel listato GDL, e in parte ... per trovarci alcuni parametri quasi pronti.

La situazione, a questo punto, sarà simile a quella visibile nella figura sottostante.

Controlliamo tutto nel 3D, facendo anche delle sezioni, se necessario, e quando il risultato appare soddisfacente passiamo alla registrazione: impostiamo una vista assonometrica, tipo "pianta dall'alto", con azimuth a 270° e, tenendo attiva la vista 3D, apriamo il menu "Archivio" per richiamare la voce "Oggetti GDL/Salva Modello 3D come...".

 
Ovviamente scegliamo, come tipo di file, "Una Finestra", e registriamo all'interno della libreria, meglio se nell'apposita cartella "0.0 Oggetti utente". Prima della registrazione vera e propria ci verrà proposto un dialogo con alcune opzioni. Selezioniamo "Rimuovi dal simbolo le linee coincidenti" e "Testo GDL editabile".
 
 

Possiamo già ora vedere che aspetto ha, dal vivo, la nostra creatura. Ha certamente bisogno di ulteriori cure, ma ha già preso vita. A questo punto la parte facile è finita. Sa per cominciare quella divertente. Dal menu "Archivio", selezioniamo "Oggetti GDL/Apri Oggetto..." e apriamo la finestra appena creata (N.B. Se l'oggetto era selezionato in pianta , verrà aperto automaticamente). Attiviamo la finestra Testo GDL 3D e osserviamone il contenuto: si noterà che ArchiCAD ha fatto il suo dovere ... anzi, anche di più. Non è necessario, ma per una migliore leggibiliità io consiglio di eliminare tutte le righe che cominciano con GLOB_ e quelle che iniziano con due punti esclamativi.

 

Anche le prime righe di commento potrebbero essere eliminate, ma lasciamo almeno data e versione. Il risultato sarà simile a quello raffigurato (il vostro listato, ovviamente, può avere delle differenze nei valori, ma niente di sostanziale). (N.B. Se volete evitare tutti quei lunghi decimali, attivate lo snap alla griglia invisibile, prima di disegnare gli elementi da registrare come oggetto, impostando la spaziatura a 1cm o a 1mm) Cominciamo con il nostro intervento. Per costringere ArchiCAD a fare un foro arbitrario, al posto di quello standard rettangolare, operiamo sul solaio di tamponamento che ci siamo preparati. Sarà facile individuarlo, perchè è preceduto dall'istruzione PEN 88 e nella sua definizione si nota il materiale Erba. L'istruzione usata da ArchiCAD per tradurre in GDL i solai è cPRISM_. Questo comando è fornito dalla dichiarazione dei materiali, seguita dal numero di vertici, poi dallo spessore e infine dalle coordinate x-y dei vertici (seguite tutte da un valore detto mask).

cPRISM_ "Erba", "Erba", "Erba", 
5, 1.0, 
-0.5, 0.5, 15, 
0.0, 1.0, 15, 
0.5, 0.5, 15, 
0.0, 0.0, 15, 
-0.5, 0.5, -1

Noi dovremo trasformare questa istruzione in un'altra, chiamata WALLHOLE, la cui sintassi prevede: il numero di nodi, un codice, e quindi le coordinate x-y dei vertici, ciascuna col suo mask. Procediamo allora cancellando per intero la prima riga, e aggiungendo, all'inizio della successiva, la parola chiave WALLHOLE. Tutto qui. il risultato sarà quindi:

WALLHOLE 5, 1.0, 
-0.5, 0.5, 15, 
0.0, 1.0, 15, 
0.5, 0.5, 15, 
0.0, 0.0, 15, 
-0.5, 0.5, -1

È importante che Wallhole sia scritto sulla stessa riga in cui c'è il numero di vertici. Volendo potete eliminare anche la riga con l'istruzione PEN 88 ma, anche lasciandola lì, non dovrebbe dare fastidio. Per completare il lavoro, attivate la finestra "Simbolo 2D" e sistemate a piacere la rappresentazione che l'oggetto dovrà avere in pianta.

 

Come minimo occorrerà eliminare la proiezione del solaio "Erba" da 1 metro...

(N.B. Se aggiungete gli hot spot, questi saranno riconosciuti dal cursore, una volta posizionata la finestra in pianta)

La vostra finestra potrebbe avere una posizione diversa, rispetto al filo del muro. dipende dal settaggio corrente delle opzioni do posizionamento. Ènecessario sapere che con WALLHOLE la terza opzione, cioè quella che prevede le mazzette, non funziona.

Registrate nuovamente l'oggetto e godetevi qualche vista, ma non vi allontanate ... vi avevo detto che il mio obiettivo era ambizioso ... quello che abbiamo fatto fin qui è stato troppo facile, quindi proviamo ad andare avanti di un ulteriore gradino. Allora andiamo nella finestra principale dell'oggetto e clicchiamo sul pulsante "Parametri", poi su "Nuovo". Nell'area a destra verrà creata una nuova riga, per il parametro appena creato. Nella riga ci sono tre campi editabili e alcuni pulsantini.

 

Andiamo nel primo campo, nella colonna "Variabile", dove il programma propone l'identificativo "C" e cambiamolo in qualcosa di meno generico, ad esempio "mast". Poi nel campo "Nome" digitiamo una descrizione, ad esempio "Materiale struttura". Tenendo cliccato sul pulsante della colonna "Tipo" si accede ad un menu di scelta, dal quale selezioniamo "Materiale". Ora il terzo campo, quello destinato al "Valore" ha la possibilità di essere impostato scegliendo il materiale dal tipico menu dei materiali, da cui scegliamo, per esempio, "Pino". Ripetiamo tutta l'operazione creando un'altra variabile con le seguenti caratteristiche:

Variabile: mave 
Tipo: (materiale) 
Nome: Materiale vetrate 
Valore: 24 (vetro)

Con ciò ci siamo preparati due parametri da poter utilizzare nel testo GDL. Adesso rimettiamoci la mascherina e torniamo in sala operatoria. Dobbiamo eseguire un paio di semplici bypass. Una volta attivata la finestra Testo GDL 3D, individuiamo le tre diciture "Pino" e al loro posto mettiamo la nostra prima variabile. In questa fase è necessario prestare la massima attenzione all'uso delle virgolette: i nomi di materiale usati in modo esplicito (cioè col loro nome, come nel listato creato da ArchiCAD) devono essere racchiusi tra virgolette, mentre le variabili che li rappresentano (come quelle che stiamo inserendo noi) no.

Quindi la riga: 
cPRISM_ "Pino", "Pino", "Pino", 
dovrà diventare: 
cPRISM_ mast, mast, mast,

Attenzione anche alle virgole, non dimenticate l'ultima! Facciamo lo stesso con l'altra variabile, mettendola, ovviamente, al posto di "Vetro". Salviamo per l'ultima volta e complimentiamoci con noi stessi.

Abbiamo realizzato effettivamente una finestra irregolare perfettamente funzionante e anche parzialmente parametrica!

Devo essere sincero fino in fondo, però. L'istruzione WALLHOLE ha un limite importante, anche se è facile aggirarlo: consente di realizzare solo aperture rappresentate da poligoni convessi. Se si ha necessità di realizzare una forma concava, ad esempio a stella, occorre eseguire qualche passo in più, ma è possibile fare anche questo senza conoscere il GDL.

Ma per non mettere troppa carne al fuoco, la procedura da seguire la vedremo nel prossimo tutorial (parte 2).

 
 
 

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 709 ospiti e nessun utente online

Utenti iscritti al sito

90361