Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Lightmaps En 3dxmax

Iniciado por DraKKaR, 13 de Noviembre de 2003, 12:22:14 AM

« anterior - próximo »

DraKKaR

 ¿Alguno de vosotros ha sido capaz de exportar los lightmaps que te genera el MAX junto con las coordenadas de textura para cada vértice desde el 3dsmax a algun formato?

Haddd

 Berserker me pasó un ejemplo. Yo también lo probe y me funcionó, es fácil. Pero ahora no recuerdo como lo hice  :huh: , pero ya te digo , tiene que ser muy fácil si lo saque yo a la primera (ole)  

DraKKaR

 ¿Alguno de vosotros 2 (Berserker y tú) todavía teneis ese código fuente? Me gustaría echarle una ojeada. ¿Era código fuente e C++, o era maxscript?

Haddd

 No, segúia la ayuda del MAX!!! No hay que programar nada!!

BeRSeRKeR

 Creo que ha habido un malentendido. Yo lo que le pasé a Haddd fue una escena de un objeto con un lightmap aplicado pero nada de código de exportación.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

MChiz

 uhm... como que no hay que programar nada? Por eso me estuve yo como 2 semanas con el MaxScript dandole caña al tema? ^_^
Supongo que lo que hacias, Haddd, era hacer la textura tan grande como lo requeria el lightmap, replicando ( si estaba tileada, por ejemplo ) el mapa difuso, no? Porque si no no lo pillo...

Saludotes!

DraKKaR

 Para que nos entendamos: tengo un plugin que me exporta la geometría del mapa y me gustaría saber como puedo hacer para (desde el código fuente) exportar los lightmaps y las coordenadas de textura del lightmap. Eso es lo que busco, por huevos hay que programar algo.

MChiz: podrías dejarme echar una ojeada a ese script? me interesa sobremanera.


Estoy organizando mi motor a base de namespaces para tenerlo mejor estructurado, pero me parece que más que eso lo que se consigue es complicar su uso. ¿Me recomendáis seguir organizándolo en namespaces o mejor que no?

