NOTA! Questo sito utilizza i cookie e tecnologie simili.

Se non si modificano le impostazioni del browser, l'utente accetta. Per saperne di piu'

Approvo

Capitolo 84: userData. Estendere le classi di Java3D.

 

USERDATA

Spesso è desiderabile poter associare a degli oggetti dello Scene Graph delle 'informazioni extra', come un nome (una stringa, da visualizzare o da trasmettere a qualche altro oggetto), valori o anche qualcosa di più elaborato.

Se questa 'estensione' non ha a che fare con l'apporto di campi o metodi supplementari, e non c'è quindi bisogno di creare una nuova classe figlia dell'oggetto, è possibile far uso dei metodi setUserData e getUserData forniti dalla classe SceneGraphObject e disponibili per tutte le classi che la estendono.

 

 

Le firme complete dei due metodi sono:

 

 

  • getUserData(): java.lang.Object;

  • setUserData(java.lang.Object): void;   .

 

 

La loro utilità è chiara: permettono di associare un oggetto (nel senso informatico del termine) 'extra' ad un oggetto dello Scene Graph.

L'esempio più banale di utilizzo riguarda l'uso di una stringa contenente un'informazione (ad esempio, un nome) da mostrare a video quando l'oggetto (visuale, della scena 3D) che la contiene viene selezionato (picking behavior), 'urtato' (collisioni), ecc.

 

 

ESTENDERE LE CLASSI DI JAVA 3D

A volte si ha la tendenza a considerare le classi di Java3D come scatole nere, date così come sono dall'alto, senza possibilità di modifica: non è così, si tratta comunque di classi 'informatiche', estendibili come tutte le altre.

Ad esempio, possiamo creare una classe che estenda da Transform Group aggiungendo campi e metodi.

La porzione di codice riportata qui di seguito permette di creare, appunto, un oggetto che estende da Transform Group, ma che in più ha un campo testuale, il 'nome' dell'oggetto:

 

import javax.media.j3d.*;

public class mioTransformGroup extends TransformGroup

{

private String nome;

public mioTransformGroup(String s)

{

nome = s;

}

public void setNome(String s)

{

nome = s;

}

public String getNome()

{

return nome;

}

}

 

Utilizzando questo oggetto insieme ad un PickingCallback sarà quindi possibile risalire al 'nome' dato all'oggetto utilizzato.

 

NOTA: nel metodo transformChanged della classe di PickingCallback dovremo effettuare un controllo; il metodo getNome() sarà infatti presente solo nei 'nostri' oggetti che ereditano da Transform Group, per cui basterebbe cliccare su un qualunque altro oggetto (anche su ciò che apparentemente sembrerebbe il nulla, cioè sullo sfondo) per generare un errore a runtime.

Ecco come controllare la 'natura' dell'oggetto selezionato:

 

public void transformChanged(int type, TransformGroup tg)

{

if(tg instanceof mioTransformGroup)

System.out.println(((mioTransformGroup)tg).getNome());

}

 

 

 

 

 

 

Attenzione: l'esempio appena riportato è molto semplice, anche TROPPO: per fornire poche informazioni extra ad un oggetto e nessun metodo aggiuntivo, si può far uso di USERDATA, come mostrato precedentemente.

L'estensione (informatica) di classi dello Scene Graph è un'operazione 'pesante', alla quale bisognerebbe far ricorso solo in caso di reale necessità.

 

 
Vai all'inizio della pagina