PDA

View Full Version : [C++ - OpenGL] Importare modelli 3D ?


ZJack
10-04-2010, 17:37
Salve a tutti, avevo intenzione di realizzare un videogioco molto molto essenziale con l'ausilio di C e librerie OpenGL.
Ho già provato a fare piccoli esperimenti con le OpenGL, prendendo degli esempi da un sito ( http://nehe.gamedev.net/ ). Ora non so quanto sia "buona" come fonte, e non so neanche se faccia codice buttato lì senza criterio, però sono riuscito a capirlo ed a creare qualcosa di mio.
Quello che vorrei cercare di capire: è possibile realizzare un piccolo gioco di automobili in questo modo ? ( tempo circa 1 mese o 2) Il gioco sarebbe molto semplice, una visuale dall'interno ( dove prendo un modello 3D che simula l'interno dell'auto ) , una "piattaforma" con la pista ed il paesaggio, ed il cielo.
Non mi serve qualcosa di realistico, quindi per curvare ad esempio farei semplicemente ruotare il modello dell'auto dall'asse e la telecamera (poi penso siano cose da provare ).
Però il mio principale problema è: Come posso fare per importare un modello 3D realizzato con altri software nel programma? Ho cercato come importare un .3ds, ma ho trovato solo software a pagamento... ( Come programma per realizzare i modelli userei Blender ).
Sapreste darmi qualche dritta ? E' realizzabile oppure no ? E' tempo buttato ?

Grazie mille in anticipo :D

insane74
10-04-2010, 17:51
http://www.ogre3d.org/

direi che con questo fai tutto. ;)

javaboy
10-04-2010, 23:08
E' pieno di risorse in rete su come importare modelli 3d di qualsiasi specie in opengl. Alla fine un file contenente un modello 3d non contiene altro che vertici, normali, coordinate delle texture etc. Devi solo capire come è fatto il formato che ti interessa e scrivere il codice è banale......

Se ho un attimo provo ad aiutarti nella ricerca.

Comunque ti sconsiglio di utilizzare opengl per questo genere di progetti, rischi di perdere un sacco di tempo. Molto meglio le directX, in directX importare un modello è cosa banale.

Anche utilizzare una librerie come Ogre non è male come idea.

fero86
11-04-2010, 01:53
E' realizzabile oppure no ? E' tempo buttato ? se é realizzabile o se é tempo buttato dipende solo da te: quanto sei bravo con la grafica 3D? e quanto sei bravo a programmare? creare un videogame é il sogno di moltissimi programmatori, ma la stragrande maggioranza di essi fallisce quando si rende conto che, anche se per loro scrivere codice é gratis per quanto lo fanno bene, l'artwork non sanno proprio dove andare a pescarlo.

comunque, venendo al problema principale: il formato Wavefront é documentato pubblicamente, piuttosto semplice da interpretare, ed é supportato da molti programmi di grafica 3D tra cui anche Blender. ecco le specifiche:
http://local.wasp.uwa.edu.au/~pbourke/dataformats/obj/
http://local.wasp.uwa.edu.au/~pbourke/dataformats/mtl/

il formato ti permette di memorizzare le mesh comprensive di vettori normali e texture coordinates e anche le informazioni sui materiali, comprensive di texture e colori vari. (per le informazioni sul materiale vedi il secondo link, i materiali si mettono in un file a parte)

purtroppo con questo formato non ti é possibile memorizzare animazioni, quindi o lasci i tuoi oggetti completamente statici oppure provvedi ad animarli con altri mezzi.

ultima questione: i tutorial di NeHe ormai sono vecchi, usano quasi tutti la cosiddetta fixed-function pipeline; oggi la fixed-function pipeline non si usa piu, si programma a shaders. il problema di OpenGL é che é scarsamente documentato, se inizi adesso a studiare ci metterai una vita ad imparare ad usarlo in maniera ortodossa. forse faresti meglio a seguire il consiglio che ti é giá stato dato, cioé usare DirectX, al quale rilancio addirittura con XNA.

ZJack
11-04-2010, 17:49
Grazie a tutti per le risposte, terrò sicuramente in considerazione i vostri consigli.
Riguardo l'utilizzare Ogre3D dovrei provarlo e vedere come mi trovo; ho trovato anche un altro motore che si chiama Irrlicht che sembra molto cononsciuto.

Invece per quanto riguarda XNA e DirectX dite che da questo sito potrei ricavarci qualcosa http://www.wilez.it/tutorials/XNA/ ? ( saltando ovviamente tutte le parti dove spiega la programmazione pura )
Utilizzando queste 2 risorse posso importare file con modelli 3D in modo semplice ad esempio tramite funzioni preimpostate? Del tipo : < import("i.3ds",x=12,y=0,z=1); > ?

E per il fatto del "realizzabile o no" mi interessava saperlo perché vorrei portarlo all'esame di maturità di perito informatico. Dato che i tempi stringono devo decidermi in fretta.

Grazie ancora per le risposte :) .