MChiz

 Siento mucho no poder dejarte el script. Lo he hecho en horas de trabajo y pertenece a la empresa : (, pero puedo intentar ayudarte si quieres. En realidad no es dificil. Simplemente tienes que leer el canal de mapeado donde este el lightmap ( creo que el habitual es el numero 3 ) y luego exportar la textura como cualquier otra. Lo unico que es un coñazo pasar de la forma como lo tiene organizado el MAX a otra que la entienda GL o D3D.

Sobre lo de los namespaces, no he visto mucha gente que lo use. Yo lo uso en uno o dos sitios de mi motor, aunque no creo que yo sea un buen ejemplo a seguir :b

Un saludote y suerte con los lightmaps!

Ithaqua

 Los lightmaps de MAX no están como tal en los fuentes de export por ejemplo, pero no hay nada que no solucione un buceo por la ayuda, las cabeceras del maxsdk o fuentes de ejemplo de otro tipo.
Supongo que te refieres a los lightmaps que genera el menú "render to texture" del Max.
Te pongo aquí algo del código que necesitarás usar. Supongo que también le servirá a más gente.


// Dado un nodo (INode*) obtenemos el material:

Mtl* pMaxMaterial = pMaxNode->GetMtl();

// El material en caso de tener lightmap "render to texture" será del tipo BAKE_SHELL_CLASS_ID
// Su submaterial 0 será un material standard y el submaterial 1 otro que contendrá el lightmap
// en el slot self-illumination.
// Obvio aquí el código en caso de que no sea un material con lightmap (p.ej un StdMat* normal).

StdMat *pMaxStandardMtl = NULL; // El tuyo, que tiene la textura diffuse generalmente
StdMat *pMaxBakedMtl      = NULL; // El que añade MAX, con el lightmap

if(pMaxMaterial->ClassID() == Class_ID(BAKE_SHELL_CLASS_ID, 0))
{
               pMaxStandardMtl = (StdMat *)pMaxMaterial->GetSubMtl(0);
               pMaxBakedMtl      = (StdMat *)pMaxMaterial->GetSubMtl(1);
}

// Ahora ya tenemos los materiales, con ellos obtenemos los ficheros de textura
// y algunos interfaces de dónde obtener información interesante.
// El lightmap como dije está en el slot self-illumination del submaterial 1

Texmap* pMaxTexmap = pMaxBakedMtl->GetSubTexmap(ID_SI);

if(pMaxTexmap->ClassID() == Class_ID(BMTEX_CLASS_ID, 0)) // Bitmap
{
               BitmapTex* pMaxBitmapTex = (BitmapTex*)pMaxTexmap;
               Bitmap*       pMaxBitmap      = pMaxBitmapTex->GetBitmap(0);
               StdUVGen*  pMaxUVGen      = pMaxBitmapTex->GetUVGen();

               BitmapInfo bi = pMaxBitmap->Storage()->bi;

               // bi.Name() tiene el full path de la textura.
               // bi.Filename() solamente el fichero de la textura, sin el path.

               // En pMaxUVGen->GetCoordMapping(0) se te indica si tienes que usar
               // algún método de generación de coordenadas de mapeado (spheremap p.ej)
               // o por contra tienes que usar las coordenadas de mapeado del objeto (explicit)

               // Importante!! En pMaxUVGen->GetMapChannel() se te da el índice del canal
               // de mapeado que tienes que pillar del objeto para exportar las u,v de este
               // material (si se indicó explicit en la comprobación anterior).
               // No supongas ningún canal por defecto como dice Micho, coge el índice de aquí.

               // Para más info de qué exportar aquí mira los interfaces a los que he accedido.
}


Esa sería una parte capada de lo que tendrías que hacer a la hora de procesar el material. Falta la parte dedicada a exportar el mapeado de un objeto que tiene este material.

// Dado el mismo nodo anterior, lo evaluamos al final de la pipeline:

ObjectState os = pMaxNode->EvalWorldState(0);

// Aquí habría que realizar una comprobación para coger el TriObject, lo obvio.

TriObject *pTriObject = (TriObject *)os.obj->ConvertToType(0, Class_ID(TRIOBJ_CLASS_ID, 0));

// Obtenemos el mesh

Mesh *pMaxMesh = &pTriObject->GetMesh();

// Ahora ya podemos acceder al mapeado. En el caso del lightmap si definimos nMapChannel como
// el valor obtenido en el material con pMaxUVGen->GetCoordMapping(0):

nMapChannel = ...

pMaxMesh->getNumMapVerts(nMapChannel); // nº de coordenadas de mapeado
pMaxMesh->mapVerts(nMapChannel);             // Array de coordenadas de mapeado
pMaxMesh->mapFaces(nMapChannel);            // Array de de caras para el mapeado


Ale, eso debería ser más que suficiente para que puedas hacer algo. Revisa algún que otro thread sobre consolidación de malla que ha habido ya en stratos, ya que ahora te tocará pringar con la parte de "¿Y que pasa si el nº de coordenadas de mapeado no coincide con el nº de vértices?" y preguntas parecidas.

Espero que te haya sido de ayuda. Saludos,

       Ithaqua.


P.D Debes de crear una lista neta de materiales antes de exportar la escena (ya que muchos objetos pueden compartir un mismo material), y luego ya procesar todos los objetos para exportarlos, así como exportar la lista de materiales. Tampoco he puesto ese código.
thaqua^Stravaganza
http://ithaqua.stravaganza.org

DraKKaR

 ¡Muchas gracias Itaqua! Tu código me será sumamente útil  a la hora de exportar los lightmaps, ahora solo tengo que descubrir como decirle al 3dsmax que me genere los lightmaps!. Es decir, mi exportador le dirá al MAX que genere los lightmaps (no uno por objeto, sino a ser posible por material) y  que después se exporte, de forma que el usuario no tenga que toquetear nada del render to texture.

japito

 En 3dpoder hay un videotuto (hecho por mí  (ole) ) sobre lightmapping
ww.vstudios.tk
(asco de lycos!)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.