Home
Articoli
Forums
Gallery
Tutorials
Downloads
Links
Competizioni
Archivio News
About

Stampa/PrintLocomotore e carrozza su binari
Tutorial sull'utilizzo delle espressioni in LightWave 3D per animare locomotore e carrozza su binari
by Marco Anceschi aka Delirium_FX (espressioni di controllo) - Alessandro Marabese aka alexdraco (modelli e scena)

 

La matematica nel progetto

 Espressioni pianale

Posizione pianale (pivot pianale centrato sul carrello 1):

Posizione X — ETR:Carrello1.pos(Time).x {viene letta la coordinata X del carrello 1 e utilizzata per
impostare la coordinata X del pianale}


Posizione Y — ETR:Carrello1.pos(Time).y {viene letta la coordinata Y del carrello 1 e utilizzata per
impostare la coordinata Y del pianale}


Posizione Z — ETR:Carrello1.pos(Time).z {viene letta la coordinata Z del carrello 1 e utilizzata per
impostare la coordinata Z del pianale}

Espressioni calcolo rotazioni pianale: Angolo H

Angolo H = deg(atan(A/B))*(ETR:Carrello1.pos(Time).z >= ETR:Carrello2.pos(Time).z)+ (180+deg(atan(A/B)))*(ETR:Carrello1.pos(Time).z <ETR:Carrello2.pos(Time).z)

Variabile A (segmento A di figg. 1, 2) = ETR:Carrello1.pos(Time).x – ETR:Carrello2.pos(Time).x

Variabile B (segmento B di figg. 1, 2) = ETR:Carrello1.pos(Time).z – ETR:Carrello2.pos(Time).z

Figura 1
Figura 2

Useremo la funzione goniometrica tangente, congiuntamente con la funzione arcotangente, per calcolare l'angolo da assegnare all'oggetto “Pianale”. La prima cosa da fare è determinare i valori dei segmenti che entrano in gioco nel calcolo della tangente: A (identificato dalla variabile A nelle espressioni) e B (identificato dalla variabile B nelle espressioni). Il segmento A è la differenza delle coordinate X dell'oggetto “ETR500:Carrello1” e dell'oggetto “ETR500:Carrello2”, questa operazione è svolta nel campo di input “A” della finestra di dialogo Channel Expression (vedi Figura 3)

Figura 3 - Channel Expression

Come è facile intuire, il segmento B è la differenza delle coordinate Z degli oggetti utilizzati per determinare il segmento A (vedi Figura 4).

Figura 4 - Channel Expression

Per calcolare l'arcotangente si ricorre alla funzione atan(argomento), dove argomento è il rapporto (il rapporto è la tangente dell'angolo cercato) ovvero, nel linguaggio delle espressioni di LightWave, atan(A/B). Occorre ricordare che LightWave effettua tutti i calcoli che coinvolgono le funzioni goniometriche (seno, coseno, tangente, arcotangente, ecc...) in radianti, occorre dunque eseguire una conversione in gradi sessadecimali del valore ottenuto dall'operazione atan(A/B) mediante la funzione deg (argomento), dove argomento è il valore dell'angolo espresso in radianti. Per completezza di informazione riportiamo anche l'esistenza della funzione rad(argomento) che converte in radianti il valore di argomento.

Qualche semplice esempio per meglio chiarire le due funzioni:

deg(3,14) — viene convertito in 180° sessadecimali

rad(180) — viene convertito in 3,14rad (rad indica i gradi espressi in radianti)

deg(1,57) — viene convertito in 90° sessadecimali

rad(90) — viene convertito in 1,57rad

L'espressione che calcola la rotazione H del pianale si compone di due parti

La prima parte, indicata con EXPR1 (vedi figura 5), risolve il caso raffigurato dalla figura 1; la seconda parte, indicata con EXPR2 (vedi figura 5), risolve il caso raffigurato dalla figura 2.

Figura 5 - Channel Expression

EXPR1 = deg(atan(A/B))*(ETR:Carrello1.pos(Time).z >= ETR:Carrello2.pos(Time).z) (figura 1)

EXPR2 = (180+deg(atan(A/B)))*(ETR:Carrello1.pos(Time).z <ETR:Carrello2.pos(Time).z) (figura 2)

Come è facile notare dalla figura 5, l'espressione completa valutata da LightWave è EXPR1 + EXPR2 ma questo non significa che sia EXPR1 che EXPR2 concorrano a determinare il valore della rotazione H del pianale: le due situazioni non possono verificarsi contemporaneamente.

