Caratterizzazione fisica di un oggetto di forma umana in Vrml

L'oggetto di forma umana e' modellizzato come una catena cinematica che connette una serie di segmenti rigidi. I giunti tra un link ed un altro sono dotati degli opportuni gradi di liberta', in modo da consentire le rotazioni relative.

Prima di analizzare la struttura della catena, preciso alcune caratteristiche di partenza dell'oggetto.
Il corpo e' modellizzato in posizione eretta, con il viso rivolto verso l'asse z (segno positivo), l'asse y e' diretto verticalmente verso l'alto e l'asse x orizzontalmente verso destra. Le braccia sono distese parallelamente lungo il corpo con i palmi delle mani rivolti verso l'interno. La posizione della radice della catena cinematica e' posta a livello del bacino (piu' precisamente a livello del giunto lombare che separa il bacino dall'addome). La posizione ad y=0 e' posta a livello dei piedi.

In questa posizione tutti gli angoli dei giunti sono posti al loro valore di riposo che e' 0.

Il corpo dell'oggetto umano risulta dall'assemblaggio dei singoli links scalati e traslati. L'ideale era poter disporre di queste parti gia' posizionate in modo corretto e scalate opportunamente. Il motivo delle traslazioni e' dovuto al fatto che il modello utilizzato e' stato preso per traduzione da un formato esterno (in particolare dal modello di Jack, vedi 'The Jack Motion Library' del Center for Human Modeling and Simulation). Viceversa, il motivo dello scaling su alcuni pezzi e' dovuto al fatto che sono state effettuate alcune modifiche al modello originario, cambiando la parte relativa al torace e alle mani, costruendo dei pezzi opportuni. La ragione della sostituzione e' da ricercarsi soprattutto nel tentativo di ridurre il numero di gradi di liberta' (troppo elevati nel modello di Jack) e quindi la dimensione del file che definisce il modello umano.

La dimensione dell'umano viene settata a piacimento tramite un opportuno valore di scala. La scala preimpostata di default prevede un altezza di circa 1.80 m.


Figura 1 - Rappresentazione a riposo dell'oggetto di forma umana

Passo ora alla descrizione di come e' realizzata la catena cinematica a livello di VRML.

Per capire a fondo la descrizione qui sotto riportata e' richiesto un minimo di conoscenza del formato del linguaggio.

Vrml utilizza il nodo Transform per posizionare nello spazio un oggetto e ruotarlo. I valori di rotazione e di traslazione fissati da un nodo Transform sono applicati a tutti i nodi (elementi fondamentali in vrml per poter definire oggetti) contenuti nel campo children. Il campo children puo' contenere a sua volta altri nodi Transform; le trasformazioni applicate da questo nodo innestato operano nel sistema di riferimento relativo determinato dal Transform piu' esterno. Innestando nodi Transform si possono costruire catene cinematiche.

Piu' in dettaglio, se volessimo modellizzare una gamba tramite due soli giunti,quelli all'anca e al ginocchio, potremmo definire un nodo Transform piu' esterno relativo all'anca. Valori di rotazione imposti a questo giunto avranno come effetto quello di ruotare tutta la struttura contenuta nel campo children. In particolare, nel campo children del nodo Transform relativo all'anca vi sara' la definizione della coscia, del giunto al ginocchio e della restante parte della gamba (polpaccio, caviglia e piede). Ruotare il giunto al ginocchio modificando il campo rotation del nodo Transform relativo, porta invece a ruotare la sola parte innestata, che sara' costituita solo dalla parte terminale della gamba; in questo modo si influenza soltanto polpaccio, caviglia e piede. Ne segue che posizione e orientamento di queste ultime tre parti del corpo sono determinate dalla doppia rotazione imposta dai due nodi Transform, la seconda delle quali (quella al ginocchio) eseguita nel sistema di riferimento relativo definito dalla prima.

La struttura di innestamento per l'esempio appena visto risulta la seguente:

DEF anca Transform {
 rotation 1 0 0 0               #  rotazione per l'anca
children [
  DEF coscia Transform {
   children [
     # qui posiziono l'oggetto che definisce la coscia
     ...
     DEF ginocchio Transform {
       rotation 1 0 0 0       # rotazione per il ginocchio
       children [
	  DEF polpaccio Transform {
	    children [
	       # qui posiziono polpaccio, caviglia e piede
	     ]
	   }
	 ]
      } 
    ]
 }

L'esempio in questione e' esemplificato in modo da far comprendere il procedimento di innestamento. In particolare in questo caso ho tralasciato di modellizzare i giunti alla caviglia e al metatarso. Inoltre ho associato solo un grado di liberta' sia all'anca che al ginocchio. Per il ginocchio e' piu' che plausibile, ma per l'anca e' opportuno associare 3 gradi di liberta'. Per associare 3 gradi di liberta' sono possibili due diverse alternative.
La prima, consiste nel definire 3 nodi Transform innestati l'uno dentro l'altro, ognuno dei quali riguardante la rotazione attorno ad un certo asse. L'ordine di rotazione e':


Impostando gli opportuni valori di rotazione si determina la posizione desiderata.

Il secondo modo di implementare piu' gradi di liberta' e' quello di fare ricorso ad una rotazione attorno ad un asse generico. Infatti il campo rotation prende come argomenti i parametri direttori dell'asse e l'angolo di rotazione. Si potrebbe dunque precalcolare gli opportuni assi e quindi impostare la rotazione desiderata con un unico nodo Transform. Questo procedimento e' piu' efficiente del precedente e prevede una minore occupazione spaziale del file risultante.

Per quanto riguarda invece l'orientamento complessivo dell'umano, si procede ad effettuare una rotazione rispetto alla radice. La convenzione utilizzata e' quella di Eulero:

Qui di seguito riporto la struttura completa dell'oggetto di forma umana, con l'indicazione dei giunti resi disponibili e dei relativi gradi di liberta' associati.


Figura 2 - Giunti e relativi gradi di libertà


Documentazione
VRML DREAMERS Homepage
Per ulteriori informazioni: \/irtual |\/|ad