Una classe capace di leggere un solido a facce poligonali da file e memorizzarlo. Il fine sara' poi la resa grafica del solido in OpenGL.
Il solido e' un insieme di facce poligonali, ciascuna delle
quali puo' avere un numero arbitrario di vertici.
Ogni vertice e' una terna di coordinate cartesiane x,y,z.
Un vertice puo' apparire, e di norma appare, in piu' facce. Per evitare di ripetere le sue coordinate tante volte quante sono le facce in cui compare, memorizziamo le facce in formato indicizzato:
La struttura dati per il solido consiste in:
class Solid { public: int vert_num, face_num; float * x; float * y; float * z; struct OneFace * faces; ... };
La struttura dati per la faccia a sua volta consiste in:
struct OneFace { unsigned int v_count; unsigned int * v_array; };
Gli indici dei vertici dell'i-esima faccia del solido si trovano in
faces[i].v_array[v] per v=0..faces[i].v_count-1.
Le coordinate di questi vertici (es: la x) si trovano in
x[faces[i].v_array[v]] per v=0..faces[i].v_count-1.
Il formato del file ricalca la memorizzazione interna indicizzata. E' simile al formato usato nello standard VRML (Virual Reality Modeling Language) per un "indexed face set".
E' importante in vista della resa grafica con illuminazione che i vertici delle facce siano ordinati in senso antiorario rispetto ad un osservatore che guarda il solido dall'esterno.
E' possibile generare file in questo formato convertendo file VRML che contengono indexed face set oppure crearli a mano. Fare attenzione a scrivere i vertici delle facce con il giusto orientamento.
La classe C++ che implementa il solido fornisce funzioni pubbliche per:
Nel corso del laboratorio guidato sara' necessario aggiungere alla classe nuove variabili e funzioni, per esempio: