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 62: GeometryInfo.

 

GeometryInfo è una classe che eredita direttamente da java.lang.Object.

Permette di definire poligoni arbitrari specificando solo i vertici, senza dover prevedere e definire i triangoli o i quadrilateri necessari per collegare internamente i vertici: tale compito verrà infatti svolto da GeometryInfo, tramite una delle tre classi d'appoggio che verranno prese in esame a breve.

 

 

Dobbiamo quindi definire i vertici della nostra geometria (anche molto complessa), delegando a GeometryInfo il compito di creare le connessioni interne, creando tante facce triangolari.

Dal punto di vista implementativo, questi sono i passi necessari per creare una geometria facendo uso di GeometryInfo:

 

  • creare un oggetto GeometryInfo, specificando come vogliamo che GeometryInfo raggruppi i vertici (triangoli, quadrilateri o poligoni);

  • impostare i vertici della geometria;

  • creare un oggetto NormalGenerator e passargli, come parametro, l'oggetto GeometryInfo;

  • creare un oggetto Stripifier, che raggruppa i triangoli adiacenti in 'triangle strips', strisce di triangoli, e passargli come parametro l'oggetto GeometryInfo;

  • recuperare la geometria del GeometryInfo così definito.

 

 

I costruttori di GeometryInfo sono:

 

  • GeometryInfo(GeometryArray ga);

  • GeometryInfo(int primitive); .

 

Il parametro 'int primitive', nel secondo costruttore, può assumere uno dei seguenti valori:

  • TRIANGLE ARRAY;

  • QUAD ARRAY;

  • TRIANGLE FAN ARRAY;

  • TRIANGLE STRIP ARRAY;

  • POLYGON ARRAY.

 

Per impostare l'array delle coordinate (un array di floa, double, Point3d o Point3f) e l'array degli StripCounts (un array di interi), utilizzare:

 

mioGI.setCoordinates(arrayCoordinate);

mioGI.setStripCounts(stripCount);

 

con 'mioGI' oggetto di tipo GeometryInfo.

 

Per le fasi relative alla creazione delle normali e allo Stripifier, scrivere:

 

NormalGenerator mioNG = new NormalGenerator();

mioNG.generateNormals(mioGI);

mioGI.recomputeIndices();

Stripifier mioSF = new Stripifier();

mioSF.stripify(mioGI);

mioGI.recomputeIndices(); .

 

 

Si consiglia di utilizzare prima il NormalGenerator, poi lo Stripifier.

Per recuperare la geometria vera e propria, per farla referenziare da uno o più oggetti visuali Shape3D (con il metodo setGeometry di Shape3D) utilizzare:

oggettoShape3D.setGeometry(mioGI.getGeometryArray());

 

 

 

 

 

 

con 'oggettoShape3D' un oggetto di tipo Shape3D e 'mioGI' un oggetto di tipo GeometryInfo.

 

 

GEOMETRY INFO: UN ESEMPIO

File sorgente dell'esempio: 'Esempio GeometryInfo.java'.

Qui di seguito viene descritto cosa mostra l'esempio e come realizza il risultato.

L'idea è quella di creare una geometria un pò complessa, che richiami quella di un'automobile (ma ad un livello di dettaglio basso !).

Il profilo dell'auto possiamo definirlo come nella figura seguente.

Java 3D Profilo auto

Impostiamo quindi le coordinate per un lato dell'auto, mantenendo il valore di Z fisso.

Scegliamo, come coordinate dei vertici della figura che descrive il profilo dell'auto, i seguenti valori:

(10f, 0f, 0f);

(5f, 0f, 0f);

(3f, 2f, 0f);

(0f, 2f, 0f);

(2f, 0f, 0f);

(7f, 0f, 0f);

(9f, 2f, 0f);

(12f, 2f, 0f);

(14f, 0f, 0f);

(19f, 0f, 0f);

(19f, 2f, 0f);

(12f, 5f, 0f);

(7f, 10f, 0f);

(0f, 10f, 0f);

(5f, 5f, 0f);

(10f, 5f, 0f);

(10f, 0f, 0f).

Gli stessi valori possono essere utilizzati per definire le coordinate dei vertici per l'altro lato dell'auto, cambiando la coordinata Z in, ad esempio, 10 (dunque l'auto sarà 'larga 10').

Nel file d'esempio vi sono, inoltre, quattro valori in più, utilizzati per definire i vertici che costituiscono il paraurti anteriore.

Potete provare a definire i vertici per ricoprire tutto il modello, per fare pratica.

Impostiamo quindi il numero di vertici per strip (che sono tre: i due lati e il paraurti anteriore):

 

int[] stripCount = {17, 17, 4}; .

 

 

A questo punto seguono i passi necessari per creare un GeometryInfo, passandogli le coordinate dei vertici e lo stripCount; bisognerà, poi, richiamare il NormalGenerator e lo Stripifier.

E' da osservare come non stiamo definendo esplicitamente le connessioni tra i vertici, nè stiamo dando indicazioni di sorta a GeometryInfo su come crearle.

L'output a video dell'applicazione in esecuzione ci mostra, comunque, come tali connessioni siano state create (figura seguente).

Java 3D Immagine Geometry Info 1

NOTA: vediamo la visualizzazione struttura (wireframe) per via di come  è stata impostata la modalità di resa dei poligoni, 'LINE', cioè appunto i segmenti, per mettere in evidenza il lavoro fatto da GeometryInfo; per visualizzare le facce piene, sostituire 'LINE' con 'FILL'.

GeometryInfo ha svolto per noi un bel pò di lavoro, creando 'al meglio' (Java 3D non ci dice comunque come, con che algoritmo) le connessioni tra i vertici.

Java 3D Immagine GeometryInfo 2

 

 

 

 
Vai all'inizio della pagina