Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
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!!

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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


Edited by ilmale

Share this post


Link to post
Share on other sites

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 ^_^


Edited by kira14

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
@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)

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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???

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

:| il main :| cavolooooo

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


Edited by kira14

Share this post


Link to post
Share on other sites
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();

Share this post


Link to post
Share on other sites

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??

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...
Aspetta! x

Ti piacerebbe rimanere sempre aggiornato sulle ultime novità nel campo della computer grafica?

Iscrivendoti alla Newsletter riceverai subito una mail con le indicazioni per scaricare gratuitamente:

  1. Le immagini HDRI presenti su HDRI pro
  2. Una sequenza di 300 immagini HDRI generata da Luca Deriu tramite il programma Real HDR