Vediamo come LightWave valuta l'espressione per determinare l'angolo H del pianale.

L'ordine con cui deve essere risolta una qualunque espressione, sia essa algebrica o aritmetica, è determinato da poche semplici regole:

  • 1. Vanno risolte prima le operazioni indicate nelle parentesi più interne (parentesi tonde), poi si passa a valutare il contenuto delle parentesi quadre (se presenti) e, infine, quello delle parentesi graffe (se presenti). LightWave utilizza nella sintassi delle espressioni solamente le parentesi tonde che fanno le veci di tutte le tipologie di parentesi menzionate in precedenza.

La figura qui sopra permette di capire come devono essere intese le parentesi all'interno di una espressione di LightWave.

  • 2. L'ordine con cui vanno eseguite le operazioni è il seguente:
    • - elevamento a potenza
    • - moltiplicazioni e divisioni nell'ordine in cui sono scritte
    • - addizione e sottrazione nell'ordine in cui sono scritte

Analizziamo il codice delle sottoespressioni che compongo l'espressione generale.

EXPR1 = deg(atan(A/B))*(ETR:Carrello1.pos(Time).z >= ETR:Carrello2.pos(Time).z) (figura 1)

 La prima parte dell'espressione di EXPR1, deg(atan(A/B)), calcola l'angolo a1 nell'ipotesi che il movimento del pianale avvenga come illustrato in figura 1. Per avere la certezza che sia effettivamente così, nella seconda parte di EXPR1, ETR:Carrello1.pos(Time).z >= ETR:Carrello2.pos(Time).z, si effettua una verifica booleana sulla posizione dei carrelli, in italiano:

SE la coordinata Z del Carrello1 È MAGGIORE O UGUALE alla coordinata Z del Carrello2 ALLORA la verifica condizione (MAGGIORE O UGUALE ? >=) è VERIFICATA (ci troviamo nel caso di figura 1) e LightWave restituisce il valore 1 (CONDIZIONE VERA), se la condizione NON è verificata otterremo un valore di 0 (CONDIZIONE FALSA).


EXPR2 = (180+deg(atan(A/B)))*(ETR:Carrello1.pos(Time).z <ETR:Carrello2.pos(Time).z) (figura 2)

 La prima parte dell'espressione EXPR2 (180+deg(atan(A/B))) calcola l'angolo a1 nell'ipotesi che il movimento del pianale avvenga come illustrato in “Figura 2”. Osservando la “Figura 2” vi “suona strano” sommare a 180° l'angolo a1? L'angolo a1 che andiamo a calcolare è negativo perché lo è il segmento B: la coordinata Z del Carrello1 e minore della corrispettiva del Carrello2, quindi l'espressione deve intendersi come 180+(-a1) ossia 180 – a1 (somma algebrica). Anche in questo caso, per essere certi di trovarci nel caso di “Figura 2”, ricorriamo a una verifica booleana sulla posizione dei carrelli nella seconda parte di EXPR2:

 Se la coordinata Z del Carrello1 È MINORE della coordinata Z del Carrello2 ALLORA la verifica condizione (MINORE ? <) è VERIFICATA (ci troviamo nel caso di figura 2) e LightWave restituisce il valore 1 (CONDIZIONE VERA), se la condizione NON è verificata otterremo il valore 0 (CONDIZIONE FALSA).

 Vediamo come quanto illustrato qui sopra viene concretamente applicato da LightWave.
In prima istanza Lightwave non è in grado di capire se il vagone si trova nel caso di figura 1 o di figura 2. Detto questo, cosa accade dal punto di vista del programma? Secondo le nostre istruzione esso calcola i segmenti necessari per calcolare la tangente dell'angolo da utilizzare come argomento per la funzione arcotangente poi, nell'ordine, calcola EXPR1 e poi EXPR2.

Ipotizziamo che il rotabile si trovi nel caso raffigurato da figura 1 e vediamo che accade dal punto di vista di Lightwave.

