Struttura dati per un solido poliedrico

Note integrative al corso di Grafica Interattiva, corso di Laurea in Informatica, nuovo ordinamento.
A cura di Paola Magillo, DISI, Universita' degli Studi di Genova.

Scopo

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.

Formato di memorizzazione

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:

Per convenzione, se il solido ha N vertici, il primo vertice della lista ha indice 0 e l'ultimo N-1.

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.

Formato del file

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".

Se N e' il numero totale di vertici, l'indice 0 denota il primo vertice che compare nel file e l'indice N-1 denota l'ultimo.

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.

Funzioni disponibili

La classe C++ che implementa il solido fornisce funzioni pubbliche per:

Estensioni

Nel corso del laboratorio guidato sara' necessario aggiungere alla classe nuove variabili e funzioni, per esempio: