Vai al contenuto
kira14

Esportare Una Scena Da Maya

Recommended Posts

Ciao a tutti!

premetto che so poco di c e ancora meno di openGL, quindi mi servirà tutta la vostra pazienza e puntigliosità nelle spiegazioni *_*

Vi spiego brevemente: io ho una serie di scene in maya con oggetti poligonali, sto scrivendo un programma in c usando visual studio 2005; da quanto ho capito girando un po' è che devo esportare i modelli nel formato *.obj e non so come, utilizzando openGL, riesco ad importarle. Ecco, qualcuno mi sa dire un po' meglio come devo fare???

Ho dato un'occhiata veloce ai tutorial di NeHe e in altri siti ma non mi pare di aver trovato quello che mi serve... consigli???

grazie!!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

ti serve un parser.

si tratta di un pezzo di codice che legge i file di un qualche tipo e converte i dati in un formato utile alla sintassi delle openGL che, immagino saprai, sono delle librerie grafiche in RT.

quindi questo parser, che scriverai tu o linkerai come libreria esterna, estrapola ad esempio le coordinate dei vertici come terne di numeri in virgola mobile, e li passa ad una primitiva glTriangle(x, y, z). ovviamente un oggetto è un array di triangoli.

così poi per le normali ai vertici, per le chiamate ai materiali ecc ecc.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Qui -> http://www.wotsit.org/list.asp?fc=2

trovi tutte le specifiche di molti file usati per la grafica 3d, tra cui l'Obj (73 pagine). C'è anche un file di esempio per un semplice loader.

In pratica guardi l'esempio o la documentazione e ti fai un parser tutto tuo e dal file devi ricavare vertici, poligoni e normali e se vuoi puoi leggere anche i file mtl per prendere le proprietà del materiale.

Per esportare gli obj da maya devi abilitare l'esporter dal plugin manager.

@marisaliBox: glTriangle? o.O


Modificato da ilmale

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

mmm ok... questa era l'idea generale che mi ero già fatta su come procedere.. il problema è mettere in pratica tutto ciò :S

provo a guardarmi quel link sperando di capirci qualcosa! grazie ^_^


Modificato da kira14

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
mmm ok... questa era l'idea generale che mi ero già fatta su come procedere.. il problema è mettere in pratica tutto ciò :S

eh....lo so, non è affatto immediato.

ma se cerchi con google "parser" trovi molti siti tra cui i gamedev che trattano ampiamente del tema.

divertiti :D

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
@marisaliBox: glTriangle? o.O

si perchè?

io ho usato un parser 3ds ma concettualmente è la stessa cosa.

legge il ramo del 3ds e idividua per ogni oggetto il suo numero di poligoni. quindi attraverso un loop legge tutte le coordinate dei vertici in quel ramo e le immagazzina come array di triangoli (attraverso il glTriangle)

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Ah, l'hai chiamata primitiva e pensavo seriamente di essermi perso una primitiva di openGL e poi ho visto che non esiste glTriangle in openGL e anche se esisteste non gli dovresti passare solo tre cordinate.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

ho provato a far andare il programma di esempio che c'era nel link ma mi da i seguenti errori quando eseguo di debug:

1) Impossibile avviare il programma c:\...\Projects\leggo_obj\debug\leggo_obj.exe

2) error LNK2019: riferimeto al simbolo esterno _main non risolto nella funzione ___tmainCRTStartup ->File: MSVCRTD.lib

3) fatal error LNK1120: 1 esterni non risolti

:( cosa mi manca??? che è sta roba???

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Beh, manca il main..

#include <pappapronta.h>

#include "objfile.h"

#include <iostream>


using namespace std;


extern int numobjects;

extern OBJECT *gameobject[MAX_GAME_OBJECTS];


extern void LoadObj(char *);


int main()

{

	LoadObj("tree1.obj");


	int i = 0;

	cout << "Numero oggetti " << numobjects << endl;

	while(i < numobjects)

	{

		cout << "Numero facce " << gameobject[i]->numfaces << endl;

		cout << "Numero Vertici " << gameobject[i]->numverts  << endl;

		i++;

	}


	return 0;

}

che comunque non farebbe niente, al massimo di tice dove sono i vertici.

Quello è un programmino di esempio per vedere come si parsano i file obj non un parser effettivo.

Per farci qualcosa di utile devi fare un parser tutto tuo.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

:| il main :| cavolooooo

XD non ci posso credere sono troppo fusa! :P lo dicevo che mi serviva tutta la vostra pazienza e puntigliosità!!!


Modificato da kira14

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
poi ho visto che non esiste glTriangle in openGL

si scusa ho fatto confusione dato che non tocco più quei tipi di codice da anni.

la sintassi è

glBegin(GL_TRIANGLES);

glVertex3f(x, y, z);

glVertex3f(x, y, z);

glVertex3f(x, y, z);

glEnd();

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

mi potreste dire cosa fa esattamente questo codice?

nel file objfile.h

typedef struct

{   

	int numfaces;

	int numverts;

	FACE *faces[MAX_FACES];

	VERTEX *vertices[MAX_VERTICES];


}OBJECT;


nel file .cpp


OBJECT *gameobject[MAX_GAME_OBJECTS];


void LoadObj(char *filename)

{

	int i;

	OBJECT *newobject;


if((stream = fopen( filename, "r+t" )) != NULL ) 

	{

		CountObjects();

		for (i=numobjects - objectsInFile;i<numobjects;i++) {

			newobject = (OBJECT *)malloc(sizeof(OBJECT));

			gameobject[i] = newobject;

[...il codice continua...]

esattamente in queste due righe cosa fa?

newobject = (OBJECT *)malloc(sizeof(OBJECT));

gameobject = newobject;

alloca la memoria per quanto è grande l'object, ma in gameobject non ho capito cosa inserisce, l'indirizzo??

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

No no, newobject contiene il puntatore, è pure dichiarato come puntatore non potrebbe contenere l'oggetto. Inoltre la malloc ritorna puntatori

newobject = (OBJECT *)malloc(sizeof(OBJECT));
alloca la memoria per contenere l'oggetto e assegna il puntatore a newobject
gameobject[i] = newobject;

memorizza il puntatore nell'array.

Comunque consiglio spassionato. Guardando quel codice devo dire che è scritto in uno stile di programmazione ormai vecchio, sarebbe molto meglio riscriverselo tutto in C++ con le classi, fai prima, lo integri meglio in un progetto e il codice diventa più leggibile.

Una cosa bruttissima che vedo per esempio è l'allocazione statica delle facce e dei vertici.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

hehe! non è ancora a livelli che meritano di essere visti in pubblico :P

sono ancora agli inizi, ma finalmente ho ottenuto risultati esatti! appena avrò una cosa decente da far vedere, non mancherò di postare!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora

  • Navigazione recente   0 utenti

    Non ci sono utenti registrati da visualizzare in questa pagina.

×