Figura 1

    1. Lightwave calcola il valore da attribuire alla variabile A ovvero esegue la differenza delle coordinate X degli oggetti Carrello1 e Carrllo2 (segmento A);
    2. Ora il programma calcola il valore da assegnare alla variabile B ovvero la differenza delle coordinate Z degli oggetti Carrello1 e Carrello2 (segmento B);
    3. Eseguiti i punti “1” e “2” Lightwave inizia a valutare l'espressione nel seguente modo:
  • - esegue il calcolo di a1 = deg(atan(A/B)) - verifica la condizione (ETR:Carrello1.pos(Time).z >= ETR:Carrello2.pos(Time).z) che sarà VERA (quindi, numericamente parlando, vale “1”) perché la coordinata Z del Carrello1 è maggiore della corrispettiva di Carrello2 e questo ci assicura che siamo del caso di figura 1 - fino a ora l'espressione “vale” a1*1 + EXPR2

  • 4. Ora LightWave inizia a esaminare EXPR2;
  • - esegue il calcolo di a1 = (180+deg(atan(A/B)))
    - verifica la condizione (ETR:Carrello1.pos(Time).z<ETR:Carrello2.pos(Time).z) che risulterà FALSA (quindi, numericamente parlando, vale “0”) perché la coordinata Z del Carrello1 è maggiore della corrispettiva di Carrello2 e questo avvalora ulteriormente il fatto che ci troviamo nel caso di figura 1
    - ora EXPR2 “vale” (180+a1)*0

  • 5. L'espressione calcolata da LightWave è dunque a1*1 + (180+a1)*0, risulta evidente che il secondo addendo è nullo e che l'angolo attribuito al rotabile è quello calcolato da EXPR1.

Ipotizziamo ora che il rotabile si trovi nel caso raffigurato da figura 2 e vediamo cosa accade eseguendo passo passo l'espressione.

Figura 2

    1. LightWave calcola il valore da attribuire alla variabile A ovvero esegue la differenza delle coordinate X degli oggetti Carrello1 e Carrllo2 (segmento A);
    2. Ora il programma calcola il valore da assegnare alla variabile B ovvero la differenza delle coordinate Z degli oggetti Carrello1 e Carrello2 (segmento B);
    3. Eseguiti i punti “1” e “2” Lightwave inizia a valutare l'espressione nel seguente modo:
  • - esegue il calcolo di a1 = deg(atan(A/B))
    - verifica la condizione (ETR:Carrello1.pos(Time).z >= ETR:Carrello2.pos(Time).z) che sarà FALSA (quindi, numericamente parlando, vale “0”) perché la coordinata Z del Carrello1 è minore della corrispettiva di Carrello2 e questo ci assicura che siamo del caso di “Figura 2”
    - fino a ora l'espressione “vale” a1*0 + EXPR2

  • 4. Ora Lightwave inizia a esaminare EXPR2;
  • - esegue il calcolo di a1 = (180+deg(atan(A/B)))
    - verifica la condizione (ETR:Carrello1.pos(Time).z<ETR:Carrello2.pos(Time).z) che risulterà VERA (quindi, numericamente parlando, vale “1”) perché la coordinata Z del Carrello1 è minore della corrispettiva di Carrello2 e questo avvalora ulteriormente il fatto che ci troviamo nel caso di “Figura 2”
    - ora EXPR2 “vale” 180 + (-a1)*1. NOTA: l'angolo a1 è negativo perché lo è il segmento B e di conseguenza il rapporto : B è negativo perché la coordinata Z del Carrello1 è minore della corrispettiva di Carrello2.

  • 5. L'espressione calcolata da Lightwave è dunque a1*0 + (180-a1)*1, risulta evidente che il primo addendo è nullo e che l'angolo attribuito al rotabile è quello calcolato da EXPR2.

Giunti a questo punto dovreste essere in grado di applicare la procedura sopra descritta ai due casi raffigurati in Figura 6, Figura 7 e determinare quale parte dell'espressione (EXPR1 o EXPR2) determina l'angolo da assegnare al vagone.

Figura 6
Figura 7

Soluzione “Moto di Figura 6”

Il moto descritto da Figura 6 è riconducibile al caso di Figura 2 e verrà utilizzata EXPR2 per calcolare l'angolo da attribuire al rotabile che varrà 180 + a1. Notare che a1 (circa 58°, valutazione grafica) è positivo per la regola dei segni essendo entrambi i segmenti negativi.

 

Soluzione “Moto di Figura 7”

Il moto descritto da Figura 7 è riconducibile al caso di Figura 1 e verrà utilizzata EXPR1 per calcolare l'angolo da attribuire al rotabile che varrà -a1. L'angolo a1 (circa 60°, valutazione grafica) è negativo perché lo è il segmento A: la coordinata di ETR500:Carrello1 è minore di ETR500:Carrello2 e quindi la differenza tra ETR500:Carrello1 – ETR500:Carrello2 dà un numero negativo.

Ecco il risultato applicato agli oggetti

Espressioni applicate al pianale

« La matematica nel progetto »

Indice:

Commenti »


www.lwita.com

 

LightWaveŽ and LightWave3DŽ are registered trademarks of NewTek, Inc.