javaboy
11-04-2010, 18:56
Irrlicht non è un granchè, ogre è più completo ma più complesso.
Le directX ti permettono di importare un modello in maniera banale ma non sono comunque semplici, forse xna è la soluzione migliore.
Potresti pure usare un engine come unity, sicuramente è la soluzione migliore per creare qualcosa in breve tempo ma ti lascia poco da programmare, puoi fare quasi tutto in maniera visuale e per il resto usi javascript.

ZJack
12-04-2010, 20:13
Sinceramente odio Javascript, quindi penso che non prenderò neanche in considerazione quella soluzione, ma grazie lo stesso per l'idea.

Ora avrei bisogno solo di qualche conferma su XNA come scritto nel mio ultimo post prima di valutare. Qualcuno saprebbe rispondermi ?

Grazie :) .

Tommo
12-04-2010, 20:51
Beh XNA è un wrapper allo stesso livello di DirectX, non è un motore grafico... quindi se vuoi pasticciare a basso livello senza rischi (è managed) vai sul sicuro.
Solo non ti aspettare alcun concetto astratto...

Ogre invece è il contrario; è complesso e di alto livello come concetti: implementa materiali, compositors, animazioni, ombre, culling, la gestione delle risorse, tutta roba parecchio cazzuta da farsi a mano partendo da una API.
Però è più difficile nella misura che trovi difficile C++.

Sinceramente ti consiglio di partire da Ogre, perchè se fai un motore senza prima vedere "come lo fanno i pro" viene un'accozzaglia che rovescia modelli a schermo.
Sicuramente si vedrà la macchina, si vedrà il cielo, ma non so quanto ti potrebbe essere utile a lungo termine ;)

@fero86: sinceramente mi sa che vince male usare un formato standard all'inizio (e anche dopo) soprattutto se pensato per il rendering offline... sono enormemente più difficili da leggere, creano importers complessi, ma mancano anche di parecchie features necessarie ad un videogioco come la leggerezza, le animazioni, parametri preconfezionati per gli shaders (Normal, binormal, etc) che poi vanno messi a mano.
Dovessi farlo, credo che la soluzione migliore sarebbe fare un bel bitdump dei campi dato della classe Mesh, per poi creare un importer da un qualche altro formato di modellazione...

PS: Sui VG il forum che ho in firma ti potrebbe essere utile :D

fero86
13-04-2010, 16:54
@fero86: sinceramente mi sa che vince male usare un formato standard all'inizio (e anche dopo) soprattutto se pensato per il rendering offline... sono enormemente più difficili da leggere, creano importers complessi, ma mancano anche di parecchie features necessarie ad un videogioco come la leggerezza, le animazioni, parametri preconfezionati per gli shaders (Normal, binormal, etc) che poi vanno messi a mano.
Dovessi farlo, credo che la soluzione migliore sarebbe fare un bel bitdump dei campi dato della classe Mesh, per poi creare un importer da un qualche altro formato di modellazione... infatti hanno un fracco di aspetti negativi (a parte la questione del "rendering offline" come lo chiami tu, non mi risulta che il gioco che ZJack deve realizzare debba prelevare il materiale online, magari deve ma non mi sembra che l'abbia specificato) rispetto ad un tuo formato binario e ad hoc, ma sono l'unico modo di interagire coi programmi che deve usare per creare gli oggetti tridimensionali, come Blender. altrimenti potrebbe (credo) scrivere un plugin per Blender che gli permetta di salvare nel formato che piu gli piace ma ritengo che sia piu semplice scrivere un parser per Wavefront.

Tommo
13-04-2010, 18:15
Si a un certo punto dovrai per forza scrivere qualcosa che legga un formato esterno... ma il vantaggio viene dalla libertà di avere un formato interno adatto a come lo usi te per i calcoli più comuni, oltre al fatto che l'exporter lo puoi sviluppare come applicazione esterna e non sporca il codice "più importante".

E poi anche se non ci ho mai guardato, ho l'impressione che fare un exporter per Blender in Python sia massicciamente più facile che fare un importer da .lwo in C++...
Nel primo caso devi scrivere in un formato semplice di testo (il tuo) a partire da dati in memoria già organizzati (da blender) nel secondo devi organizzare dati in memoria a partire da un formato binario complesso e proprietario.
Fai un pò te ;)

PS: con rendering offline intendevo "non realtime", quindi CG.

ZJack
13-04-2010, 20:33
Ok grazie per i consigli :D . Al momento sto provando ad utilizzare Ogre ( anche se ho dei problemi :eh: , ma al momento non ho il tempo per risolverli).
Per Ogre mi pare di aver trovato da qualche parte nel sito un Exporter per trasformare i file di Blender in un formato compatibile con Ogre.

Scriverò aggiornamenti o (in caso di problemi più seri e poco inerenti col titolo del post ) un altro thread con " i problemi del momento ".

Grazie ancora per l'aiuto :D .

ZJack
02-05-2010, 17:25
Dopo un po' di indecisione e dopo aver passato un po' di tempo a cercare di installare Ogre3D con scarsi risultati, ho scoperto Panda3D. Nonostante non sembri qualcosa di "potente" penso vada benissimo per il mio scopo ( mi pare di aver letto che lo usano in qualche scuola per far prendere confidenza con programmazione e grafica.. ).
Oltretutto sembra anche molto immediato e, soprattutto, sono riuscito ad installarlo senza problemi :D .