XML  »  Guide  »  Guida VRML 

Posizione e orientamento degli oggetti



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.

Ultimi articoli XML

Open Graph Protocol, Facebook e il Web Semantico

Come sfruttare il Web Semantico "made in Facebook"

Introduzione a RDFa - 2

Arricchire un documento HTML con metadati semantici presi dal...

Introduzione a RDFa

Cos'è e a cosa serve il linguaggio che potrebbe aprire il campo alle...

Usare SVG per creare sfondi flessibili, scalabili e divertenti

Scopriamo cos'è il formato SVG e come possiamo usarlo in modo...

Visualizzare i metadati RDF Dublin core con le trasformazioni XSL

Mettere insieme XSL, XPATH e le definizioni Dublin core per...

Altri articoli

Guide XML

Guida Podcasting

Un percorso in 16 lezioni, per entrare nella filosofia del podcast...

Guida Smil 2.0

Un percorso pratico alla scoperta di SMIL: il linguaggio (XML) per...

Guida Web service

Cosa sono, a cosa servono e come si creano servizi Web, i sistemi...

Altre guide

Newsletter @XML

Ogni mese, direttamente nella tua e-mail: articoli, guide, FAQ e approfondimenti sui linguaggi della famiglia XML.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Nessun corso previsto

Nessun corso previsto