PDA

Visualizza la versione completa : [C++] Importazione di file Mesh 3D (Collada)


giuseppe500
27-09-2008, 11:04
Ciao,
Ho Sto creando un importatore da un formato di descrizione
di mesh 3d (COLLADA).
l'importatore segue un "percorso" a seconda dei parametri
del tipo di file che trova:
Un file collada ad es puo' essere a triangoli o a poligoni.
Se il file che trova č di tipo triangoli eseguirā alcune
funzioni , se č di tipo poligoni ne eseguirā altre, ma
l'importante secondo me č che il resto delle funzioni non
cambiano.

Ho pensato quindi di partire da una classe generica di
importazione CBaseCollada , divisa per sezioni:


class CBaseCollada
{
CImporterTypeBase m_import;
void importVertex();
void importFace();
void importNormals();
void importMaterials();

}

ecc....


class CImporterTypeBase
{
virtual void GetVertex() {}
}

class CImporterTriangle:CImporterTypeBase
{
void getVertex()
{
COLLADA::Triangles.Get(
ecc....
}
}

class CImporterPoly:CImporterTypeBase
{
void getVertex()
{
COLLADA::Polys.Get(
ecc....
}
}

ImportVertex()
{
m_import->GetVertex(.....
}

m_import puo' essere di tipo triangle o poly a seconda
del tipo di file che si trova ,quindi per polimorfismo
runtime l'importatore eseguirā la funzione relativa.

Pensavo che pero' il file puo' essere di tipo diverso anche
a seconda del tipo di normali che trova:

quindi potro' avere un file del tipo:
1)Triangolare , normali Vertex
2)Triangolare , normali Face

3)Poly , normali Vertex
4)Poly , normali Face

e cosi' via con un esponenziale crescita del tipo di file.

Vorrei creare un metodo di composizione , tipo mattoncini
della classe di importazione , la prima cosa che mi
viene in mente č di utilizzare qualcosa del tipo:

CImporterTypeBaseVertex m_importVertex // puo' essere poly o triangular;
CImporterTypeBaseNormals m_importNormals;//puo' essere vertex o face

e cosi via ,e di andare a incapsulare la classe relativa
leggendo le proprietā del tipo di file.
In modo da comporre l'importatore.
VOi cosa mi consigliate?

XWolverineX
27-09-2008, 13:02
Ciao!
Anche io ho sviluppato un importer collada, anche se incompleto.
Stai usando Collada_DOM o usi un generico parser XML?

L'approccio č buono, anche se io ho preferito usare il metodo "spaghetti" perchč il formato č lento giā di per se ne caricamento.

shodan
27-09-2008, 14:21
Puoi vedere se il pattern composite fa al caso tuo.

giuseppe500
27-09-2008, 15:52
Devo ammettere che sarebbe un metodo notevole.
Devo pero ' mettere a posto le idee , se mi aiuti un po' č meglio:

Per creare una struttura ad albero (quindi un percorso di importazione) va benissimo , il problema č che tutti gli oggetti dovrebbero implementare la stessa interfaccia base(Sbaglio?).
In un importatore ogni fase ha dei dati restituiti diversi , e quindi non va molto bene.
Ho pensato pero' che si puo' "condividere" (non so quale metodo č il migliore) la classe di dati che si vuole costruire tra tutti gli oggetti della gerarichia di importazione in modo che ogni foglia della gerarichia vada a modificare la struttura dati condivisa(che ha un interfaccia generica) , ad es aggiungendo vertici o facce ecc... e scorrendo ad es l'albero e invocando un metodo execute ogni foglia in pratica fa la sua operazioncina sulla struttura dati fino a completare l'albero ottenendo una struttura dati completa.

L'aspetto che mi piace meno pero' č che il metodo execute deve essere autonomo , nel senso che deve svolgere un ruolo "atomico" che non dipende da niente ,solo dalla gerarchia di importazione.

Si puo' fare?
ciao.

giuseppe500
28-09-2008, 01:24
sono solo fantasie?

giuseppe500
06-11-2008, 10:09
ok ragazzi,erano solo fantasie.

Umilmente ho riguardato il composite e vorrei chiedere:
Portando all'estremo :Perchč usare il pattern composite e non una serie di if che chiamano funzioni diverse?
Che vantaggi da?
Grazie.

Loading