Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Posizione e orientamento degli oggetti

Il nodo Transform.
Il nodo Transform.
Link copiato negli appunti

Dopo aver visto il primo semplice esempio di file, proseguiremo nell'analisi del VRML prendendo in considerazione via via le possibilità di modellazione offerte dal linguaggio. Qui parleremo di come disporre gli oggetti all'interno del mondo VRML. Per tale scopo si procederà alla creazione di una rudimentale torre, composta da un cilindro e da un cono. Ecco il listato:

#VRML V2.0 utf8
# torre: nodo Transform

Shape {
  appearance Appearance {
    material Material {  emissiveColor 1 .5 0  }
  }
  geometry  Cylinder {
    radius .8
    height 2.4
  }
}

Transform {
  translation 0 1.6 0
  children [
    Shape {
      appearance Appearance {
        material Material  {  emissiveColor .5 .1 .1  }
      }
      geometry Cone {
        bottomRadius .8
        height .8
      }
    }
  ]
}

torre.wrl

Il listato contiene due semplici nodi Shape: il primo descrive un cilindro, il secondo descrive un cono. Quest'ultimo però, a differenza del nodo del Cilindro, è a sua volta contenuto in un nuovo nodo: transform, questo nodo è in grado di svolgere diverse funzioni. Nel nostro esempio, comunque, esso si limita a descrivere l'esatta posizione degli oggetti all'interno del mondo tridimensionale mediante i valori delle coordinate spaziali.

Gli assi del sistema di riferimento sono individuati nel seguente modo: l'asse x corrisponde alle coordinate lungo l'asse dell'orizzonte; l'asse y indica le coordinate verticali; l'asse z corrisponde alla profondità. Si tenga presente, a questo proposito, che ogni qualvolta si genera un oggetto, esso viene posizionato in modo da porre il suo baricentro nell'origine 0 degli assi xyz. I valori da attribuire possono essere quindi maggiori o minori di 0. I valori positivi corrispondono alle seguenti posizioni lungo gli assi: verso destra per valori positivi di x, verso l'alto e verso l'osservatore per i valori positivi rispettivamente di y e z.

img assi

Nel nostro caso si è provveduto a inserire nel nodo Transform il field translation e all'interno di esso si sono indicati i seguenti valori xyz: 0, 1.6, 0, in modo da posizionare il cono in cima al cilindro lasciando inalterata la sua posizione lungo gli assi x e z.

In ogni caso, il modo migliore di prendere confidenza con la gestione degli assi è quello di procedere passo passo, cambiando il valore di un singolo asse alla volta e verificandone l'effetto sul player.

Il nodo Transform

Come precedentemente indicato, nel nostro esempio il nodo transform contiene il campo translation. Con esso si è dichiarata una traslazione di 1.6 unità lungo l'asse y. Che cosa viene effettivamente traslato è rappresentato da quanto è contenuto nel field children. Children è dunque il campo del nodo transform che indica tutto ciò a cui dovrà essere applicata l'operazione di traslazione. Inoltre, con l'impiego delle parentesi quadre si possono raggruppare più oggetti ai quali applicare la traslazione. In questo caso il campo children contiene il solo nodo Shape relativo al cono.

Concludiamo parlando brevemente di un altro campo del nodo transform: il campo rotation. Come si sarà già notato ogni nuovo oggetto creato all'interno del mondo viene renderizzato con una posizione ed un orientamento di default che prevede il proprio asse parallelo all'asse y.

Per ottenere la rotazione di un corpo è necessario ricorrere ad un altro field del nodo transform, che è appunto il campo rotation. Il listato seguente descrive la semplice rotazione di un cubo.

#VRML V2.0 utf8
# cubo ruotato

Transform {
  rotation 1 1 1 -1.56
  children [
    Shape {
      appearance Appearance {
        material Material { emissiveColor .25 .5 1 }
      }
      geometry Box { size 3 3 3 }
    }
  ]
}

cubo ruotato.wrl

La rotazione viene specificata nel seguente modo. I primi 3 valori indicano l'asse attorno a cui effettuare la rotazione (nel nostro caso lungo tutti gli assi); il quarto valore (-1.56) indica l'angolo (espresso in radianti) secondo cui ruotare la primitiva. Il verso di rotazione è in senso orario poiché il valore è espresso in numero negativo. La rotazione specificata viene applicata a tutti i nodi contenuti nel campo children.

Innestare nodi Transform

Vedremo ora come sia possibile collegare tra loro una serie di oggetti in maniera gerarchica. L'intento è di
realizzare una figura tridimensionale composta che contenga alcune caratteristiche di posizione e orientamento valide per tutto il gruppo, mentre altre possono essere specificate solo per determinati elementi in modo tale da renderle indipendenti dalle condizioni generali.

L'esempio seguente illustra un perno attorno al quale ruota un braccio

#VRML V2.0 utf8
# perno con braccio: innestare i nodi Transform

Transform {
  translation 0 0 7
  rotation 1 -1 1 1.56
  children [
    Shape {
      appearance Appearance {
        material Material {emissiveColor 1 .2 .1}
      }
      geometry Sphere {
        radius .2
      }
    }
    Transform {
      translation .1 .2 0
      rotation 0 0 -1 .56
      children [
        Shape { 
          appearance Appearance {
            material Material {emissiveColor 0 1 0}
          }
          geometry Cylinder {
            radius .06
            height .8
          }
        }
      ]
    }
  ]
}

perno e braccio.wrl

Come si vede è stato sufficiente innestare un nodo Transform all'interno del campo children di un altro nodo Transform per collegare tra loro sfera e cilindro e, allo stesso tempo, lasciare per così dire un certo grado di “libertà di manovra” al braccio. Infatti, la traslazione e la rotazione impostate nel primo nodo transform vengono applicate a tutti i nodi contenuti nel campo children; quindi si applicano sia alla sfera che al secondo nodo transform. Quest'ultimo applica un'ulteriore traslazione e una nuova rotazione esclusivamente al cilindro. In pratica il braccio si posiziona seguendo la doppia traslazione dichiarata.

Cambiando le caratteristiche della prima traslazione si modifica la posizione dell'intero gruppo, cambiando i valori del secondo nodo transform, si otterranno la traslazione e la rotazione del solo cilindro.

Ti consigliamo anche